From d60947e9a672b5bbf3236e2a31ec41a7ffeabba8 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Fri, 29 May 2020 11:19:47 -0700 Subject: [PATCH 1/4] Collect CLR traces during Windows daily test run --- .vsts-ci/windows-daily.yml | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/.vsts-ci/windows-daily.yml b/.vsts-ci/windows-daily.yml index 80a8723f920..362f8f03325 100644 --- a/.vsts-ci/windows-daily.yml +++ b/.vsts-ci/windows-daily.yml @@ -74,6 +74,26 @@ stages: displayName: 'Capture Artifacts Directory' continueOnError: true + - pwsh: | + $capRootDir = Join-Path ([System.IO.Path]::GetTempPath()) "CAP" + $capUtilDir = Join-Path $capRootDir "Utils" + + if (Test-Path $capRootDir) { Remove-Item $capRootDir -Recurse -Force } + New-Item $capUtilDir -ItemType Directory > $null + + $capZipFile = Join-Path $capRootDir "cap.zip" + Invoke-WebRequest -Uri https://pscoretestdata.blob.core.windows.net/dotnet-cap/windows.zip -OutFile $capZipFile + Unblock-File -Path $capZipFile + Expand-Archive -Path $capZipFile -DestinationPath $capUtilDir -Force + + Write-Host "=== Capture CAP Util Directory ===" + Get-ChildItem $capUtilDir -Recurse + + Send-VstsCommand "vso[task.setvariable variable=CapRootDir]$capRootDir" + Send-VstsCommand "vso[task.setvariable variable=CapUtilDir]$capUtilDir" + displayName: 'Download CAP package' + condition: succeededOrFailed() + # must be run frow Windows PowerShell - powershell: | Import-Module .\tools\ci.psm1 @@ -90,6 +110,13 @@ stages: displayName: 'Unzip Build' condition: succeeded() + - pwsh: | + Import-Module $(CapUtilDir)\CAPService.psm1 + $dataDir = Start-TraceCollection -RootDir $(CapRootDir) + Send-VstsCommand "vso[task.setvariable variable=CapDataDir]$dataDir" + displayName: 'Start CLR Trace Collection' + condition: succeeded() + - pwsh: | Import-Module .\tools\ci.psm1 Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' @@ -125,6 +152,17 @@ stages: displayName: Verify xUnit Test Results condition: succeededOrFailed() + - pwsh: | + $capDataDir = '$(CapDataDir)' + $capModuleFile = '$(CapUtilDir)\CAPService.psm1' + + if ((Test-Path $capModuleFile) -and (Test-Path $capDataDir)) { + Import-Module $capModuleFile + Stop-TraceCollection -DataDir $capDataDir -RepoRoot $pwd + } + displayName: 'Upload CLR Trace' + condition: always() + - stage: PackagingWin displayName: Packaging for Windows jobs: From 9e6f63e734d9fd9c0df0d7530dc51dda7529ff93 Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Fri, 29 May 2020 13:47:59 -0700 Subject: [PATCH 2/4] Fix setting vsts variable --- .vsts-ci/windows-daily.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.vsts-ci/windows-daily.yml b/.vsts-ci/windows-daily.yml index 362f8f03325..65bae08e495 100644 --- a/.vsts-ci/windows-daily.yml +++ b/.vsts-ci/windows-daily.yml @@ -89,8 +89,8 @@ stages: Write-Host "=== Capture CAP Util Directory ===" Get-ChildItem $capUtilDir -Recurse - Send-VstsCommand "vso[task.setvariable variable=CapRootDir]$capRootDir" - Send-VstsCommand "vso[task.setvariable variable=CapUtilDir]$capUtilDir" + Write-Host "##vso[task.setvariable variable=CapRootDir]$capRootDir" + Write-Host "##vso[task.setvariable variable=CapUtilDir]$capUtilDir" displayName: 'Download CAP package' condition: succeededOrFailed() @@ -113,7 +113,7 @@ stages: - pwsh: | Import-Module $(CapUtilDir)\CAPService.psm1 $dataDir = Start-TraceCollection -RootDir $(CapRootDir) - Send-VstsCommand "vso[task.setvariable variable=CapDataDir]$dataDir" + Write-Host "##vso[task.setvariable variable=CapDataDir]$dataDir" displayName: 'Start CLR Trace Collection' condition: succeeded() From 536a62fd389cfb5716cc2cfe1bab616ecd9c683f Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Mon, 1 Jun 2020 14:38:33 -0700 Subject: [PATCH 3/4] Change Linux daily CI to run tests in a single agent --- .vsts-ci/linux-daily.yml | 154 ++++++++++++++++++++++++++ .vsts-ci/windows-daily.yml | 214 ++++++++++++++++++------------------- 2 files changed, 261 insertions(+), 107 deletions(-) create mode 100644 .vsts-ci/linux-daily.yml diff --git a/.vsts-ci/linux-daily.yml b/.vsts-ci/linux-daily.yml new file mode 100644 index 00000000000..8c251f09972 --- /dev/null +++ b/.vsts-ci/linux-daily.yml @@ -0,0 +1,154 @@ +name: PR-$(System.PullRequest.PullRequestNumber)-$(Date:yyyyMMdd)$(Rev:.rr) +trigger: + # Batch merge builds together while a merge build is running + batch: true + branches: + include: + - master + - release* + - feature* + paths: + include: + - '*' + exclude: + - /.vsts-ci/misc-analysis.yml + - /.github/ISSUE_TEMPLATE/* + - /.dependabot/config.yml +pr: + branches: + include: + - master + - release* + - feature* + paths: + include: + - '*' + exclude: + - tools/releaseBuild/* + - tools/releaseBuild/azureDevOps/templates/* + - /.vsts-ci/misc-analysis.yml + - /.github/ISSUE_TEMPLATE/* + - /.dependabot/config.yml + +variables: + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + POWERSHELL_TELEMETRY_OPTOUT: 1 + # Avoid expensive initialization of dotnet cli, see: https://donovanbrown.com/post/Stop-wasting-time-during-NET-Core-builds + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 + __SuppressAnsiEscapeSequences: 1 + +resources: +- repo: self + clean: true + +stages: +- stage: BuildLinux + displayName: Build for Linux + jobs: + - template: templates/ci-build.yml + parameters: + pool: ubuntu-16.04 + jobName: linux_build + displayName: linux Build + +- stage: TestLinux + displayName: Test for Linux + jobs: + - job: linux_test + pool: + vmImage: ubuntu-16.04 + displayName: Linux Test + + steps: + - pwsh: | + Get-ChildItem -Path env: + displayName: Capture Environment + condition: succeededOrFailed() + + - task: DownloadBuildArtifacts@0 + displayName: 'Download Build Artifacts' + inputs: + downloadType: specific + itemPattern: | + build/**/* + xunit/**/* + downloadPath: '$(System.ArtifactsDirectory)' + + - pwsh: | + Get-ChildItem "$(System.ArtifactsDirectory)\*" -Recurse + displayName: 'Capture Artifacts Directory' + continueOnError: true + + - pwsh: | + Import-Module .\tools\ci.psm1 + Invoke-CIInstall -SkipUser + displayName: Bootstrap + condition: succeededOrFailed() + + - pwsh: | + Import-Module .\build.psm1 + Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' + $output = (Get-PSOptions).Output + $rootPath = Split-Path (Split-Path $output) + Expand-Archive -Path '$(System.ArtifactsDirectory)\build\build.zip' -DestinationPath $rootPath -Force + + ## Fix permissions + Get-ChildItem $rootPath -Recurse | ForEach-Object { + if ($_ -is [System.IO.DirectoryInfo]) { + chmod +rwx $_.FullName + } else { + chmod +rw $_.FullName + } + } + chmod a+x $output + displayName: 'Unzip Build and Fix Permissions' + condition: succeeded() + + - pwsh: | + Import-Module .\tools\ci.psm1 + Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' + Invoke-CITest -Purpose UnelevatedPesterTests -TagSet CI + displayName: Test - UnelevatedPesterTests - CI + condition: succeeded() + + - pwsh: | + Import-Module .\tools\ci.psm1 + Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' + Invoke-CITest -Purpose ElevatedPesterTests -TagSet CI + displayName: Test - ElevatedPesterTests - CI + condition: succeededOrFailed() + + - pwsh: | + Import-Module .\tools\ci.psm1 + Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' + Invoke-CITest -Purpose UnelevatedPesterTests -TagSet Others + displayName: Test - UnelevatedPesterTests - Others + condition: succeededOrFailed() + + - pwsh: | + Import-Module .\tools\ci.psm1 + Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' + Invoke-CITest -Purpose ElevatedPesterTests -TagSet Others + displayName: Test - ElevatedPesterTests - Others + condition: succeededOrFailed() + + - pwsh: | + Import-Module .\build.psm1 + $xUnitTestResultsFile = "$(System.ArtifactsDirectory)\xunit\xUnitTestResults.xml" + Test-XUnitTestResults -TestResultsFile $xUnitTestResultsFile + displayName: Verify xUnit Test Results + condition: succeededOrFailed() + +- stage: CodeCovTestPackage + displayName: CodeCoverage and Test Packages + dependsOn: [] # by specifying an empty array, this stage doesn't depend on the stage before it + jobs: + - job: CodeCovTestPackage + displayName: CodeCoverage and Test Packages + pool: + vmImage: ubuntu-16.04 + steps: + - pwsh: | + Import-Module .\tools\ci.psm1 + New-CodeCoverageAndTestPackage + displayName: CodeCoverage and Test Package diff --git a/.vsts-ci/windows-daily.yml b/.vsts-ci/windows-daily.yml index 65bae08e495..14500b1df75 100644 --- a/.vsts-ci/windows-daily.yml +++ b/.vsts-ci/windows-daily.yml @@ -55,113 +55,113 @@ stages: displayName: Windows Test steps: - - pwsh: | - Get-ChildItem -Path env: - displayName: 'Capture Environment' - condition: succeededOrFailed() - - - task: DownloadBuildArtifacts@0 - displayName: 'Download Build Artifacts' - inputs: - downloadType: specific - itemPattern: | - build/**/* - xunit/**/* - downloadPath: '$(System.ArtifactsDirectory)' - - - pwsh: | - Get-ChildItem "$(System.ArtifactsDirectory)\*" -Recurse - displayName: 'Capture Artifacts Directory' - continueOnError: true - - - pwsh: | - $capRootDir = Join-Path ([System.IO.Path]::GetTempPath()) "CAP" - $capUtilDir = Join-Path $capRootDir "Utils" - - if (Test-Path $capRootDir) { Remove-Item $capRootDir -Recurse -Force } - New-Item $capUtilDir -ItemType Directory > $null - - $capZipFile = Join-Path $capRootDir "cap.zip" - Invoke-WebRequest -Uri https://pscoretestdata.blob.core.windows.net/dotnet-cap/windows.zip -OutFile $capZipFile - Unblock-File -Path $capZipFile - Expand-Archive -Path $capZipFile -DestinationPath $capUtilDir -Force - - Write-Host "=== Capture CAP Util Directory ===" - Get-ChildItem $capUtilDir -Recurse - - Write-Host "##vso[task.setvariable variable=CapRootDir]$capRootDir" - Write-Host "##vso[task.setvariable variable=CapUtilDir]$capUtilDir" - displayName: 'Download CAP package' - condition: succeededOrFailed() - - # must be run frow Windows PowerShell - - powershell: | - Import-Module .\tools\ci.psm1 - Invoke-CIInstall - displayName: Bootstrap - condition: succeededOrFailed() - - - pwsh: | - Import-Module .\build.psm1 - Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' - $path = Split-Path -Parent (Get-PSOutput -Options (Get-PSOptions)) - $rootPath = Split-Path -Path $path - Expand-Archive -Path '$(System.ArtifactsDirectory)\build\build.zip' -DestinationPath $rootPath -Force - displayName: 'Unzip Build' - condition: succeeded() - - - pwsh: | - Import-Module $(CapUtilDir)\CAPService.psm1 - $dataDir = Start-TraceCollection -RootDir $(CapRootDir) - Write-Host "##vso[task.setvariable variable=CapDataDir]$dataDir" - displayName: 'Start CLR Trace Collection' - condition: succeeded() - - - pwsh: | - Import-Module .\tools\ci.psm1 - Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' - Invoke-CITest -Purpose UnelevatedPesterTests -TagSet CI - displayName: Test - UnelevatedPesterTests - CI - condition: succeeded() - - - pwsh: | - Import-Module .\tools\ci.psm1 - Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' - Invoke-CITest -Purpose ElevatedPesterTests -TagSet CI - displayName: Test - ElevatedPesterTests - CI - condition: succeededOrFailed() - - - pwsh: | - Import-Module .\tools\ci.psm1 - Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' - Invoke-CITest -Purpose UnelevatedPesterTests -TagSet Others - displayName: Test - UnelevatedPesterTests - Others - condition: succeededOrFailed() - - - pwsh: | - Import-Module .\tools\ci.psm1 - Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' - Invoke-CITest -Purpose ElevatedPesterTests -TagSet Others - displayName: Test - ElevatedPesterTests - Others - condition: succeededOrFailed() - - - pwsh: | - Import-Module .\build.psm1 - $xUnitTestResultsFile = "$(System.ArtifactsDirectory)\xunit\xUnitTestResults.xml" - Test-XUnitTestResults -TestResultsFile $xUnitTestResultsFile - displayName: Verify xUnit Test Results - condition: succeededOrFailed() - - - pwsh: | - $capDataDir = '$(CapDataDir)' - $capModuleFile = '$(CapUtilDir)\CAPService.psm1' - - if ((Test-Path $capModuleFile) -and (Test-Path $capDataDir)) { - Import-Module $capModuleFile - Stop-TraceCollection -DataDir $capDataDir -RepoRoot $pwd - } - displayName: 'Upload CLR Trace' - condition: always() + - pwsh: | + Get-ChildItem -Path env: + displayName: 'Capture Environment' + condition: succeededOrFailed() + + - task: DownloadBuildArtifacts@0 + displayName: 'Download Build Artifacts' + inputs: + downloadType: specific + itemPattern: | + build/**/* + xunit/**/* + downloadPath: '$(System.ArtifactsDirectory)' + + - pwsh: | + Get-ChildItem "$(System.ArtifactsDirectory)\*" -Recurse + displayName: 'Capture Artifacts Directory' + continueOnError: true + + - pwsh: | + $capRootDir = Join-Path ([System.IO.Path]::GetTempPath()) "CAP" + $capUtilDir = Join-Path $capRootDir "Utils" + + if (Test-Path $capRootDir) { Remove-Item $capRootDir -Recurse -Force } + New-Item $capUtilDir -ItemType Directory > $null + + $capZipFile = Join-Path $capRootDir "cap.zip" + Invoke-WebRequest -Uri https://pscoretestdata.blob.core.windows.net/dotnet-cap/windows.zip -OutFile $capZipFile + Unblock-File -Path $capZipFile + Expand-Archive -Path $capZipFile -DestinationPath $capUtilDir -Force + + Write-Host "=== Capture CAP Util Directory ===" + Get-ChildItem $capUtilDir -Recurse + + Write-Host "##vso[task.setvariable variable=CapRootDir]$capRootDir" + Write-Host "##vso[task.setvariable variable=CapUtilDir]$capUtilDir" + displayName: 'Download CAP package' + condition: succeededOrFailed() + + # must be run frow Windows PowerShell + - powershell: | + Import-Module .\tools\ci.psm1 + Invoke-CIInstall + displayName: Bootstrap + condition: succeededOrFailed() + + - pwsh: | + Import-Module .\build.psm1 + Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' + $path = Split-Path -Parent (Get-PSOutput -Options (Get-PSOptions)) + $rootPath = Split-Path -Path $path + Expand-Archive -Path '$(System.ArtifactsDirectory)\build\build.zip' -DestinationPath $rootPath -Force + displayName: 'Unzip Build' + condition: succeeded() + + - pwsh: | + Import-Module $(CapUtilDir)\CAPService.psm1 + $dataDir = Start-TraceCollection -RootDir $(CapRootDir) + Write-Host "##vso[task.setvariable variable=CapDataDir]$dataDir" + displayName: 'Start CLR Trace Collection' + condition: succeeded() + + - pwsh: | + Import-Module .\tools\ci.psm1 + Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' + Invoke-CITest -Purpose UnelevatedPesterTests -TagSet CI + displayName: Test - UnelevatedPesterTests - CI + condition: succeeded() + + - pwsh: | + Import-Module .\tools\ci.psm1 + Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' + Invoke-CITest -Purpose ElevatedPesterTests -TagSet CI + displayName: Test - ElevatedPesterTests - CI + condition: succeededOrFailed() + + - pwsh: | + Import-Module .\tools\ci.psm1 + Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' + Invoke-CITest -Purpose UnelevatedPesterTests -TagSet Others + displayName: Test - UnelevatedPesterTests - Others + condition: succeededOrFailed() + + - pwsh: | + Import-Module .\tools\ci.psm1 + Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json' + Invoke-CITest -Purpose ElevatedPesterTests -TagSet Others + displayName: Test - ElevatedPesterTests - Others + condition: succeededOrFailed() + + - pwsh: | + Import-Module .\build.psm1 + $xUnitTestResultsFile = "$(System.ArtifactsDirectory)\xunit\xUnitTestResults.xml" + Test-XUnitTestResults -TestResultsFile $xUnitTestResultsFile + displayName: Verify xUnit Test Results + condition: succeededOrFailed() + + - pwsh: | + $capDataDir = '$(CapDataDir)' + $capModuleFile = '$(CapUtilDir)\CAPService.psm1' + + if ((Test-Path $capModuleFile) -and (Test-Path $capDataDir)) { + Import-Module $capModuleFile + Stop-TraceCollection -DataDir $capDataDir -RepoRoot $pwd + } + displayName: 'Upload CLR Trace' + condition: always() - stage: PackagingWin displayName: Packaging for Windows From 254c923c23961d93b5342b117e8ab9bf5b357cbb Mon Sep 17 00:00:00 2001 From: Dongbo Wang Date: Mon, 1 Jun 2020 17:25:28 -0700 Subject: [PATCH 4/4] Capture the unzipped build directory --- .vsts-ci/linux-daily.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.vsts-ci/linux-daily.yml b/.vsts-ci/linux-daily.yml index 8c251f09972..6ab1832dfd9 100644 --- a/.vsts-ci/linux-daily.yml +++ b/.vsts-ci/linux-daily.yml @@ -101,6 +101,9 @@ stages: } } chmod a+x $output + + Write-Host "=== Capture Unzipped Directory ===" + Get-ChildItem $rootPath -Recurse displayName: 'Unzip Build and Fix Permissions' condition: succeeded()