From c930b24ea42e09ccc54c864418a5b13ade7635e3 Mon Sep 17 00:00:00 2001 From: dotnet-docker-bot <60522487+dotnet-docker-bot@users.noreply.github.com> Date: Thu, 7 Aug 2025 13:15:12 -0700 Subject: [PATCH 1/2] Update common Docker engineering infrastructure with latest --- eng/common/templates/1es-official.yml | 14 ++-- eng/common/templates/1es-unofficial.yml | 9 ++- eng/common/templates/jobs/build-images.yml | 13 +++- eng/common/templates/jobs/publish.yml | 33 ++++++-- .../templates/stages/build-and-test.yml | 74 ++++++------------ .../stages/dotnet/build-and-test.yml | 7 +- .../stages/dotnet/build-test-publish-repo.yml | 3 + .../templates/stages/dotnet/publish.yml | 4 + eng/common/templates/stages/publish.yml | 16 +++- .../stages/setup-service-connections.yml | 2 +- .../steps/init-matrix-build-publish.yml | 77 +++++++++++++++++++ .../templates/variables/docker-images.yml | 2 +- .../variables/dotnet/build-test-publish.yml | 13 ++-- .../templates/variables/dotnet/common.yml | 9 ++- .../templates/variables/dotnet/secrets.yml | 17 ++++ 15 files changed, 207 insertions(+), 86 deletions(-) create mode 100644 eng/common/templates/steps/init-matrix-build-publish.yml create mode 100644 eng/common/templates/variables/dotnet/secrets.yml diff --git a/eng/common/templates/1es-official.yml b/eng/common/templates/1es-official.yml index 357ab811..49721aa1 100644 --- a/eng/common/templates/1es-official.yml +++ b/eng/common/templates/1es-official.yml @@ -2,7 +2,7 @@ # do the following: # # - Do not rely on any source code from the versions repo so as to not circumvent SDL and CG guidelines -# - The versions repo resource must be named `InternalVersionsRepo` or `PublicVersionsRepo` to avoid SDL scans +# - The versions repo resource must be named `VersionsRepo` to avoid SDL scans # - The versions repo must be checked out to `$(Build.SourcesDirectory)/versions` to avoid CG scans # # If the pipeline is not using a separate repository resource, ensure that there is no source code checked out in @@ -57,14 +57,14 @@ extends: enabled: true sourceRepositoriesToScan: exclude: - - repository: InternalVersionsRepo - - repository: PublicVersionsRepo + - repository: VersionsRepo sourceAnalysisPool: ${{ parameters.sourceAnalysisPool }} tsa: enabled: true stages: - - template: /eng/common/templates/stages/setup-service-connections.yml@self - parameters: - pool: ${{ parameters.pool }} - serviceConnections: ${{ parameters.serviceConnections }} + - ${{ if gt(length(parameters.serviceConnections), 0) }}: + - template: /eng/common/templates/stages/setup-service-connections.yml@self + parameters: + pool: ${{ parameters.pool }} + serviceConnections: ${{ parameters.serviceConnections }} - ${{ parameters.stages }} diff --git a/eng/common/templates/1es-unofficial.yml b/eng/common/templates/1es-unofficial.yml index 64dc5313..541f92f2 100644 --- a/eng/common/templates/1es-unofficial.yml +++ b/eng/common/templates/1es-unofficial.yml @@ -71,8 +71,9 @@ extends: tsa: enabled: true stages: - - template: /eng/common/templates/stages/setup-service-connections.yml@self - parameters: - pool: ${{ parameters.pool }} - serviceConnections: ${{ parameters.serviceConnections }} + - ${{ if gt(length(parameters.serviceConnections), 0) }}: + - template: /eng/common/templates/stages/setup-service-connections.yml@self + parameters: + pool: ${{ parameters.pool }} + serviceConnections: ${{ parameters.serviceConnections }} - ${{ parameters.stages }} diff --git a/eng/common/templates/jobs/build-images.yml b/eng/common/templates/jobs/build-images.yml index 6d2482e9..420120d2 100644 --- a/eng/common/templates/jobs/build-images.yml +++ b/eng/common/templates/jobs/build-images.yml @@ -49,7 +49,7 @@ jobs: # all we need is for that value to be in a PowerShell variable, we can get that by the fact that AzDO automatically creates # the environment variable for us. $imageBuilderBuildArgs = "$env:IMAGEBUILDERBUILDARGS $(imageBuilder.queueArgs) --image-info-output-path $(imageInfoContainerDir)/$(legName)-image-info.json $(commonMatrixAndBuildOptions)" - if ($env:SYSTEM_TEAMPROJECT -eq "${{ parameters.internalProjectName }}" -and $env:BUILD_REASON -ne "PullRequest" -and "${{ parameters.isInternalServicingValidation }}" -ne "true") { + if ($env:SYSTEM_TEAMPROJECT -eq "${{ parameters.internalProjectName }}" -and $env:BUILD_REASON -ne "PullRequest") { $imageBuilderBuildArgs = "$imageBuilderBuildArgs --repo-prefix $(stagingRepoPrefix) --push" } @@ -70,6 +70,11 @@ jobs: id: $(build.serviceConnection.id) tenantId: $(build.serviceConnection.tenantId) clientId: $(build.serviceConnection.clientId) + - ${{ if eq(parameters.isInternalServicingValidation, true) }}: + - name: storage + id: $(dotnetstaging.serviceConnection.id) + tenantId: $(dotnetstaging.serviceConnection.tenantId) + clientId: $(dotnetstaging.serviceConnection.clientId) internalProjectName: ${{ parameters.internalProjectName }} dockerClientOS: ${{ parameters.dockerClientOS }} args: >- @@ -92,7 +97,7 @@ jobs: displayName: Publish Image Info File Artifact internalProjectName: ${{ parameters.internalProjectName }} publicProjectName: ${{ parameters.publicProjectName }} - - ${{ if and(eq(variables['System.TeamProject'], parameters.internalProjectName), ne(variables['Build.Reason'], 'PullRequest'), eq(parameters.isInternalServicingValidation, 'false')) }}: + - ${{ if and(eq(variables['System.TeamProject'], parameters.internalProjectName), ne(variables['Build.Reason'], 'PullRequest')) }}: # The following task depends on the SBOM Manifest Generator task installed on the agent. # This task is auto-injected by 1ES Pipeline Templates so we don't need to install it ourselves. - powershell: | @@ -144,11 +149,11 @@ jobs: } displayName: Generate SBOMs condition: and(succeeded(), ne(variables['BuildImages.builtImages'], '')) - - ${{ if or(eq(variables['Build.Reason'], 'PullRequest'), eq(parameters.isInternalServicingValidation, 'true')) }}: + - ${{ if eq(variables['Build.Reason'], 'PullRequest') }}: - template: /eng/common/templates/jobs/${{ format('../steps/test-images-{0}-client.yml', parameters.dockerClientOS) }}@self parameters: condition: ne(variables.testScriptPath, '') - - ${{ if and(eq(variables['System.TeamProject'], parameters.internalProjectName), ne(variables['Build.Reason'], 'PullRequest'), eq(parameters.isInternalServicingValidation, 'false')) }}: + - ${{ if and(eq(variables['System.TeamProject'], parameters.internalProjectName), ne(variables['Build.Reason'], 'PullRequest')) }}: - template: /eng/common/templates/steps/publish-artifact.yml@self parameters: path: $(sbomDirectory) diff --git a/eng/common/templates/jobs/publish.yml b/eng/common/templates/jobs/publish.yml index 52a85144..5295ad96 100644 --- a/eng/common/templates/jobs/publish.yml +++ b/eng/common/templates/jobs/publish.yml @@ -5,6 +5,11 @@ parameters: customPublishVariables: [] sourceBuildPipelineDefinitionId: "" sourceBuildPipelineRunId: "" + versionsRepoRef: null + versionsRepoPath: "" + # When true, overrides the commit SHA in merged image info files to use the current repository commit. + # This ensures that updated images reference the correct commit in their commitUrl properties. + overrideImageInfoCommit: false jobs: - job: Publish @@ -31,9 +36,19 @@ jobs: value: $(artifactsPath)/imageInfo - name: sourceBuildIdOutputDir value: $(Build.ArtifactStagingDirectory)/sourceBuildId + - name: commitOverrideArg + ${{ if eq(parameters.overrideImageInfoCommit, true) }}: + value: --commit-override $(Build.SourceVersion) + ${{ else }}: + value: '' - ${{ parameters.customPublishVariables }} steps: + - template: /eng/common/templates/steps/init-matrix-build-publish.yml@self + parameters: + cloneVersionsRepo: ${{ variables.publishImageInfo }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} + - template: /eng/common/templates/steps/retain-build.yml@self - template: /eng/common/templates/steps/init-docker-linux.yml@self @@ -41,6 +56,8 @@ jobs: - pwsh: | $azdoOrgName = Split-Path -Leaf $Env:SYSTEM_COLLECTIONURI echo "##vso[task.setvariable variable=azdoOrgName]$azdoOrgName" + $versionsRepoRoot = "$(Pipeline.Workspace)/s/${{ parameters.versionsRepoPath }}" + echo "##vso[task.setvariable variable=versionsRepoRoot]$versionsRepoRoot" displayName: Set Publish Variables - ${{ parameters.customInitSteps }} @@ -138,13 +155,16 @@ jobs: - script: mkdir -p $(Build.ArtifactStagingDirectory)/eol-annotation-data displayName: Create EOL Annotation Data Directory - - powershell: >- - $(engCommonPath)/Invoke-WithRetry.ps1 - "curl -fSL - --output $(imageInfoHostDir)/full-image-info-orig.json - https://raw.githubusercontent.com/$(gitHubVersionsRepoInfo.org)/$(gitHubVersionsRepoInfo.repo)/refs/heads/$(gitHubVersionsRepoInfo.branch)/$(gitHubImageInfoVersionsPath)" + - script: |- + cd $(versionsRepoRoot) + git pull origin $(gitHubVersionsRepoInfo.branch) + condition: and(succeeded(), eq(variables['publishImageInfo'], 'true')) + displayName: Pull Latest Changes from Versions Repo + + - script: >- + cp $(versionsRepoRoot)/$(gitHubImageInfoVersionsPath) $(imageInfoHostDir)/full-image-info-orig.json condition: and(succeeded(), eq(variables['publishImageInfo'], 'true')) - displayName: Download Latest Image Info + displayName: Copy Latest Image Info from Versions Repo - script: > $(runImageBuilderCmd) mergeImageInfo @@ -155,6 +175,7 @@ jobs: --manifest $(manifest) --publish --initial-image-info-path $(imageInfoContainerDir)/full-image-info-orig.json + $(commitOverrideArg) condition: and(succeeded(), eq(variables['publishImageInfo'], 'true')) displayName: Merge Image Info diff --git a/eng/common/templates/stages/build-and-test.yml b/eng/common/templates/stages/build-and-test.yml index 1b5d4a8f..d1930a2b 100644 --- a/eng/common/templates/stages/build-and-test.yml +++ b/eng/common/templates/stages/build-and-test.yml @@ -22,8 +22,7 @@ parameters: internalProjectName: null publicProjectName: null - internalVersionsRepoRef: null - publicVersionsRepoRef: null + versionsRepoRef: "" isInternalServicingValidation: false @@ -51,6 +50,7 @@ stages: condition: and(succeeded(), contains(variables['stages'], 'build')) dependsOn: [] jobs: + - template: /eng/common/templates/jobs/test-images-linux-client.yml@self parameters: name: PreBuildValidation @@ -69,12 +69,14 @@ stages: echo "##vso[task.setvariable variable=osVersions]" echo "##vso[task.setvariable variable=architecture]" displayName: Initialize Test Variables + - template: /eng/common/templates/jobs/copy-base-images-staging.yml@self parameters: name: CopyBaseImages pool: ${{ parameters.linuxAmd64Pool }} additionalOptions: "--manifest '$(manifest)' $(imageBuilder.pathArgs) $(manifestVariables)" customInitSteps: ${{ parameters.customCopyBaseImagesInitSteps }} + - template: /eng/common/templates/jobs/generate-matrix.yml@self parameters: matrixType: ${{ parameters.buildMatrixType }} @@ -85,12 +87,10 @@ stages: noCache: ${{ parameters.noCache }} customInitSteps: ${{ parameters.customGenerateMatrixInitSteps }} commonInitStepsForMatrixAndBuild: - - template: /eng/common/templates/steps/common-init-for-matrix-and-build.yml@self + - template: /eng/common/templates/steps/init-matrix-build-publish.yml@self parameters: - noCache: ${{ parameters.noCache }} - internalVersionsRepoRef: ${{ parameters.internalVersionsRepoRef }} - publicVersionsRepoRef: ${{ parameters.publicVersionsRepoRef }} - isInternalServicingValidation: ${{ parameters.isInternalServicingValidation }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} + - template: /eng/common/templates/jobs/build-images.yml@self parameters: name: Linux_amd64 @@ -99,12 +99,9 @@ stages: dockerClientOS: linux buildJobTimeout: ${{ parameters.linuxAmdBuildJobTimeout }} commonInitStepsForMatrixAndBuild: - - template: /eng/common/templates/steps/common-init-for-matrix-and-build.yml@self + - template: /eng/common/templates/steps/init-matrix-build-publish.yml@self parameters: - noCache: ${{ parameters.noCache }} - internalVersionsRepoRef: ${{ parameters.internalVersionsRepoRef }} - publicVersionsRepoRef: ${{ parameters.publicVersionsRepoRef }} - isInternalServicingValidation: ${{ parameters.isInternalServicingValidation }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} customInitSteps: ${{ parameters.customBuildInitSteps }} noCache: ${{ parameters.noCache }} internalProjectName: ${{ parameters.internalProjectName }} @@ -118,12 +115,9 @@ stages: dockerClientOS: linux buildJobTimeout: ${{ parameters.linuxArmBuildJobTimeout }} commonInitStepsForMatrixAndBuild: - - template: /eng/common/templates/steps/common-init-for-matrix-and-build.yml@self + - template: /eng/common/templates/steps/init-matrix-build-publish.yml@self parameters: - noCache: ${{ parameters.noCache }} - internalVersionsRepoRef: ${{ parameters.internalVersionsRepoRef }} - publicVersionsRepoRef: ${{ parameters.publicVersionsRepoRef }} - isInternalServicingValidation: ${{ parameters.isInternalServicingValidation }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} customInitSteps: ${{ parameters.customBuildInitSteps }} noCache: ${{ parameters.noCache }} internalProjectName: ${{ parameters.internalProjectName }} @@ -137,12 +131,9 @@ stages: dockerClientOS: linux buildJobTimeout: ${{ parameters.linuxArmBuildJobTimeout }} commonInitStepsForMatrixAndBuild: - - template: /eng/common/templates/steps/common-init-for-matrix-and-build.yml@self + - template: /eng/common/templates/steps/init-matrix-build-publish.yml@self parameters: - noCache: ${{ parameters.noCache }} - internalVersionsRepoRef: ${{ parameters.internalVersionsRepoRef }} - publicVersionsRepoRef: ${{ parameters.publicVersionsRepoRef }} - isInternalServicingValidation: ${{ parameters.isInternalServicingValidation }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} customInitSteps: ${{ parameters.customBuildInitSteps }} noCache: ${{ parameters.noCache }} internalProjectName: ${{ parameters.internalProjectName }} @@ -156,12 +147,9 @@ stages: dockerClientOS: windows buildJobTimeout: ${{ parameters.windowsAmdBuildJobTimeout }} commonInitStepsForMatrixAndBuild: - - template: /eng/common/templates/steps/common-init-for-matrix-and-build.yml@self + - template: /eng/common/templates/steps/init-matrix-build-publish.yml@self parameters: - noCache: ${{ parameters.noCache }} - internalVersionsRepoRef: ${{ parameters.internalVersionsRepoRef }} - publicVersionsRepoRef: ${{ parameters.publicVersionsRepoRef }} - isInternalServicingValidation: ${{ parameters.isInternalServicingValidation }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} customInitSteps: ${{ parameters.customBuildInitSteps }} noCache: ${{ parameters.noCache }} internalProjectName: ${{ parameters.internalProjectName }} @@ -175,12 +163,9 @@ stages: dockerClientOS: windows buildJobTimeout: ${{ parameters.windowsAmdBuildJobTimeout }} commonInitStepsForMatrixAndBuild: - - template: /eng/common/templates/steps/common-init-for-matrix-and-build.yml@self + - template: /eng/common/templates/steps/init-matrix-build-publish.yml@self parameters: - noCache: ${{ parameters.noCache }} - internalVersionsRepoRef: ${{ parameters.internalVersionsRepoRef }} - publicVersionsRepoRef: ${{ parameters.publicVersionsRepoRef }} - isInternalServicingValidation: ${{ parameters.isInternalServicingValidation }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} customInitSteps: ${{ parameters.customBuildInitSteps }} noCache: ${{ parameters.noCache }} internalProjectName: ${{ parameters.internalProjectName }} @@ -194,18 +179,14 @@ stages: dockerClientOS: windows buildJobTimeout: ${{ parameters.windowsAmdBuildJobTimeout }} commonInitStepsForMatrixAndBuild: - - template: /eng/common/templates/steps/common-init-for-matrix-and-build.yml@self + - template: /eng/common/templates/steps/init-matrix-build-publish.yml@self parameters: - noCache: ${{ parameters.noCache }} - internalVersionsRepoRef: ${{ parameters.internalVersionsRepoRef }} - publicVersionsRepoRef: ${{ parameters.publicVersionsRepoRef }} - isInternalServicingValidation: ${{ parameters.isInternalServicingValidation }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} customInitSteps: ${{ parameters.customBuildInitSteps }} noCache: ${{ parameters.noCache }} internalProjectName: ${{ parameters.internalProjectName }} publicProjectName: ${{ parameters.publicProjectName }} - internalVersionsRepoRef: ${{ parameters.internalVersionsRepoRef }} - publicVersionsRepoRef: ${{ parameters.publicVersionsRepoRef }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} isInternalServicingValidation: ${{ parameters.isInternalServicingValidation }} - template: /eng/common/templates/jobs/build-images.yml@self parameters: @@ -215,12 +196,9 @@ stages: dockerClientOS: windows buildJobTimeout: ${{ parameters.windowsAmdBuildJobTimeout }} commonInitStepsForMatrixAndBuild: - - template: /eng/common/templates/steps/common-init-for-matrix-and-build.yml@self + - template: /eng/common/templates/steps/init-matrix-build-publish.yml@self parameters: - noCache: ${{ parameters.noCache }} - internalVersionsRepoRef: ${{ parameters.internalVersionsRepoRef }} - publicVersionsRepoRef: ${{ parameters.publicVersionsRepoRef }} - isInternalServicingValidation: ${{ parameters.isInternalServicingValidation }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} customInitSteps: ${{ parameters.customBuildInitSteps }} noCache: ${{ parameters.noCache }} internalProjectName: ${{ parameters.internalProjectName }} @@ -243,7 +221,7 @@ stages: ################################################################################ # Test Images ################################################################################ -- ${{ if and(eq(variables['System.TeamProject'], parameters.internalProjectName), ne(variables['Build.Reason'], 'PullRequest'), eq(parameters.isInternalServicingValidation, 'false')) }}: +- ${{ if and(eq(variables['System.TeamProject'], parameters.internalProjectName), ne(variables['Build.Reason'], 'PullRequest')) }}: - stage: Test dependsOn: Post_Build condition: " @@ -270,11 +248,9 @@ stages: customInitSteps: ${{ parameters.customGenerateMatrixInitSteps }} sourceBuildPipelineRunId: ${{ parameters.sourceBuildPipelineRunId }} commonInitStepsForMatrixAndBuild: - - template: /eng/common/templates/steps/common-init-for-matrix-and-build.yml@self + - template: /eng/common/templates/steps/init-matrix-build-publish.yml@self parameters: - noCache: ${{ parameters.noCache }} - internalVersionsRepoRef: ${{ parameters.internalVersionsRepoRef }} - publicVersionsRepoRef: ${{ parameters.publicVersionsRepoRef }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} - template: /eng/common/templates/jobs/test-images-linux-client.yml@self parameters: name: Linux_amd64 diff --git a/eng/common/templates/stages/dotnet/build-and-test.yml b/eng/common/templates/stages/dotnet/build-and-test.yml index 03bcaf37..3e6c80d8 100644 --- a/eng/common/templates/stages/dotnet/build-and-test.yml +++ b/eng/common/templates/stages/dotnet/build-and-test.yml @@ -30,6 +30,8 @@ parameters: internalProjectName: null publicProjectName: null + versionsRepoRef: null + stages: - template: /eng/common/templates/stages/build-and-test.yml@self parameters: @@ -51,8 +53,9 @@ stages: testMatrixType: ${{ parameters.testMatrixType }} sourceBuildPipelineRunId: ${{ parameters.sourceBuildPipelineRunId }} - internalVersionsRepoRef: InternalVersionsRepo - publicVersionsRepoRef: PublicVersionsRepo + # Only clone versions repo if we need to reference it during the build in order to cache images. + ${{ if eq(parameters.noCache, false) }}: + versionsRepoRef: ${{ parameters.versionsRepoRef }} # Linux AMD64 linuxAmd64Pool: diff --git a/eng/common/templates/stages/dotnet/build-test-publish-repo.yml b/eng/common/templates/stages/dotnet/build-test-publish-repo.yml index 65bc5458..f7f54fce 100644 --- a/eng/common/templates/stages/dotnet/build-test-publish-repo.yml +++ b/eng/common/templates/stages/dotnet/build-test-publish-repo.yml @@ -32,6 +32,7 @@ parameters: # Other common parameters internalProjectName: null publicProjectName: null + versionsRepoRef: null stages: @@ -61,6 +62,7 @@ stages: # Other internalProjectName: ${{ parameters.internalProjectName }} publicProjectName: ${{ parameters.publicProjectName }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} - template: /eng/common/templates/stages/dotnet/publish.yml@self parameters: @@ -70,3 +72,4 @@ stages: internalProjectName: ${{ parameters.internalProjectName }} publicProjectName: ${{ parameters.publicProjectName }} sourceBuildPipelineRunId: ${{ parameters.sourceBuildPipelineRunId }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} diff --git a/eng/common/templates/stages/dotnet/publish.yml b/eng/common/templates/stages/dotnet/publish.yml index a8a9170a..d396174c 100644 --- a/eng/common/templates/stages/dotnet/publish.yml +++ b/eng/common/templates/stages/dotnet/publish.yml @@ -10,6 +10,8 @@ parameters: customPublishInitSteps: [] sourceBuildPipelineDefinitionId: '' sourceBuildPipelineRunId: '' + versionsRepoRef: null + overrideImageInfoCommit: false stages: - template: /eng/common/templates/stages/publish.yml@self @@ -20,6 +22,8 @@ stages: isStandalonePublish: ${{ parameters.isStandalonePublish }} sourceBuildPipelineDefinitionId: ${{ parameters.sourceBuildPipelineDefinitionId }} sourceBuildPipelineRunId: ${{ parameters.sourceBuildPipelineRunId }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} + overrideImageInfoCommit: ${{ parameters.overrideImageInfoCommit }} customPublishInitSteps: - pwsh: | diff --git a/eng/common/templates/stages/publish.yml b/eng/common/templates/stages/publish.yml index e1a3ec9c..18e7c492 100644 --- a/eng/common/templates/stages/publish.yml +++ b/eng/common/templates/stages/publish.yml @@ -14,13 +14,24 @@ parameters: sourceBuildPipelineDefinitionId: '' sourceBuildPipelineRunId: '' + versionsRepoRef: null + versionsRepoPath: "versions" + + # When true, any updated images will have the SHA in their commit URL updated + # to the commit that this pipeline is running on, instead of the commit they + # were built from. Use in combination with isStandalonePublish to ensure that + # internally built images still reference public Dockerfiles. + overrideImageInfoCommit: false + ################################################################################ # Publish Images ################################################################################ stages: - ${{ if eq(parameters.isInternalServicingValidation, 'false') }}: - stage: Publish - ${{ if not(parameters.isStandalonePublish) }}: + ${{ if eq(parameters.isStandalonePublish, true) }}: + dependsOn: [] + ${{ else }}: ${{ if and(eq(variables['System.TeamProject'], parameters.internalProjectName), ne(variables['Build.Reason'], 'PullRequest')) }}: dependsOn: Test ${{ else }}: @@ -63,3 +74,6 @@ stages: customInitSteps: ${{ parameters.customPublishInitSteps }} sourceBuildPipelineDefinitionId: ${{ parameters.sourceBuildPipelineDefinitionId }} sourceBuildPipelineRunId: ${{ parameters.sourceBuildPipelineRunId }} + versionsRepoRef: ${{ parameters.versionsRepoRef }} + versionsRepoPath: ${{ parameters.versionsRepoPath }} + overrideImageInfoCommit: ${{ parameters.overrideImageInfoCommit }} diff --git a/eng/common/templates/stages/setup-service-connections.yml b/eng/common/templates/stages/setup-service-connections.yml index 7d125125..f4c74ead 100644 --- a/eng/common/templates/stages/setup-service-connections.yml +++ b/eng/common/templates/stages/setup-service-connections.yml @@ -22,7 +22,7 @@ stages: displayName: Setup service connections pool: ${{ parameters.pool }} steps: - + - checkout: none - ${{ each serviceConnection in parameters.serviceConnections }}: - task: AzureCLI@2 displayName: Setup ${{ serviceConnection.name }} diff --git a/eng/common/templates/steps/init-matrix-build-publish.yml b/eng/common/templates/steps/init-matrix-build-publish.yml new file mode 100644 index 00000000..95408c66 --- /dev/null +++ b/eng/common/templates/steps/init-matrix-build-publish.yml @@ -0,0 +1,77 @@ +# Initialize common variables used in +# - Generating build matrix +# - Building images +# - Running tests +# - Publishing images + +parameters: + versionsRepoRef: "" + versionsRepoPath: "versions" + +steps: +- checkout: self +- ${{ if ne(parameters.versionsRepoRef, '') }}: + - checkout: ${{ parameters.versionsRepoRef }} + path: s/${{ parameters.versionsRepoPath }} + persistCredentials: true + fetchDepth: 1 + condition: and(succeeded(), eq(variables['publishImageInfo'], 'true')) +- powershell: | + $commonMatrixAndBuildOptions = "--source-repo $(publicGitRepoUri)" + if ("$(System.TeamProject)" -eq "internal" -and "$(Build.Reason)" -ne "PullRequest") { + $commonMatrixAndBuildOptions = "$commonMatrixAndBuildOptions --source-repo-prefix $(mirrorRepoPrefix) --registry-override $(acr-staging.server)" + } + + if ("$(System.TeamProject)" -eq "public" -and "$(public-mirror.server)" -ne "") { + $commonMatrixAndBuildOptions = "$commonMatrixAndBuildOptions --base-override-regex '^(?!mcr\.microsoft\.com)' --base-override-sub '$(public-mirror.server)/'" + } + + if ("${{ parameters.versionsRepoRef }}" -ne "") { + $versionsBasePath = "${{ parameters.versionsRepoPath }}/" + $pipelineDisabledCache = "false" + + $pathSeparatorIndex = "$(Build.Repository.Name)".IndexOf("/") + if ($pathSeparatorIndex -ge 0) { + $buildRepoName = "$(Build.Repository.Name)".Substring($pathSeparatorIndex + 1) + } + else { + $buildRepoName = "$(Build.Repository.Name)" + } + + $engCommonPath = "$(Build.Repository.LocalPath)/$buildRepoName/$(engCommonRelativePath)" + + $engPath = "$(Build.Repository.LocalPath)/$buildRepoName/eng" + $manifest = "$buildRepoName/$(manifest)" + $testResultsDirectory = "$buildRepoName/$testResultsDirectory" + + if ("$(testScriptPath)") { + $testScriptPath = "$buildRepoName/$(testScriptPath)" + } + + echo "##vso[task.setvariable variable=buildRepoName]$buildRepoName" + echo "##vso[task.setvariable variable=engCommonPath]$engCommonPath" + echo "##vso[task.setvariable variable=manifest]$manifest" + echo "##vso[task.setvariable variable=engPath]$engPath" + echo "##vso[task.setvariable variable=testScriptPath]$testScriptPath" + echo "##vso[task.setvariable variable=testResultsDirectory]$testResultsDirectory" + } + else { + $versionsBasePath = "" + $pipelineDisabledCache = "true" + } + + echo "##vso[task.setvariable variable=commonMatrixAndBuildOptions]$commonMatrixAndBuildOptions" + echo "##vso[task.setvariable variable=versionsBasePath]$versionsBasePath" + echo "##vso[task.setvariable variable=pipelineDisabledCache]$pipelineDisabledCache" + displayName: Set Common Variables for Matrix, Build, and Publish + +- ${{ if ne(parameters.versionsRepoRef, '') }}: + # Special logic is needed to copy the tsaoptions.json file to a well known location for the 1ES PT. + # This template has multiple checkouts and AzDO doesn't have support for dynamically determining the + # default repo path therefore the 1es-official logic can't calculate the repo's tsa config file path. + - task: CopyFiles@2 + displayName: Copy TSA Config + inputs: + SourceFolder: '$(Build.Repository.LocalPath)/$(buildRepoName)' + Contents: '.config/tsaoptions.json' + TargetFolder: '$(Build.SourcesDirectory)' diff --git a/eng/common/templates/variables/docker-images.yml b/eng/common/templates/variables/docker-images.yml index 8740ceac..74f59646 100644 --- a/eng/common/templates/variables/docker-images.yml +++ b/eng/common/templates/variables/docker-images.yml @@ -1,5 +1,5 @@ variables: - imageNames.imageBuilderName: mcr.microsoft.com/dotnet-buildtools/image-builder:2746495 + imageNames.imageBuilderName: mcr.microsoft.com/dotnet-buildtools/image-builder:2766581 imageNames.imageBuilder: $(imageNames.imageBuilderName) imageNames.imageBuilder.withrepo: imagebuilder-withrepo:$(Build.BuildId)-$(System.JobId) imageNames.testRunner: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux3.0-docker-testrunner diff --git a/eng/common/templates/variables/dotnet/build-test-publish.yml b/eng/common/templates/variables/dotnet/build-test-publish.yml index 49e3a9f2..005018a0 100644 --- a/eng/common/templates/variables/dotnet/build-test-publish.yml +++ b/eng/common/templates/variables/dotnet/build-test-publish.yml @@ -23,11 +23,6 @@ variables: - name: officialRepoPrefixes value: public/,internal/private/,unlisted/ -- name: mcrDocsRepoInfo.authArgs - value: >- - --gh-private-key '$(GitHubApp-NET-Docker-MAR-Docs-Updater-PrivateKey)' - --gh-app-client-id '$(gitHubApp.marDocsUpdater.clientId)' - --gh-app-installation-id '$(gitHubApp.marDocsUpdater.microsoft.installationId)' - name: mcrDocsRepoInfo.userName value: $(gitHubApp.marDocsUpdater.userName) - name: mcrDocsRepoInfo.email @@ -39,8 +34,12 @@ variables: value: dotnet - name: gitHubNotificationsRepoInfo.repo value: dotnet-docker-internal +# $(gitHubNotificationsRepoInfo.authArgs) is needed by the "Post Publish +# Notification" step in eng/common/templates/jobs/publish.yml#L271, even during +# a dry-run. This value is a placeholder that gets replaced when referencing +# the secrets.yml variable template. - name: gitHubNotificationsRepoInfo.authArgs - value: --gh-token '$(BotAccount-dotnet-docker-bot-PAT)' + value: --gh-token 'placeholder' - name: gitHubVersionsRepoInfo.org value: dotnet @@ -50,8 +49,6 @@ variables: value: main - name: gitHubVersionsRepoInfo.path value: ${{ variables.commonVersionsImageInfoPath }} -- name: gitHubVersionsRepoInfo.authArgs - value: --gh-token '$(BotAccount-dotnet-docker-bot-PAT)' - name: gitHubVersionsRepoInfo.userName value: $(dotnetDockerBot.userName) - name: gitHubVersionsRepoInfo.email diff --git a/eng/common/templates/variables/dotnet/common.yml b/eng/common/templates/variables/dotnet/common.yml index 895dbd46..69665b24 100644 --- a/eng/common/templates/variables/dotnet/common.yml +++ b/eng/common/templates/variables/dotnet/common.yml @@ -15,8 +15,13 @@ variables: value: public - name: internalProjectName value: internal + +# $(dockerHubRegistryCreds) is needed by the copy-base-images step in +# eng/common/templates/stages/build-and-test.yml#L73-L78, even during a dry-run. +# This is a placeholder that gets replaced when referencing the secrets.yml +# variable template. - name: dockerHubRegistryCreds - value: --registry-creds 'docker.io=$(dotnetDockerHubBot.userName);$(BotAccount-dotnet-dockerhub-bot-PAT)' + value: --registry-creds 'docker.io=placeholder;placeholder' - name: linuxAmd64InternalPoolImage value: 1es-ubuntu-2204 @@ -66,5 +71,3 @@ variables: value: Docker-2025-${{ variables['System.TeamProject'] }} - group: DotNet-Docker-Common-2 -- ${{ if eq(variables['System.TeamProject'], 'internal') }}: - - group: DotNet-Docker-Secrets diff --git a/eng/common/templates/variables/dotnet/secrets.yml b/eng/common/templates/variables/dotnet/secrets.yml new file mode 100644 index 00000000..0224c441 --- /dev/null +++ b/eng/common/templates/variables/dotnet/secrets.yml @@ -0,0 +1,17 @@ +variables: +- group: DotNet-Docker-Secrets + +- name: dockerHubRegistryCreds + value: --registry-creds 'docker.io=$(dotnetDockerHubBot.userName);$(BotAccount-dotnet-dockerhub-bot-PAT)' + +- name: gitHubNotificationsRepoInfo.authArgs + value: --gh-token '$(BotAccount-dotnet-docker-bot-PAT)' + +- name: gitHubVersionsRepoInfo.authArgs + value: --gh-token '$(BotAccount-dotnet-docker-bot-PAT)' + +- name: mcrDocsRepoInfo.authArgs + value: >- + --gh-private-key '$(GitHubApp-NET-Docker-MAR-Docs-Updater-PrivateKey)' + --gh-app-client-id '$(gitHubApp.marDocsUpdater.clientId)' + --gh-app-installation-id '$(gitHubApp.marDocsUpdater.microsoft.installationId)' From 9c771d43d6e535a671025099b93e39b8eba3e9d8 Mon Sep 17 00:00:00 2001 From: Logan Bussell Date: Tue, 12 Aug 2025 13:39:50 -0700 Subject: [PATCH 2/2] Add pipeline references to secrets variable template --- eng/pipelines/dotnet-framework-samples.yml | 1 + eng/pipelines/dotnet-framework.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/eng/pipelines/dotnet-framework-samples.yml b/eng/pipelines/dotnet-framework-samples.yml index 49d400f6..0d1d1a96 100644 --- a/eng/pipelines/dotnet-framework-samples.yml +++ b/eng/pipelines/dotnet-framework-samples.yml @@ -22,6 +22,7 @@ variables: - template: /eng/pipelines/variables/common.yml@self parameters: sourceBuildPipelineRunId: ${{ parameters.sourceBuildPipelineRunId }} +- template: /eng/common/templates/variables/dotnet/secrets.yml@self - name: manifest value: manifest.samples.json - name: imageInfoVariant diff --git a/eng/pipelines/dotnet-framework.yml b/eng/pipelines/dotnet-framework.yml index 23b6a2c0..adae5912 100644 --- a/eng/pipelines/dotnet-framework.yml +++ b/eng/pipelines/dotnet-framework.yml @@ -22,6 +22,7 @@ variables: - template: /eng/pipelines/variables/common.yml@self parameters: sourceBuildPipelineRunId: ${{ parameters.sourceBuildPipelineRunId }} +- template: /eng/common/templates/variables/dotnet/secrets.yml@self - name: manifest value: manifest.json - name: mcrImageIngestionTimeout