From 958d83d80dd65f5947e89c2d081e8bd789c245db Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Wed, 5 Apr 2023 15:46:07 -0700 Subject: [PATCH 01/20] Always release to vcpkg daily branch --- eng/pipelines/templates/stages/archetype-cpp-release.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/eng/pipelines/templates/stages/archetype-cpp-release.yml b/eng/pipelines/templates/stages/archetype-cpp-release.yml index 61c13206ae..fd9ac9c850 100644 --- a/eng/pipelines/templates/stages/archetype-cpp-release.yml +++ b/eng/pipelines/templates/stages/archetype-cpp-release.yml @@ -241,7 +241,14 @@ stages: - ${{if eq(variables['System.TeamProject'], 'internal') }}: - stage: Integration dependsOn: ${{ parameters.DependsOn }} - condition: and(succeeded(), or(eq(variables['PublishDailyVcpkg'], 'true'), eq(variables['Build.Reason'],'Schedule'))) + condition: >- + and( + succeededOrFailed(), + or( + eq(variables['PublishDailyVcpkg'], 'true'), + eq(variables['Build.Reason'],'Schedule') + ) + ) jobs: - job: PublishDailyVcpkg displayName: Publish to vcpkg daily branch From f63c1c04d1aabf49f56197f7f6c25b0a769fa6f4 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Mon, 10 Apr 2023 13:31:22 -0700 Subject: [PATCH 02/20] Test running after specific matrix entry --- eng/pipelines/templates/jobs/archetype-sdk-client.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-client.yml index e3cd4dfed7..a75ff2da9b 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -65,6 +65,16 @@ jobs: PreTestSteps: ${{ parameters.PreTestSteps }} PostTestSteps: ${{ parameters.PostTestSteps }} + - job: RunAfterSpecificMatrixEntry + pool: + name: azsdk-pool-mms-ubuntu-2204-general + vmImage: ubuntu-20.04 + + dependsOn: 'Validate Ubuntu22_included' + + steps: + - pwsh: Write-Host 'Hello world' + # Disable build for cpp - client - ${{ if ne(parameters.ServiceDirectory, 'not-specified' )}}: - ${{ each artifact in parameters.Artifacts }}: From 0fdd3cb692cf4cdb25eddef86427edbbc21a0d20 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Mon, 10 Apr 2023 13:45:43 -0700 Subject: [PATCH 03/20] Try dictionary accessor for dependencies status --- eng/pipelines/templates/jobs/archetype-sdk-client.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-client.yml index a75ff2da9b..792a3b26ad 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -70,7 +70,8 @@ jobs: name: azsdk-pool-mms-ubuntu-2204-general vmImage: ubuntu-20.04 - dependsOn: 'Validate Ubuntu22_included' + dependsOn: Validate + condition: eq(dependencies['Validate Ubuntu22_included'].result, 'succeeded') steps: - pwsh: Write-Host 'Hello world' From 8eabf6722a85c2ea238af28fe47ed40584b89c7d Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Mon, 10 Apr 2023 13:51:18 -0700 Subject: [PATCH 04/20] dependsOn without quotes --- eng/pipelines/templates/jobs/archetype-sdk-client.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-client.yml index 792a3b26ad..5bef8ef97c 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -70,8 +70,7 @@ jobs: name: azsdk-pool-mms-ubuntu-2204-general vmImage: ubuntu-20.04 - dependsOn: Validate - condition: eq(dependencies['Validate Ubuntu22_included'].result, 'succeeded') + dependsOn: Validate Ubuntu22_included steps: - pwsh: Write-Host 'Hello world' From d9d1a8df88fe13e926bb872bd0f5e8cbdc795705 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Mon, 10 Apr 2023 13:54:14 -0700 Subject: [PATCH 05/20] dot syntax --- eng/pipelines/templates/jobs/archetype-sdk-client.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-client.yml index 5bef8ef97c..58d50cd483 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -70,7 +70,8 @@ jobs: name: azsdk-pool-mms-ubuntu-2204-general vmImage: ubuntu-20.04 - dependsOn: Validate Ubuntu22_included + dependsOn: Validate + condition: eq(dependencies.'Validate Ubuntu22_included'.result, 'succeeded') steps: - pwsh: Write-Host 'Hello world' From 792d97e948f325be477efa76b0dd534e6193db98 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Mon, 10 Apr 2023 15:57:57 -0700 Subject: [PATCH 06/20] Check success of matrix job at runtime --- .../stages/archetype-cpp-release.yml | 15 ++++- eng/scripts/Test-JobSucceeded.Tests.ps1 | 60 +++++++++++++++++++ eng/scripts/Test-JobSucceeded.ps1 | 52 ++++++++++++++++ 3 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 eng/scripts/Test-JobSucceeded.Tests.ps1 create mode 100644 eng/scripts/Test-JobSucceeded.ps1 diff --git a/eng/pipelines/templates/stages/archetype-cpp-release.yml b/eng/pipelines/templates/stages/archetype-cpp-release.yml index fd9ac9c850..63cf7fe5cb 100644 --- a/eng/pipelines/templates/stages/archetype-cpp-release.yml +++ b/eng/pipelines/templates/stages/archetype-cpp-release.yml @@ -243,9 +243,9 @@ stages: dependsOn: ${{ parameters.DependsOn }} condition: >- and( - succeededOrFailed(), + succeededOrFailed(), or( - eq(variables['PublishDailyVcpkg'], 'true'), + eq(variables['PublishDailyVcpkg'], 'true'), eq(variables['Build.Reason'],'Schedule') ) ) @@ -259,6 +259,17 @@ stages: steps: - checkout: self + + - task: PowerShell@2 + displayName: Ensure ubuntu22_included job succeeded + inputs: + targetType: file + filePath: eng/scripts/Test-JobSucceeded.ps1 + arguments: >- + -JobNames 'Validate ubuntu22_included' + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + - download: current artifact: packages diff --git a/eng/scripts/Test-JobSucceeded.Tests.ps1 b/eng/scripts/Test-JobSucceeded.Tests.ps1 new file mode 100644 index 0000000000..771a96b11d --- /dev/null +++ b/eng/scripts/Test-JobSucceeded.Tests.ps1 @@ -0,0 +1,60 @@ +Describe 'Test Test-JobSucceeded.ps1' { + + BeforeAll { + function testScript ($jobNames) { + . $PSScriptRoot/Test-JobSucceeded.ps1 ` + -JobNames $jobNames ` + -Project 'testProject' ` + -Org 'testOrg' ` + -BuildId '123' ` + -AccessToken 'testToken' + } + } + + It 'Fails on non-200 response' { + Mock -CommandName Invoke-RestMethod -MockWith { throw 'Error' } + + { testScript -jobNames TestJob } | Should -Throw + } + + It 'Fails on invalid response' { + Mock -CommandName Invoke-RestMethod -MockWith { @{ invalidObject = "hello" } } + + { testScript -jobNames TestJob } | Should -Throw + } + + It 'Fails on missing job' { + Mock -CommandName Invoke-RestMethod -MockWith { @{ records = @(@{ name = "not-TestJob" }) } } + + testScript -jobNames TestJob + $LASTEXITCODE | Should -Not -Be 0 + } + + It 'Fails on one matching failing job' { + Mock -CommandName Invoke-RestMethod -MockWith { @{ records = @(@{ name = "TestJob"; result = "failed"; attempt = 1 }) } } + + testScript -jobNames TestJob + $LASTEXITCODE | Should -Not -Be 0 + } + + It 'Succeeds on one matching succeeded job' { + Mock -CommandName Invoke-RestMethod -MockWith { @{ records = @(@{ name = "TestJob"; result = "succeeded"; attempt = 1 }) } } + + testScript -jobNames TestJob + $LASTEXITCODE | Should -Be 0 + } + + It 'Succeeds on two matching jobs with last one succeeding' { + Mock -CommandName Invoke-RestMethod -MockWith { @{ records = @(@{ name = "TestJob"; result = "failed"; attempt = 1 }, @{ name = "TestJob"; result = "succeeded"; attempt = 2 }) } } + + testScript -jobNames TestJob + $LASTEXITCODE | Should -Be 0 + } + + It 'Fails on two matching jobs with both failing' { + Mock -CommandName Invoke-RestMethod -MockWith { @{ records = @(@{ name = "TestJob"; result = "failed"; attempt = 1 }, @{ name = "TestJob"; result = "failed"; attempt = 2 }) } } + + testScript -jobNames TestJob + $LASTEXITCODE | Should -Not -Be 0 + } +} \ No newline at end of file diff --git a/eng/scripts/Test-JobSucceeded.ps1 b/eng/scripts/Test-JobSucceeded.ps1 new file mode 100644 index 0000000000..9cd41e5bf1 --- /dev/null +++ b/eng/scripts/Test-JobSucceeded.ps1 @@ -0,0 +1,52 @@ +param( + $JobNames, + $Project = $env:SYSTEM_TEAMPROJECT, + $Org = $env:SYSTEM_COLLECTIONID, + $BuildId = $env:BUILD_BUILDID, + $AccessToken = $env:SYSTEM_ACCESSTOKEN +) + +Set-StrictMode -Version 4.0 + +if (!($JobNames -is [array])) { + $JobNames = @($JobNames) +} + +$credential = New-Object System.Management.Automation.PSCredential ` + -ArgumentList "pat", (ConvertTo-SecureString $AccessToken -AsPlainText -Force) + +$buildTimeline = Invoke-RestMethod ` + -Method Get ` + -Authentication Basic ` + -Credential $credential ` + -Uri "https://dev.azure.com/$Org/$Project/_apis/build/builds/$BuildId/timeline?api-version=5.0" + +$hasError = $false + +foreach($jobName in $JobNames) { + $job = $buildTimeline.records ` + | Where-Object { $_.name -eq $jobName } + | Sort-Object -Property attempt -Descending + | Select-Object -First 1 + + if (!$job) { + $hasError = $true + Write-Host "Could not find matching job in timeline: $jobName" + continue + } + + if ($job.result -ne "succeeded") { + $hasError = $true + Write-Host "Job failed: $jobName" + } + + Write-Host "Job succeeded: $jobName" +} + +if ($hasError) { + Write-Host "Exiting with error" + exit 1 +} + +Write-Host "Evaluated jobs succeeded" +exit 0 \ No newline at end of file From a81d99ad931c3c2673148fbe383ea676b5659d16 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Mon, 10 Apr 2023 16:05:18 -0700 Subject: [PATCH 07/20] Revert test job --- eng/pipelines/templates/jobs/archetype-sdk-client.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-client.yml index 58d50cd483..e3cd4dfed7 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -65,17 +65,6 @@ jobs: PreTestSteps: ${{ parameters.PreTestSteps }} PostTestSteps: ${{ parameters.PostTestSteps }} - - job: RunAfterSpecificMatrixEntry - pool: - name: azsdk-pool-mms-ubuntu-2204-general - vmImage: ubuntu-20.04 - - dependsOn: Validate - condition: eq(dependencies.'Validate Ubuntu22_included'.result, 'succeeded') - - steps: - - pwsh: Write-Host 'Hello world' - # Disable build for cpp - client - ${{ if ne(parameters.ServiceDirectory, 'not-specified' )}}: - ${{ each artifact in parameters.Artifacts }}: From d23fb9c88d7f61f07a007a82cf245e499bbf5d3d Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Mon, 10 Apr 2023 22:09:16 -0700 Subject: [PATCH 08/20] filePath --- eng/pipelines/templates/stages/archetype-cpp-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/pipelines/templates/stages/archetype-cpp-release.yml b/eng/pipelines/templates/stages/archetype-cpp-release.yml index 63cf7fe5cb..9312c11131 100644 --- a/eng/pipelines/templates/stages/archetype-cpp-release.yml +++ b/eng/pipelines/templates/stages/archetype-cpp-release.yml @@ -263,7 +263,7 @@ stages: - task: PowerShell@2 displayName: Ensure ubuntu22_included job succeeded inputs: - targetType: file + targetType: filePath filePath: eng/scripts/Test-JobSucceeded.ps1 arguments: >- -JobNames 'Validate ubuntu22_included' From 7672847168344d78ad243c44013c6b32c5d7acd4 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Mon, 10 Apr 2023 22:41:32 -0700 Subject: [PATCH 09/20] Logging in DevOps --- eng/scripts/Test-JobSucceeded.ps1 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/eng/scripts/Test-JobSucceeded.ps1 b/eng/scripts/Test-JobSucceeded.ps1 index 9cd41e5bf1..262433ddde 100644 --- a/eng/scripts/Test-JobSucceeded.ps1 +++ b/eng/scripts/Test-JobSucceeded.ps1 @@ -21,6 +21,8 @@ $buildTimeline = Invoke-RestMethod ` -Credential $credential ` -Uri "https://dev.azure.com/$Org/$Project/_apis/build/builds/$BuildId/timeline?api-version=5.0" +Write-Host "URL: https://dev.azure.com/$Org/$Project/_apis/build/builds/$BuildId/timeline?api-version=5.0" + $hasError = $false foreach($jobName in $JobNames) { From eb1b3ea7b6f5dfcdd0dd443310a39015f428a5fe Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Tue, 11 Apr 2023 16:20:04 -0700 Subject: [PATCH 10/20] Use QuickValidate job --- .../templates/jobs/archetype-sdk-client.yml | 51 +++++++++++-------- eng/pipelines/templates/jobs/ci.tests.yml | 5 +- .../stages/archetype-cpp-release.yml | 12 +---- .../templates/stages/archetype-sdk-client.yml | 1 + .../stages/platform-matrix-quick.json | 22 ++++++++ .../templates/stages/platform-matrix.json | 1 - 6 files changed, 58 insertions(+), 34 deletions(-) create mode 100644 eng/pipelines/templates/stages/platform-matrix-quick.json diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-client.yml index e3cd4dfed7..0a325a20f3 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -41,29 +41,38 @@ parameters: - name: PostTestSteps type: stepList default: [] + - name: JobConfiguration + type: object + default: + - Name: Validate + Matrix: eng/pipelines/templates/stages/platform-matrix.json + - Name: QuickValidate + Matrix: eng/pipelines/templates/stages/platform-matrix-quick.json jobs: - - template: /eng/common/pipelines/templates/jobs/archetype-sdk-tests-generate.yml - parameters: - MatrixConfigs: - - Name: base - Path: eng/pipelines/templates/stages/platform-matrix.json - Selection: all - GenerateVMJobs: true - JobTemplatePath: /eng/pipelines/templates/jobs/ci.tests.yml - AdditionalParameters: - Artifacts: ${{ parameters.Artifacts }} - ServiceDirectory: ${{ parameters.ServiceDirectory }} - TestPipeline: ${{ parameters.TestPipeline }} - CtestRegex: ${{ parameters.CtestRegex }} - CtestExcludeRegex: ${{ parameters.CtestExcludeRegex }} - CoverageReportPath: ${{ parameters.CoverageReportPath }} - CoverageEnabled: ${{ parameters.CoverageEnabled }} - LineCoverageTarget: ${{ parameters.LineCoverageTarget }} - BranchCoverageTarget: ${{ parameters.BranchCoverageTarget }} - TestEnv: ${{ parameters.TestEnv }} - PreTestSteps: ${{ parameters.PreTestSteps }} - PostTestSteps: ${{ parameters.PostTestSteps }} + - ${{ each config in parameters.JobConfiguration }}: + - template: /eng/common/pipelines/templates/jobs/archetype-sdk-tests-generate.yml + parameters: + MatrixConfigs: + - Name: base + Path: ${{ config.Matrix}} + Selection: all + GenerateVMJobs: true + JobTemplatePath: /eng/pipelines/templates/jobs/ci.tests.yml + AdditionalParameters: + DisplayName: ${{ config.Name }} + Artifacts: ${{ parameters.Artifacts }} + ServiceDirectory: ${{ parameters.ServiceDirectory }} + TestPipeline: ${{ parameters.TestPipeline }} + CtestRegex: ${{ parameters.CtestRegex }} + CtestExcludeRegex: ${{ parameters.CtestExcludeRegex }} + CoverageReportPath: ${{ parameters.CoverageReportPath }} + CoverageEnabled: ${{ parameters.CoverageEnabled }} + LineCoverageTarget: ${{ parameters.LineCoverageTarget }} + BranchCoverageTarget: ${{ parameters.BranchCoverageTarget }} + TestEnv: ${{ parameters.TestEnv }} + PreTestSteps: ${{ parameters.PreTestSteps }} + PostTestSteps: ${{ parameters.PostTestSteps }} # Disable build for cpp - client - ${{ if ne(parameters.ServiceDirectory, 'not-specified' )}}: diff --git a/eng/pipelines/templates/jobs/ci.tests.yml b/eng/pipelines/templates/jobs/ci.tests.yml index f3e0d68127..6f88c95f52 100644 --- a/eng/pipelines/templates/jobs/ci.tests.yml +++ b/eng/pipelines/templates/jobs/ci.tests.yml @@ -52,11 +52,14 @@ parameters: - name: PostTestSteps type: stepList default: [] + - name: DisplayName + type: string + default: Validate jobs: - job: - displayName: "Validate" + displayName: ${{ parameters.DisplayName }} dependsOn: ${{ parameters.DependsOn }} condition: and(succeededOrFailed(), ne(variables['Skip.Test'], 'true'), ne(${{ parameters.Matrix }}, '{}')) strategy: diff --git a/eng/pipelines/templates/stages/archetype-cpp-release.yml b/eng/pipelines/templates/stages/archetype-cpp-release.yml index 9312c11131..1c45e54c3c 100644 --- a/eng/pipelines/templates/stages/archetype-cpp-release.yml +++ b/eng/pipelines/templates/stages/archetype-cpp-release.yml @@ -243,7 +243,7 @@ stages: dependsOn: ${{ parameters.DependsOn }} condition: >- and( - succeededOrFailed(), + eq(stageDependencies.Build.QuickValidate.result, 'Succeeded'), or( eq(variables['PublishDailyVcpkg'], 'true'), eq(variables['Build.Reason'],'Schedule') @@ -260,16 +260,6 @@ stages: steps: - checkout: self - - task: PowerShell@2 - displayName: Ensure ubuntu22_included job succeeded - inputs: - targetType: filePath - filePath: eng/scripts/Test-JobSucceeded.ps1 - arguments: >- - -JobNames 'Validate ubuntu22_included' - env: - SYSTEM_ACCESSTOKEN: $(System.AccessToken) - - download: current artifact: packages diff --git a/eng/pipelines/templates/stages/archetype-sdk-client.yml b/eng/pipelines/templates/stages/archetype-sdk-client.yml index 36a1ddd4d9..8c4cc5f4d7 100644 --- a/eng/pipelines/templates/stages/archetype-sdk-client.yml +++ b/eng/pipelines/templates/stages/archetype-sdk-client.yml @@ -130,6 +130,7 @@ stages: ServiceDirectory: ${{ parameters.ServiceDirectory }} DependsOn: - Build + # TODO: Don't depend on live tests in scheduled runs # Only depend on `LiveTest` if there are live tests to execute - ${{ if and(eq(variables['System.TeamProject'], 'internal'), ne(parameters.LiveTestCtestRegex, '')) }}: # Pulled from stages/archetype-sdk-tests.yml to generate 'LiveTest_' diff --git a/eng/pipelines/templates/stages/platform-matrix-quick.json b/eng/pipelines/templates/stages/platform-matrix-quick.json new file mode 100644 index 0000000000..1e1ad7190d --- /dev/null +++ b/eng/pipelines/templates/stages/platform-matrix-quick.json @@ -0,0 +1,22 @@ +{ + "displayNames": { + "_": "" + }, + "include": [ + { + "StaticConfigs": { + "Ubuntu22": { + "OSVmImage": "MMSUbuntu22.04", + "Pool": "azsdk-pool-mms-ubuntu-2204-general", + "VCPKG_DEFAULT_TRIPLET": "x64-linux", + "BuildArgs": "-j 10", + "RunProxyTests": true + } + }, + + "BuildSettings": { + "included": {} + } + } + ] +} \ No newline at end of file diff --git a/eng/pipelines/templates/stages/platform-matrix.json b/eng/pipelines/templates/stages/platform-matrix.json index ca333afeb7..e0ac5aefb3 100644 --- a/eng/pipelines/templates/stages/platform-matrix.json +++ b/eng/pipelines/templates/stages/platform-matrix.json @@ -156,7 +156,6 @@ "CODE_COVERAGE": "enabled", "PublishMapFiles": "true" }, - "included": {}, "included_release": { "CMAKE_BUILD_TYPE": "Release", "CmakeArgs": " -DBUILD_TESTING=ON -DBUILD_PERFORMANCE_TESTS=ON -DRUN_LONG_UNIT_TESTS=ON", From 060f30cbc54bdf2bd1b6c0385edde32cb24efa3b Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Tue, 11 Apr 2023 16:21:50 -0700 Subject: [PATCH 11/20] Unique job name --- eng/pipelines/templates/jobs/archetype-sdk-client.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-client.yml index 0a325a20f3..59b8d6cb7e 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -53,6 +53,7 @@ jobs: - ${{ each config in parameters.JobConfiguration }}: - template: /eng/common/pipelines/templates/jobs/archetype-sdk-tests-generate.yml parameters: + GenerateJobName: ${{ config.Name }}_generate_matrix MatrixConfigs: - Name: base Path: ${{ config.Matrix}} From 704e55cf21fabcdf1bd51bc817d590dfddc57602 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Tue, 11 Apr 2023 16:30:38 -0700 Subject: [PATCH 12/20] Job condition --- eng/pipelines/templates/stages/archetype-cpp-release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/pipelines/templates/stages/archetype-cpp-release.yml b/eng/pipelines/templates/stages/archetype-cpp-release.yml index 1c45e54c3c..53c158d1ef 100644 --- a/eng/pipelines/templates/stages/archetype-cpp-release.yml +++ b/eng/pipelines/templates/stages/archetype-cpp-release.yml @@ -243,7 +243,7 @@ stages: dependsOn: ${{ parameters.DependsOn }} condition: >- and( - eq(stageDependencies.Build.QuickValidate.result, 'Succeeded'), + succeededOrFailed(), or( eq(variables['PublishDailyVcpkg'], 'true'), eq(variables['Build.Reason'],'Schedule') @@ -252,7 +252,7 @@ stages: jobs: - job: PublishDailyVcpkg displayName: Publish to vcpkg daily branch - + condition: eq(stageDependencies.Build.QuickValidate.result, 'Succeeded') pool: name: azsdk-pool-mms-win-2022-general vmImage: windows-2022 From b846a99db29780f372238919817145daa9bd1fd1 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Thu, 13 Apr 2023 15:23:56 -0700 Subject: [PATCH 13/20] Spacing --- eng/pipelines/templates/stages/archetype-cpp-release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/pipelines/templates/stages/archetype-cpp-release.yml b/eng/pipelines/templates/stages/archetype-cpp-release.yml index 53c158d1ef..4185913416 100644 --- a/eng/pipelines/templates/stages/archetype-cpp-release.yml +++ b/eng/pipelines/templates/stages/archetype-cpp-release.yml @@ -253,6 +253,7 @@ stages: - job: PublishDailyVcpkg displayName: Publish to vcpkg daily branch condition: eq(stageDependencies.Build.QuickValidate.result, 'Succeeded') + pool: name: azsdk-pool-mms-win-2022-general vmImage: windows-2022 From e5c8542a626c4899d70822f4488f644ffa1a2513 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Thu, 13 Apr 2023 15:47:00 -0700 Subject: [PATCH 14/20] Separate QuickBuild into a different stage, reduce runtime job-granular checks --- .../templates/jobs/archetype-sdk-client.yml | 60 +++++++++---------- .../stages/archetype-cpp-release.yml | 7 ++- .../templates/stages/archetype-sdk-client.yml | 27 +++++++++ 3 files changed, 60 insertions(+), 34 deletions(-) diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-client.yml index 59b8d6cb7e..36e1dcedf4 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -41,39 +41,37 @@ parameters: - name: PostTestSteps type: stepList default: [] - - name: JobConfiguration - type: object - default: - - Name: Validate - Matrix: eng/pipelines/templates/stages/platform-matrix.json - - Name: QuickValidate - Matrix: eng/pipelines/templates/stages/platform-matrix-quick.json + - name: MatrixFile + type: string + default: eng/pipelines/templates/stages/platform-matrix.json + - name: JobName + type: string + default: Validate jobs: - - ${{ each config in parameters.JobConfiguration }}: - - template: /eng/common/pipelines/templates/jobs/archetype-sdk-tests-generate.yml - parameters: - GenerateJobName: ${{ config.Name }}_generate_matrix - MatrixConfigs: - - Name: base - Path: ${{ config.Matrix}} - Selection: all - GenerateVMJobs: true - JobTemplatePath: /eng/pipelines/templates/jobs/ci.tests.yml - AdditionalParameters: - DisplayName: ${{ config.Name }} - Artifacts: ${{ parameters.Artifacts }} - ServiceDirectory: ${{ parameters.ServiceDirectory }} - TestPipeline: ${{ parameters.TestPipeline }} - CtestRegex: ${{ parameters.CtestRegex }} - CtestExcludeRegex: ${{ parameters.CtestExcludeRegex }} - CoverageReportPath: ${{ parameters.CoverageReportPath }} - CoverageEnabled: ${{ parameters.CoverageEnabled }} - LineCoverageTarget: ${{ parameters.LineCoverageTarget }} - BranchCoverageTarget: ${{ parameters.BranchCoverageTarget }} - TestEnv: ${{ parameters.TestEnv }} - PreTestSteps: ${{ parameters.PreTestSteps }} - PostTestSteps: ${{ parameters.PostTestSteps }} + - template: /eng/common/pipelines/templates/jobs/archetype-sdk-tests-generate.yml + parameters: + GenerateJobName: ${{ parameters.JobName }}_generate_matrix + MatrixConfigs: + - Name: base + Path: ${{ parameters.MatrixFile }} + Selection: all + GenerateVMJobs: true + JobTemplatePath: /eng/pipelines/templates/jobs/ci.tests.yml + AdditionalParameters: + DisplayName: ${{ parameters.JobName }} + Artifacts: ${{ parameters.Artifacts }} + ServiceDirectory: ${{ parameters.ServiceDirectory }} + TestPipeline: ${{ parameters.TestPipeline }} + CtestRegex: ${{ parameters.CtestRegex }} + CtestExcludeRegex: ${{ parameters.CtestExcludeRegex }} + CoverageReportPath: ${{ parameters.CoverageReportPath }} + CoverageEnabled: ${{ parameters.CoverageEnabled }} + LineCoverageTarget: ${{ parameters.LineCoverageTarget }} + BranchCoverageTarget: ${{ parameters.BranchCoverageTarget }} + TestEnv: ${{ parameters.TestEnv }} + PreTestSteps: ${{ parameters.PreTestSteps }} + PostTestSteps: ${{ parameters.PostTestSteps }} # Disable build for cpp - client - ${{ if ne(parameters.ServiceDirectory, 'not-specified' )}}: diff --git a/eng/pipelines/templates/stages/archetype-cpp-release.yml b/eng/pipelines/templates/stages/archetype-cpp-release.yml index 4185913416..e12c772797 100644 --- a/eng/pipelines/templates/stages/archetype-cpp-release.yml +++ b/eng/pipelines/templates/stages/archetype-cpp-release.yml @@ -5,6 +5,8 @@ parameters: TestPipeline: false DependsOn: - Build + IntegrationDependsOn: + - QuickBuild stages: - ${{if and(eq(variables['Build.Reason'], 'Manual'), eq(variables['System.TeamProject'], 'internal'))}}: @@ -240,7 +242,7 @@ stages: - ${{if eq(variables['System.TeamProject'], 'internal') }}: - stage: Integration - dependsOn: ${{ parameters.DependsOn }} + dependsOn: ${{ parameters.IntegrationDependsOn }} condition: >- and( succeededOrFailed(), @@ -252,8 +254,7 @@ stages: jobs: - job: PublishDailyVcpkg displayName: Publish to vcpkg daily branch - condition: eq(stageDependencies.Build.QuickValidate.result, 'Succeeded') - + pool: name: azsdk-pool-mms-win-2022-general vmImage: windows-2022 diff --git a/eng/pipelines/templates/stages/archetype-sdk-client.yml b/eng/pipelines/templates/stages/archetype-sdk-client.yml index 8c4cc5f4d7..c00f3f374a 100644 --- a/eng/pipelines/templates/stages/archetype-sdk-client.yml +++ b/eng/pipelines/templates/stages/archetype-sdk-client.yml @@ -88,12 +88,37 @@ stages: ArtifactsSource: ${{ parameters.ArtifactsSource }} CMakeTestOptions: ${{ parameters.CMakeTestOptions }} CMakeSourceTestOptions: ${{ parameters.CMakeSourceTestOptions }} + + # QuickBuild runs a narrower set of fast builds. If these builds pass, + # Integration can launch immediately without awaiting more build and test jobs + - stage: QuickBuild + dependsOn: [] + jobs: + - template: /eng/pipelines/templates/jobs/archetype-sdk-client.yml + parameters: + MatrixFile: eng/pipelines/templates/stages/platform-matrix-quick.json + JobName: QuickValidate + ServiceDirectory: ${{ parameters.ServiceDirectory }} + Artifacts: ${{ parameters.Artifacts }} + CtestRegex: ${{ parameters.CtestRegex }} + CtestExcludeRegex: ${{ parameters.CtestExcludeRegex }} + CoverageEnabled: ${{ parameters.CoverageEnabled }} + CoverageReportPath: ${{ parameters.CoverageReportPath }} + LineCoverageTarget: ${{ parameters.LineCoverageTarget }} + BranchCoverageTarget: ${{ parameters.BranchCoverageTarget }} + ${{ if eq(parameters.ServiceDirectory, 'template') }}: + TestPipeline: true + TestEnv: ${{ parameters.TestEnv }} + PreTestSteps: ${{ parameters.PreTestSteps }} + PostTestSteps: ${{ parameters.PostTestSteps }} - stage: Build dependsOn: [] jobs: - template: /eng/pipelines/templates/jobs/archetype-sdk-client.yml parameters: + MatrixFile: eng/pipelines/templates/stages/platform-matrix.json + JobName: Validate ServiceDirectory: ${{ parameters.ServiceDirectory }} Artifacts: ${{ parameters.Artifacts }} CtestRegex: ${{ parameters.CtestRegex }} @@ -128,6 +153,8 @@ stages: - template: archetype-cpp-release.yml parameters: ServiceDirectory: ${{ parameters.ServiceDirectory }} + IntegrationDependsOn: + - QuickBuild DependsOn: - Build # TODO: Don't depend on live tests in scheduled runs From 308ae4aac9024cfa5126e07275a55983c7c83f07 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Thu, 13 Apr 2023 15:54:11 -0700 Subject: [PATCH 15/20] Only run metadata jobs in Build --- eng/pipelines/templates/jobs/archetype-sdk-client.yml | 5 ++++- eng/pipelines/templates/stages/archetype-sdk-client.yml | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/eng/pipelines/templates/jobs/archetype-sdk-client.yml b/eng/pipelines/templates/jobs/archetype-sdk-client.yml index 36e1dcedf4..cd7abb84c9 100644 --- a/eng/pipelines/templates/jobs/archetype-sdk-client.yml +++ b/eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -47,6 +47,9 @@ parameters: - name: JobName type: string default: Validate + - name: RunMetaJobs + type: boolean + default: true jobs: - template: /eng/common/pipelines/templates/jobs/archetype-sdk-tests-generate.yml @@ -74,7 +77,7 @@ jobs: PostTestSteps: ${{ parameters.PostTestSteps }} # Disable build for cpp - client - - ${{ if ne(parameters.ServiceDirectory, 'not-specified' )}}: + - ${{ if and(eq(parameters.RunMetaJobs, 'true'), ne(parameters.ServiceDirectory, 'not-specified' )) }}: - ${{ each artifact in parameters.Artifacts }}: - job: displayName: Create API Review for ${{ artifact.name }} diff --git a/eng/pipelines/templates/stages/archetype-sdk-client.yml b/eng/pipelines/templates/stages/archetype-sdk-client.yml index c00f3f374a..f75450e858 100644 --- a/eng/pipelines/templates/stages/archetype-sdk-client.yml +++ b/eng/pipelines/templates/stages/archetype-sdk-client.yml @@ -111,6 +111,7 @@ stages: TestEnv: ${{ parameters.TestEnv }} PreTestSteps: ${{ parameters.PreTestSteps }} PostTestSteps: ${{ parameters.PostTestSteps }} + RunMetaJobs: false - stage: Build dependsOn: [] From 407a57afbcdfaba8f242c73ba69c13cd0e31b9ae Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Thu, 13 Apr 2023 16:12:07 -0700 Subject: [PATCH 16/20] TODO is done --- eng/pipelines/templates/stages/archetype-sdk-client.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/eng/pipelines/templates/stages/archetype-sdk-client.yml b/eng/pipelines/templates/stages/archetype-sdk-client.yml index f75450e858..984c3e93e1 100644 --- a/eng/pipelines/templates/stages/archetype-sdk-client.yml +++ b/eng/pipelines/templates/stages/archetype-sdk-client.yml @@ -158,7 +158,6 @@ stages: - QuickBuild DependsOn: - Build - # TODO: Don't depend on live tests in scheduled runs # Only depend on `LiveTest` if there are live tests to execute - ${{ if and(eq(variables['System.TeamProject'], 'internal'), ne(parameters.LiveTestCtestRegex, '')) }}: # Pulled from stages/archetype-sdk-tests.yml to generate 'LiveTest_' From e5cf2017ef034dfce4592edc7211c8b95f78f5e7 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Thu, 13 Apr 2023 16:12:45 -0700 Subject: [PATCH 17/20] Remove Test-JobSucceeded* --- eng/scripts/Test-JobSucceeded.Tests.ps1 | 60 ------------------------- eng/scripts/Test-JobSucceeded.ps1 | 54 ---------------------- 2 files changed, 114 deletions(-) delete mode 100644 eng/scripts/Test-JobSucceeded.Tests.ps1 delete mode 100644 eng/scripts/Test-JobSucceeded.ps1 diff --git a/eng/scripts/Test-JobSucceeded.Tests.ps1 b/eng/scripts/Test-JobSucceeded.Tests.ps1 deleted file mode 100644 index 771a96b11d..0000000000 --- a/eng/scripts/Test-JobSucceeded.Tests.ps1 +++ /dev/null @@ -1,60 +0,0 @@ -Describe 'Test Test-JobSucceeded.ps1' { - - BeforeAll { - function testScript ($jobNames) { - . $PSScriptRoot/Test-JobSucceeded.ps1 ` - -JobNames $jobNames ` - -Project 'testProject' ` - -Org 'testOrg' ` - -BuildId '123' ` - -AccessToken 'testToken' - } - } - - It 'Fails on non-200 response' { - Mock -CommandName Invoke-RestMethod -MockWith { throw 'Error' } - - { testScript -jobNames TestJob } | Should -Throw - } - - It 'Fails on invalid response' { - Mock -CommandName Invoke-RestMethod -MockWith { @{ invalidObject = "hello" } } - - { testScript -jobNames TestJob } | Should -Throw - } - - It 'Fails on missing job' { - Mock -CommandName Invoke-RestMethod -MockWith { @{ records = @(@{ name = "not-TestJob" }) } } - - testScript -jobNames TestJob - $LASTEXITCODE | Should -Not -Be 0 - } - - It 'Fails on one matching failing job' { - Mock -CommandName Invoke-RestMethod -MockWith { @{ records = @(@{ name = "TestJob"; result = "failed"; attempt = 1 }) } } - - testScript -jobNames TestJob - $LASTEXITCODE | Should -Not -Be 0 - } - - It 'Succeeds on one matching succeeded job' { - Mock -CommandName Invoke-RestMethod -MockWith { @{ records = @(@{ name = "TestJob"; result = "succeeded"; attempt = 1 }) } } - - testScript -jobNames TestJob - $LASTEXITCODE | Should -Be 0 - } - - It 'Succeeds on two matching jobs with last one succeeding' { - Mock -CommandName Invoke-RestMethod -MockWith { @{ records = @(@{ name = "TestJob"; result = "failed"; attempt = 1 }, @{ name = "TestJob"; result = "succeeded"; attempt = 2 }) } } - - testScript -jobNames TestJob - $LASTEXITCODE | Should -Be 0 - } - - It 'Fails on two matching jobs with both failing' { - Mock -CommandName Invoke-RestMethod -MockWith { @{ records = @(@{ name = "TestJob"; result = "failed"; attempt = 1 }, @{ name = "TestJob"; result = "failed"; attempt = 2 }) } } - - testScript -jobNames TestJob - $LASTEXITCODE | Should -Not -Be 0 - } -} \ No newline at end of file diff --git a/eng/scripts/Test-JobSucceeded.ps1 b/eng/scripts/Test-JobSucceeded.ps1 deleted file mode 100644 index 262433ddde..0000000000 --- a/eng/scripts/Test-JobSucceeded.ps1 +++ /dev/null @@ -1,54 +0,0 @@ -param( - $JobNames, - $Project = $env:SYSTEM_TEAMPROJECT, - $Org = $env:SYSTEM_COLLECTIONID, - $BuildId = $env:BUILD_BUILDID, - $AccessToken = $env:SYSTEM_ACCESSTOKEN -) - -Set-StrictMode -Version 4.0 - -if (!($JobNames -is [array])) { - $JobNames = @($JobNames) -} - -$credential = New-Object System.Management.Automation.PSCredential ` - -ArgumentList "pat", (ConvertTo-SecureString $AccessToken -AsPlainText -Force) - -$buildTimeline = Invoke-RestMethod ` - -Method Get ` - -Authentication Basic ` - -Credential $credential ` - -Uri "https://dev.azure.com/$Org/$Project/_apis/build/builds/$BuildId/timeline?api-version=5.0" - -Write-Host "URL: https://dev.azure.com/$Org/$Project/_apis/build/builds/$BuildId/timeline?api-version=5.0" - -$hasError = $false - -foreach($jobName in $JobNames) { - $job = $buildTimeline.records ` - | Where-Object { $_.name -eq $jobName } - | Sort-Object -Property attempt -Descending - | Select-Object -First 1 - - if (!$job) { - $hasError = $true - Write-Host "Could not find matching job in timeline: $jobName" - continue - } - - if ($job.result -ne "succeeded") { - $hasError = $true - Write-Host "Job failed: $jobName" - } - - Write-Host "Job succeeded: $jobName" -} - -if ($hasError) { - Write-Host "Exiting with error" - exit 1 -} - -Write-Host "Evaluated jobs succeeded" -exit 0 \ No newline at end of file From e8921531c001b269c2e51e488ba0620ce99f60dd Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Thu, 13 Apr 2023 16:13:54 -0700 Subject: [PATCH 18/20] newline --- eng/pipelines/templates/stages/platform-matrix-quick.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/pipelines/templates/stages/platform-matrix-quick.json b/eng/pipelines/templates/stages/platform-matrix-quick.json index 1e1ad7190d..3b5e75dcef 100644 --- a/eng/pipelines/templates/stages/platform-matrix-quick.json +++ b/eng/pipelines/templates/stages/platform-matrix-quick.json @@ -19,4 +19,4 @@ } } ] -} \ No newline at end of file +} From 22048e53c9c2a5d771bdab256c5431c71356d329 Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Fri, 14 Apr 2023 08:46:58 -0700 Subject: [PATCH 19/20] QuickBuild -> PrePublishBuild --- eng/pipelines/templates/stages/archetype-cpp-release.yml | 2 +- eng/pipelines/templates/stages/archetype-sdk-client.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eng/pipelines/templates/stages/archetype-cpp-release.yml b/eng/pipelines/templates/stages/archetype-cpp-release.yml index e12c772797..acb2b1a77e 100644 --- a/eng/pipelines/templates/stages/archetype-cpp-release.yml +++ b/eng/pipelines/templates/stages/archetype-cpp-release.yml @@ -6,7 +6,7 @@ parameters: DependsOn: - Build IntegrationDependsOn: - - QuickBuild + - PrePublishBuild stages: - ${{if and(eq(variables['Build.Reason'], 'Manual'), eq(variables['System.TeamProject'], 'internal'))}}: diff --git a/eng/pipelines/templates/stages/archetype-sdk-client.yml b/eng/pipelines/templates/stages/archetype-sdk-client.yml index 984c3e93e1..97c7e78f00 100644 --- a/eng/pipelines/templates/stages/archetype-sdk-client.yml +++ b/eng/pipelines/templates/stages/archetype-sdk-client.yml @@ -89,9 +89,9 @@ stages: CMakeTestOptions: ${{ parameters.CMakeTestOptions }} CMakeSourceTestOptions: ${{ parameters.CMakeSourceTestOptions }} - # QuickBuild runs a narrower set of fast builds. If these builds pass, + # PrePublishBuild runs a narrower set of fast builds. If these builds pass, # Integration can launch immediately without awaiting more build and test jobs - - stage: QuickBuild + - stage: PrePublishBuild dependsOn: [] jobs: - template: /eng/pipelines/templates/jobs/archetype-sdk-client.yml @@ -155,7 +155,7 @@ stages: parameters: ServiceDirectory: ${{ parameters.ServiceDirectory }} IntegrationDependsOn: - - QuickBuild + - PrePublishBuild DependsOn: - Build # Only depend on `LiveTest` if there are live tests to execute From 8475f1c3430409703d5187b93e1def6a2f15656a Mon Sep 17 00:00:00 2001 From: Daniel Jurek Date: Mon, 17 Apr 2023 13:44:28 -0700 Subject: [PATCH 20/20] Release should also depend on PrePublishBuild --- eng/pipelines/templates/stages/archetype-sdk-client.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/eng/pipelines/templates/stages/archetype-sdk-client.yml b/eng/pipelines/templates/stages/archetype-sdk-client.yml index 97c7e78f00..f6a9163715 100644 --- a/eng/pipelines/templates/stages/archetype-sdk-client.yml +++ b/eng/pipelines/templates/stages/archetype-sdk-client.yml @@ -157,6 +157,7 @@ stages: IntegrationDependsOn: - PrePublishBuild DependsOn: + - PrePublishBuild - Build # Only depend on `LiveTest` if there are live tests to execute - ${{ if and(eq(variables['System.TeamProject'], 'internal'), ne(parameters.LiveTestCtestRegex, '')) }}: