| #------------------------------------------------------------------------------------------------------- |
| # Copyright (C) Microsoft. All rights reserved. |
| # Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. |
| #------------------------------------------------------------------------------------------------------- |
| |
| # Finalize Build Script |
| # |
| # This script is run as the final step in a build definition |
| # to clean up and produce metadata about the build. |
| |
| param ( |
| [Parameter(Mandatory=$True)] |
| [ValidateSet("x86", "x64", "arm", "arm64")] |
| [string]$arch, |
| |
| [Parameter(Mandatory=$True)] |
| [ValidateSet("debug", "release", "test", "codecoverage")] |
| [string]$flavor, |
| |
| [ValidateSet("default", "codecoverage", "pogo")] |
| [string]$subtype = "default", |
| |
| $corePathSegment = "", # e.g. "core" |
| |
| [string]$destinationBase = $Env:DropPath |
| ) |
| |
| . $PSScriptRoot\pre_post_util.ps1 |
| |
| $sourcesDir, $_, $_, $_ = ` |
| ComputePaths ` |
| -arch $arch -flavor $flavor -subtype $subtype -OuterScriptRoot $PSScriptRoot |
| |
| $coreSourcesDir = Join-Path $sourcesDir $corePathSegment |
| |
| $buildName = ConstructBuildName -arch $arch -flavor $flavor -subtype $subtype |
| |
| # |
| # Copy all logs to DropPath |
| # |
| |
| $logBase = Join-Path $destinationBase "logs" |
| $buildlogsDropPath = Join-Path $logBase "buildlogs" |
| $logsDropPath = Join-Path $logBase "logs" |
| $testlogsDropPath = Join-Path $logBase "testlogs" |
| |
| New-Item -Force -ItemType Directory -Path $buildlogsDropPath |
| New-Item -Force -ItemType Directory -Path $logsDropPath |
| New-Item -Force -ItemType Directory -Path $testlogsDropPath |
| |
| $buildlogsSourcePath = Join-Path $Env:BinariesDirectory "buildlogs" |
| $logsSourcePath = Join-Path $Env:BinariesDirectory "logs" |
| $testlogsSourcePath = Join-Path $Env:BinariesDirectory "testlogs" |
| |
| if (Test-Path $buildlogsSourcePath) { |
| Copy-Item -Verbose -Recurse -Force (Join-Path $buildlogsSourcePath "*") $buildlogsDropPath |
| } |
| if (Test-Path $logsSourcePath) { |
| Copy-Item -Verbose -Recurse -Force (Join-Path $logsSourcePath "*") $logsDropPath |
| } |
| if (Test-Path $testlogsSourcePath) { |
| Copy-Item -Verbose -Recurse -Force (Join-Path $testlogsSourcePath "*") $testlogsDropPath |
| } |
| |
| # |
| # Create build status JSON file for this flavor. |
| # |
| |
| $buildErrFile = Join-Path $buildLogsDropPath "build.${buildName}.err" |
| $testSummaryFile = Join-Path $testLogsDropPath "summary.${arch}${flavor}.log" |
| |
| # if build.*.err contains any text then there were build errors |
| $BuildSucceeded = $true |
| if (Test-Path $buildErrFile) { |
| # build errors file has non-zero length iff the build failed |
| $BuildSucceeded = (Get-Item $buildErrFile).length -eq 0 |
| } |
| |
| # if summary.*.err contains any text then there were test failures |
| $TestsPassed = $true |
| if (Test-Path $testSummaryFile) { |
| # summary file has non-zero length iff the tests failed |
| $TestsPassed = (Get-Item $testSummaryFile).length -eq 0 |
| } |
| |
| $Status = "passed" |
| if ((-not $BuildSucceeded) -or (-not $TestsPassed)) { |
| $Status = "failed" |
| } |
| |
| $buildFlavorJsonFile = Join-Path $logBase "${Env:BuildName}.json" |
| $buildFlavorJson = New-Object System.Object |
| |
| $buildFlavorJson | Add-Member -type NoteProperty -name buildName -value $Env:BuildName |
| $buildFlavorJson | Add-Member -type NoteProperty -name status -value $Status |
| $buildFlavorJson | Add-Member -type NoteProperty -name BuildSucceeded -value $BuildSucceeded |
| $buildFlavorJson | Add-Member -type NoteProperty -name testsPassed -value $TestsPassed |
| $buildFlavorJson | Add-Member -type NoteProperty -name arch -value $Env:BuildPlatform |
| $buildFlavorJson | Add-Member -type NoteProperty -name flavor -value $Env:BuildConfiguration |
| $buildFlavorJson | Add-Member -type NoteProperty -name subtype -value $Env:BuildSubtype |
| |
| $buildFlavorJson | ConvertTo-Json | Write-Output |
| $buildFlavorJson | ConvertTo-Json | Out-File $buildFlavorJsonFile -Encoding utf8 |
| |
| # |
| # Copy outputs to metadata directory |
| # |
| |
| $metadataDir = Join-Path $coreSourcesDir "metadata" |
| New-Item -Force -ItemType Directory -Path $metadataDir |
| |
| Copy-Item -Verbose -Force (Join-Path $sourcesDir "ComputedEnvironment.cmd") $metadataDir |
| Copy-Item -Verbose -Force (Join-Path $coreSourcesDir "Build\scripts\compose_build.ps1") $metadataDir |
| Copy-Item -Verbose -Force (Join-Path $Env:BinariesDirectory "change.json") $metadataDir |
| Copy-Item -Verbose -Force (Join-Path $Env:BinariesDirectory "change.txt") $metadataDir |
| Copy-Item -Verbose -Force $buildFlavorJsonFile $metadataDir |
| |
| # Search for *.nuspec files and copy them to $metadataDir |
| Get-ChildItem -Path (Join-Path $sourcesDir "Build") "*.nuspec" ` |
| | ForEach-Object { Copy-Item -Verbose -Force $_.FullName $metadataDir } |
| |
| # |
| # Copy binaries directory |
| # |
| |
| $BinFolder = Join-Path $Env:BinariesDirectory "bin\${Env:BuildName}" |
| $BinDropPath = Join-Path $destinationBase "bin" |
| Write-Output "Copying `"$BinFolder`" to `"$BinDropPath`"..." |
| md $BinDropPath |
| Get-ChildItem -Path $BinFolder -Recurse | |
| where {$_.FullName -notmatch ".*_ttdlog.*" } | |
| Copy-Item -Verbose -Force -Destination { |
| if ($_.PSIsContainer) { |
| Join-Path $BinDropPath $_.Parent.FullName.Substring($BinFolder.length) |
| } else { |
| Join-Path $BinDropPath $_.FullName.Substring($BinFolder.length) |
| } |
| } |
| |
| # |
| # Copy POGO directory if present for this build |
| # |
| |
| $PogoFolder = Join-Path $Env:BinariesDirectory "bin\${Env:BuildType}_pogo" |
| if (Test-Path $PogoFolder) { |
| $PogoBinDropPath = Join-Path $destinationBase "bin_pogo" |
| Write-Output "Copying `"$PogoFolder`" to `"$PogoBinDropPath`"..." |
| Write-Output "##vso[task.setvariable variable=VSO_POGOPresent;]true" |
| Copy-Item -Verbose $PogoFolder $PogoBinDropPath -Recurse -Force |
| } |