Skip to content

Commit 1f114aa

Browse files
brettfobaronfel
authored andcommitted
add CI leg to verify assemblies aren't unnecessarily being rebuilt (#6816)
1 parent 4bfcdc1 commit 1f114aa

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

azure-pipelines.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,19 @@ jobs:
233233
- script: eng\CIBuild.cmd -configuration Release -noSign /p:DotNetBuildFromSource=true /p:FSharpSourceBuild=true
234234
displayName: Build
235235

236+
# Up-to-date
237+
- job: UpToDate_Windows
238+
pool:
239+
vmImage: windows-2019
240+
steps:
241+
- checkout: self
242+
clean: true
243+
- task: PowerShell@2
244+
displayName: Run up-to-date build check
245+
inputs:
246+
filePath: eng\tests\UpToDate.ps1
247+
arguments: -configuration $(_BuildConfig) -ci -binaryLog
248+
236249
#---------------------------------------------------------------------------------------------------------------------#
237250
# FCS builds #
238251
#---------------------------------------------------------------------------------------------------------------------#

eng/tests/UpToDate.ps1

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# This script verifies that subsequent calls to `Build.cmd` don't cause assemblies to be unnecessarily rebuilt.
2+
3+
[CmdletBinding(PositionalBinding=$false)]
4+
param (
5+
[string][Alias('c')]$configuration = "Debug",
6+
[parameter(ValueFromRemainingArguments=$true)][string[]]$properties
7+
)
8+
9+
Set-StrictMode -version 2.0
10+
$ErrorActionPreference = "Stop"
11+
12+
try {
13+
$RepoRoot = Join-Path $PSScriptRoot ".." | Join-Path -ChildPath ".." -Resolve
14+
$BuildScript = Join-Path $RepoRoot "Build.cmd"
15+
16+
# do first build
17+
& $BuildScript -configuration $configuration @properties
18+
if ($LASTEXITCODE -ne 0) {
19+
Write-Host "Error running first build."
20+
exit 1
21+
}
22+
23+
# gather assembly timestamps
24+
$ArtifactsBinDir = Join-Path $RepoRoot "artifacts" | Join-Path -ChildPath "bin" -Resolve
25+
$FSharpAssemblyDirs = Get-ChildItem -Path $ArtifactsBinDir -Filter "FSharp.*"
26+
$FSharpAssemblyPaths = $FSharpAssemblyDirs | ForEach-Object { Get-ChildItem -Path (Join-Path $ArtifactsBinDir $_) -Recurse -Filter "$_.dll" } | ForEach-Object { $_.FullName }
27+
28+
$InitialAssembliesAndTimes = @{}
29+
foreach ($asm in $FSharpAssemblyPaths) {
30+
$LastWriteTime = (Get-Item $asm).LastWriteTimeUtc
31+
$InitialAssembliesAndTimes.Add($asm, $LastWriteTime)
32+
}
33+
34+
$InitialCompiledCount = $FSharpAssemblyPaths.Length
35+
36+
# build again
37+
& $BuildScript -configuration $configuration @properties
38+
if ($LASTEXITCODE -ne 0) {
39+
Write-Host "Error running second build."
40+
exit 1
41+
}
42+
43+
# gather assembly timestamps again
44+
$FinalAssembliesAndTimes = @{}
45+
foreach ($asm in $FSharpAssemblyPaths) {
46+
$LastWriteTime = (Get-Item $asm).LastWriteTimeUtc
47+
$FinalAssembliesAndTimes.Add($asm, $LastWriteTime)
48+
}
49+
50+
# validate that assembly timestamps haven't changed
51+
$RecompiledFiles = @()
52+
foreach ($asm in $InitialAssembliesAndTimes.keys) {
53+
$InitialTime = $InitialAssembliesAndTimes[$asm]
54+
$FinalTime = $FinalAssembliesAndTimes[$asm]
55+
if ($InitialTime -ne $FinalTime) {
56+
$RecompiledFiles += $asm
57+
}
58+
}
59+
60+
$RecompiledCount = $RecompiledFiles.Length
61+
Write-Host "$RecompiledCount of $InitialCompiledCount assemblies were re-compiled"
62+
$RecompiledFiles | ForEach-Object { Write-Host " $_" }
63+
exit $RecompiledCount
64+
}
65+
catch {
66+
Write-Host $_
67+
Write-Host $_.Exception
68+
Write-Host $_.ScriptStackTrace
69+
exit 1
70+
}

0 commit comments

Comments
 (0)