From a8e04546a6db5552d52dfcd91788b21348c980c9 Mon Sep 17 00:00:00 2001 From: Parker Bibus Date: Thu, 11 Jun 2026 15:35:30 -0700 Subject: [PATCH 1/4] Generalize upload-build-artifacts-job.yml for multi-tenant BCS uploads * Add repoName parameter (defaults to 'runtime' for back-compat) that controls the {repoName} segment of the BCS blob path. Lets non-runtime perf-build pipelines (starting with dotnet/aspnetcore) upload to builds/{repoName}/buildArtifacts/{sha}/{configKey}/{file}. * Add optional poolName/poolImage/poolOs parameters to templates/upload-build-artifacts-job.yml. The historical runtime callsite passes none, preserving the old behavior; pipelines extending 1ES.Official (which requires every job to declare a pool) pass them explicitly. * Add 5 aspnetcore dispatch cases to upload-build-artifacts-jobs.yml for aspnetcore_{x64,arm64}_linux and aspnetcore_{x64,arm64,x86}_windows. dependencyJobName values match the jobName declared in the corresponding dotnet/aspnetcore perf-build.yml; artifactName values match the artifact `name:` published by those build jobs. The dotnet/runtime perf-build.yml callsite needs no changes: repoName defaults to 'runtime' and no pool* parameters are passed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../templates/upload-build-artifacts-job.yml | 42 +++- eng/pipelines/upload-build-artifacts-jobs.yml | 189 ++++++++++++++++-- 2 files changed, 214 insertions(+), 17 deletions(-) diff --git a/eng/pipelines/templates/upload-build-artifacts-job.yml b/eng/pipelines/templates/upload-build-artifacts-job.yml index d5cfca201ae..a5aecb486f3 100644 --- a/eng/pipelines/templates/upload-build-artifacts-job.yml +++ b/eng/pipelines/templates/upload-build-artifacts-job.yml @@ -2,19 +2,42 @@ parameters: buildType: '' dependencyJobName: '' artifacts: [] + # repoName controls the {repoName} segment of the BCS blob path: + # builds/{repoName}/buildArtifacts/{sha}/{buildType}/{file} + # Defaults to 'runtime' for back-compat with the existing runtime perf-build pipeline. + # Callers building a different repo (e.g. dotnet/aspnetcore) pass repoName explicitly + # so that the upload lands at a tenant-specific path the indexer/crank then read. + repoName: 'runtime' + # Optional pool. When poolName is omitted the upload job inherits the pipeline + # default (the historical runtime perf-build behavior). Callers that extend the + # 1ES.Official template (e.g. aspnetcore perf-build) must specify a pool because + # 1ES.Official requires every job to declare one; for those callers pass: + # poolName: $(DncEngInternalBuildPool) + # poolImage: 1es-ubuntu-2204 + # poolOs: linux + poolName: '' + poolImage: '' + poolOs: '' jobs: - ${{ each artifact in parameters.artifacts }}: - job: UploadBuildArtifact_${{ artifact.artifactName }} displayName: 'Upload Build Artifact ${{ artifact.artifactName }}\' condition: eq(stageDependencies.Build.${{ parameters.dependencyJobName }}.result, 'Succeeded') + ${{ if parameters.poolName }}: + pool: + name: ${{ parameters.poolName }} + ${{ if parameters.poolImage }}: + image: ${{ parameters.poolImage }} + ${{ if parameters.poolOs }}: + os: ${{ parameters.poolOs }} steps: - checkout: none - download: current displayName: Download Build Artifact ${{ artifact.artifactName }} artifact: ${{ artifact.artifactName }} - ${{ each fileName in artifact.files }}: - - script: echo "pvscmdupload/\$web/builds/runtime/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/${{ fileName }}" + - script: echo "pvscmdupload/\$web/builds/${{ parameters.repoName }}/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/${{ fileName }}" displayName: 'Artifact upload path' - task: AzureCLI@2 displayName: 'Upload ${{ fileName }} file' @@ -23,4 +46,19 @@ jobs: scriptType: 'pscore' scriptLocation: 'inlineScript' inlineScript: | - az storage blob upload --auth-mode login --account-name pvscmdupload --container-name '$web' --file "$(Pipeline.Workspace)/${{ artifact.artifactName }}/${{ fileName }}" --name "builds/runtime/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/${{ fileName }}" --overwrite true + az storage blob upload --auth-mode login --account-name pvscmdupload --container-name '$web' --file "$(Pipeline.Workspace)/${{ artifact.artifactName }}/${{ fileName }}" --name "builds/${{ parameters.repoName }}/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/${{ fileName }}" --overwrite true + - checkout: none + - download: current + displayName: Download Build Artifact ${{ artifact.artifactName }} + artifact: ${{ artifact.artifactName }} + - ${{ each fileName in artifact.files }}: + - script: echo "pvscmdupload/\$web/builds/${{ parameters.repoName }}/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/${{ fileName }}" + displayName: 'Artifact upload path' + - task: AzureCLI@2 + displayName: 'Upload ${{ fileName }} file' + inputs: + azureSubscription: '.NET Performance (790c4451-dad9-4fda-af8b-10bd9ca328fa)' + scriptType: 'pscore' + scriptLocation: 'inlineScript' + inlineScript: | + az storage blob upload --auth-mode login --account-name pvscmdupload --container-name '$web' --file "$(Pipeline.Workspace)/${{ artifact.artifactName }}/${{ fileName }}" --name "builds/${{ parameters.repoName }}/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/${{ fileName }}" --overwrite true diff --git a/eng/pipelines/upload-build-artifacts-jobs.yml b/eng/pipelines/upload-build-artifacts-jobs.yml index d734eecef78..c25d8e69c16 100644 --- a/eng/pipelines/upload-build-artifacts-jobs.yml +++ b/eng/pipelines/upload-build-artifacts-jobs.yml @@ -3,6 +3,21 @@ parameters: performanceRepoAlias: self buildType: [] mauiFramework: '' + # repoName is forwarded into the BCS blob path (builds/{repoName}/buildArtifacts/...) + # by each upload-build-artifacts-job.yml invocation. Defaults to 'runtime' for + # back-compat with the existing dotnet/runtime perf-build pipeline; callers from + # other tenants (e.g. dotnet/aspnetcore) pass repoName explicitly. + repoName: 'runtime' + # Optional pool. When poolName is omitted the upload job inherits the pipeline + # default (the historical runtime callers' behavior). Callers that extend the + # 1ES.Official template (e.g. aspnetcore perf-build) must specify a pool because + # 1ES.Official requires every job to declare one; for those callers pass: + # poolName: $(DncEngInternalBuildPool) + # poolImage: 1es-ubuntu-2204 + # poolOs: linux + poolName: '' + poolImage: '' + poolOs: '' jobs: - ${{ if containsValue(parameters.buildType, 'coreclr_arm64_linux') }}: @@ -10,134 +25,194 @@ jobs: parameters: buildType: 'coreclr_arm64_linux' dependencyJobName: build_linux_arm64_release_coreclr + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_arm64_Release_coreclr' files: [ 'BuildArtifacts_linux_arm64_Release_coreclr.tar.gz' ] - + - ${{ if containsValue(parameters.buildType, 'coreclr_arm64_windows') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'coreclr_arm64_windows' dependencyJobName: build_windows_arm64_release_coreclr + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_windows_arm64_Release_coreclr' files: [ 'BuildArtifacts_windows_arm64_Release_coreclr.zip' ] - + - ${{ if containsValue(parameters.buildType, 'coreclr_x64_linux') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'coreclr_x64_linux' dependencyJobName: build_linux_x64_release_coreclr + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_x64_Release_coreclr' files: [ 'BuildArtifacts_linux_x64_Release_coreclr.tar.gz' ] - + - ${{ if containsValue(parameters.buildType, 'coreclr_x64_windows') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'coreclr_x64_windows' dependencyJobName: build_windows_x64_release_coreclr + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_windows_x64_Release_coreclr' files: [ 'BuildArtifacts_windows_x64_Release_coreclr.zip' ] - + - ${{ if containsValue(parameters.buildType, 'coreclr_x86_windows') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'coreclr_x86_windows' dependencyJobName: build_windows_x86_release_coreclr + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_windows_x86_Release_coreclr' files: [ 'BuildArtifacts_windows_x86_Release_coreclr.zip' ] - + - ${{ if containsValue(parameters.buildType, 'coreclr_arm64_android') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'coreclr_arm64_android' dependencyJobName: build_android_arm64_release_AndroidCoreCLR + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'AndroidHelloWorldArm64CoreCLR' files: [ 'AndroidHelloWorldArm64CoreCLR.tar.gz' ] - + - ${{ if containsValue(parameters.buildType, 'wasm') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'wasm' dependencyJobName: build_browser_wasm_linux_Release_wasm + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BrowserWasm' files: [ 'BrowserWasm.tar.gz' ] - + - ${{ if containsValue(parameters.buildType, 'monoAot_arm64_linux') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'monoAot_arm64_linux' dependencyJobName: build_linux_arm64_release_AOT + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'LinuxMonoAOTarm64' files: [ 'LinuxMonoAOTarm64.tar.gz' ] - + - ${{ if containsValue(parameters.buildType, 'monoAot_x64_linux') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'monoAot_x64_linux' dependencyJobName: build_linux_x64_release_AOT + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'LinuxMonoAOTx64' files: [ 'LinuxMonoAOTx64.tar.gz' ] - + - ${{ if containsValue(parameters.buildType, 'mono_x64_linux') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'mono_x64_linux' dependencyJobName: build_linux_x64_release_mono + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_x64_Release_mono' files: [ 'BuildArtifacts_linux_x64_Release_mono.tar.gz' ] - + - ${{ if containsValue(parameters.buildType, 'mono_arm64_linux') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'mono_arm64_linux' dependencyJobName: build_linux_arm64_release_mono + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_arm64_Release_mono' files: [ 'BuildArtifacts_linux_arm64_Release_mono.tar.gz' ] - + - ${{ if containsValue(parameters.buildType, 'mono_arm64_android') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'mono_arm64_android' dependencyJobName: build_android_arm64_release_AndroidMono + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'AndroidHelloWorldArm64Mono' files: [ 'AndroidHelloWorldArm64Mono.tar.gz' ] - + - ${{ if containsValue(parameters.buildType, 'mono_arm64_ios') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'mono_arm64_ios' dependencyJobName: build_ios_arm64_release_iOSMono + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'iOSSampleAppMonoFullAOTLLVMNoSymbols' files: [ 'iOSSampleAppMonoFullAOTLLVMNoSymbols.zip' ] - artifactName: 'iOSSampleAppMonoFullAOTNoLLVMNoSymbols' files: [ 'iOSSampleAppMonoFullAOTNoLLVMNoSymbols.zip' ] - + - ${{ if containsValue(parameters.buildType, 'monoBDN_arm64_android') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'monoBDN_arm64_android' dependencyJobName: build_ios_arm64_release_PerfBDNApp #build_android_arm64_release_Mono_Packs + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'AndroidBDNApk' files: [ 'AndroidBDNApk.tar.gz' ] - + - ${{ if containsValue(parameters.buildType, 'nativeAot_arm64_ios') }}: - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} parameters: buildType: 'nativeAot_arm64_ios' dependencyJobName: build_ios_arm64_release_iOSNativeAOT + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'iOSSampleAppNativeAOTNoSymbols' files: [ 'iOSSampleAppNativeAOTNoSymbols.zip' ] @@ -147,6 +222,10 @@ jobs: parameters: buildType: 'coreclr_arm64_ios' dependencyJobName: build_ios_arm64_release_iOSCoreCLR + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'iOSSampleAppCoreCLRInterpreterNoSymbols' files: [ 'iOSSampleAppCoreCLRInterpreterNoSymbols.zip' ] @@ -158,6 +237,10 @@ jobs: parameters: buildType: 'wasm_coreclr' dependencyJobName: build_browser_wasm_linux_Release_wasm_coreclr + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BrowserWasmCoreCLR' files: [ 'BrowserWasmCoreCLR.tar.gz' ] @@ -167,6 +250,82 @@ jobs: parameters: buildType: 'coreclr_r2r_interpreter' dependencyJobName: build_linux_x64_release_coreclr_r2r_interpreter + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_x64_Release_coreclr_r2r_interpreter' - files: [ 'BuildArtifacts_linux_x64_Release_coreclr_r2r_interpreter.tar.gz' ] \ No newline at end of file + files: [ 'BuildArtifacts_linux_x64_Release_coreclr_r2r_interpreter.tar.gz' ] + + # =========================================================================== + # ASP.NET Core upload cases (consumed by dotnet/aspnetcore's perf-build + # pipeline). The dependencyJobName values mirror the jobName parameters used + # in dotnet/aspnetcore/.azure/pipelines/perf-build.yml. The artifactName + # values must match the artifact `name:` field published by those build jobs. + # =========================================================================== + + - ${{ if containsValue(parameters.buildType, 'aspnetcore_x64_linux') }}: + - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} + parameters: + buildType: 'aspnetcore_x64_linux' + dependencyJobName: Linux_x64_build + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} + artifacts: + - artifactName: 'BuildArtifacts_linux_x64_Release_aspnetcore' + files: [ 'BuildArtifacts_linux_x64_Release_aspnetcore.tar.gz' ] + + - ${{ if containsValue(parameters.buildType, 'aspnetcore_arm64_linux') }}: + - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} + parameters: + buildType: 'aspnetcore_arm64_linux' + dependencyJobName: Linux_arm64_build + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} + artifacts: + - artifactName: 'BuildArtifacts_linux_arm64_Release_aspnetcore' + files: [ 'BuildArtifacts_linux_arm64_Release_aspnetcore.tar.gz' ] + + - ${{ if containsValue(parameters.buildType, 'aspnetcore_x64_windows') }}: + - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} + parameters: + buildType: 'aspnetcore_x64_windows' + dependencyJobName: Windows_build + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} + artifacts: + - artifactName: 'BuildArtifacts_windows_x64_Release_aspnetcore' + files: [ 'BuildArtifacts_windows_x64_Release_aspnetcore.zip' ] + + - ${{ if containsValue(parameters.buildType, 'aspnetcore_arm64_windows') }}: + - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} + parameters: + buildType: 'aspnetcore_arm64_windows' + dependencyJobName: Windows_build + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} + artifacts: + - artifactName: 'BuildArtifacts_windows_arm64_Release_aspnetcore' + files: [ 'BuildArtifacts_windows_arm64_Release_aspnetcore.zip' ] + + - ${{ if containsValue(parameters.buildType, 'aspnetcore_x86_windows') }}: + - template: /eng/pipelines/templates/upload-build-artifacts-job.yml@${{ parameters.performanceRepoAlias }} + parameters: + buildType: 'aspnetcore_x86_windows' + dependencyJobName: Windows_build + repoName: ${{ parameters.repoName }} + poolName: ${{ parameters.poolName }} + poolImage: ${{ parameters.poolImage }} + poolOs: ${{ parameters.poolOs }} + artifacts: + - artifactName: 'BuildArtifacts_windows_x86_Release_aspnetcore' + files: [ 'BuildArtifacts_windows_x86_Release_aspnetcore.zip' ] From c22c304eb68ad6b57043a652b2883c3176fca5db Mon Sep 17 00:00:00 2001 From: Parker Bibus Date: Thu, 11 Jun 2026 16:02:15 -0700 Subject: [PATCH 2/4] Parameterize register-build-job.yml with repoName MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mirrors the repoName parameterization added to upload-build-artifacts-job.yml in the prior commit. Aspnetcore (and any other future tenant) needs its per-configKey buildInfo.json markers to land under builds/aspnetcore/... to match the layout written by the upload primitive — otherwise crank/UI tooling that reads buildInfo.json would have to special-case the path. Defaults to 'runtime' so the existing dotnet/runtime perf-build callsite is unaffected. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- eng/pipelines/register-build-jobs.yml | 8 ++++++++ eng/pipelines/templates/register-build-job.yml | 8 +++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/eng/pipelines/register-build-jobs.yml b/eng/pipelines/register-build-jobs.yml index de7da9a05f2..7b3aa53a1bd 100644 --- a/eng/pipelines/register-build-jobs.yml +++ b/eng/pipelines/register-build-jobs.yml @@ -3,6 +3,13 @@ parameters: performanceRepoAlias: self buildType: [] mauiFramework: '' + # repoName is forwarded into each register-build-job invocation so the + # buildInfo.json marker lands under builds/{repoName}/buildArtifacts/..., + # matching the layout written by upload-build-artifacts-job.yml. Defaults + # to 'runtime' for back-compat with the existing dotnet/runtime perf-build + # pipeline; callers from other tenants (e.g. dotnet/aspnetcore) pass + # repoName explicitly. + repoName: 'runtime' jobs: - ${{ each type in parameters.buildType }}: @@ -10,3 +17,4 @@ jobs: parameters: buildType: ${{ type }} buildId: $(Build.BuildId) + repoName: ${{ parameters.repoName }} diff --git a/eng/pipelines/templates/register-build-job.yml b/eng/pipelines/templates/register-build-job.yml index 249d15a5eae..7a275f64f2b 100644 --- a/eng/pipelines/templates/register-build-job.yml +++ b/eng/pipelines/templates/register-build-job.yml @@ -1,6 +1,12 @@ parameters: buildType: '' buildId: '' + # repoName is forwarded into the BCS blob path + # (builds/{repoName}/buildArtifacts/...). Defaults to 'runtime' for + # back-compat with the existing dotnet/runtime perf-build pipeline; + # callers from other tenants (e.g. dotnet/aspnetcore) pass repoName + # explicitly. + repoName: 'runtime' jobs: - job: RegisterBuild_${{ parameters.buildType }} @@ -14,4 +20,4 @@ jobs: scriptType: 'pscore' scriptLocation: 'inlineScript' inlineScript: | - az storage blob upload --auth-mode login --account-name pvscmdupload --container-name '$web' --data '{"buildId":"${{ parameters.buildId }}"}' --name "builds/runtime/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/buildInfo.json" --overwrite true + az storage blob upload --auth-mode login --account-name pvscmdupload --container-name '$web' --data '{"buildId":"${{ parameters.buildId }}"}' --name "builds/${{ parameters.repoName }}/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/buildInfo.json" --overwrite true From 64c6e763b55ba3d8a7a7b9c8002e7de71b13d390 Mon Sep 17 00:00:00 2001 From: Parker Bibus Date: Thu, 11 Jun 2026 16:15:54 -0700 Subject: [PATCH 3/4] Remove accidentally duplicated steps block from upload-build-artifacts-job.yml The original 'Generalize upload-build-artifacts-job.yml for multi-tenant BCS uploads' commit (a8e04546a) inadvertently pasted the entire upload steps block (checkout / download / each fileName / az storage blob upload) twice. Without this fix every per-artifact upload job would download the same pipeline artifact twice and run 'az storage blob upload' twice (--overwrite true so the second upload would no-op or stomp the first, both wasteful and confusing in build logs). Bisecting / cleanup tools that count expected upload steps per build would also report misleading numbers. Drops 15 duplicate lines. No behavioral change vs. the intended single-upload-per-artifact contract that runtime's pipeline relies on today. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../templates/upload-build-artifacts-job.yml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/eng/pipelines/templates/upload-build-artifacts-job.yml b/eng/pipelines/templates/upload-build-artifacts-job.yml index a5aecb486f3..94c2c5b188a 100644 --- a/eng/pipelines/templates/upload-build-artifacts-job.yml +++ b/eng/pipelines/templates/upload-build-artifacts-job.yml @@ -47,18 +47,3 @@ jobs: scriptLocation: 'inlineScript' inlineScript: | az storage blob upload --auth-mode login --account-name pvscmdupload --container-name '$web' --file "$(Pipeline.Workspace)/${{ artifact.artifactName }}/${{ fileName }}" --name "builds/${{ parameters.repoName }}/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/${{ fileName }}" --overwrite true - - checkout: none - - download: current - displayName: Download Build Artifact ${{ artifact.artifactName }} - artifact: ${{ artifact.artifactName }} - - ${{ each fileName in artifact.files }}: - - script: echo "pvscmdupload/\$web/builds/${{ parameters.repoName }}/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/${{ fileName }}" - displayName: 'Artifact upload path' - - task: AzureCLI@2 - displayName: 'Upload ${{ fileName }} file' - inputs: - azureSubscription: '.NET Performance (790c4451-dad9-4fda-af8b-10bd9ca328fa)' - scriptType: 'pscore' - scriptLocation: 'inlineScript' - inlineScript: | - az storage blob upload --auth-mode login --account-name pvscmdupload --container-name '$web' --file "$(Pipeline.Workspace)/${{ artifact.artifactName }}/${{ fileName }}" --name "builds/${{ parameters.repoName }}/buildArtifacts/${{ variables['Build.SourceVersion'] }}/${{ parameters.buildType }}/${{ fileName }}" --overwrite true From 660ec2298de3204865276716be48ee500600b414 Mon Sep 17 00:00:00 2001 From: Parker Bibus Date: Thu, 11 Jun 2026 16:39:45 -0700 Subject: [PATCH 4/4] Drop speculative 1ES pool params from upload templates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When upload-build-artifacts-job.yml was first generalized in a8e04546a, I added optional poolName/poolImage/poolOs params + a conditional `${{ if parameters.poolName }}: pool:` clause anticipating that the aspnetcore perf-build would extend 1ES.Official and therefore need each upload job to declare its own pool (1ES.Official requires it). That requirement is gone: aspnetcore's perf-build.yml no longer extends 1ES.Official — it matches dotnet/runtime's plain non-1ES shape, since these per-commit BCS uploads are private cache content (not signed or redistributed). Neither current caller passes pool params: * dotnet/runtime/eng/pipelines/performance/perf-build.yml -> passes runtimeRepoAlias, performanceRepoAlias, buildType only. * dotnet/aspnetcore/.azure/pipelines/perf-build.yml -> passes performanceRepoAlias, repoName, buildType only. With no caller setting poolName, the `${{ if parameters.poolName }}` clause always evaluates false, so the generated YAML is identical to what we'd produce without the clause. Removing the params and the clause is a pure refactor. Net change in this commit: * upload-build-artifacts-job.yml: -17 lines (param block + pool conditional) * upload-build-artifacts-jobs.yml: -79 lines (param block + 3 passthrough lines x 23 dispatch cases) If a future tenant ever needs 1ES.Official, re-adding these is a few lines of YAML and a one-line caller update — cheap to bring back. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../templates/upload-build-artifacts-job.yml | 17 ---- eng/pipelines/upload-build-artifacts-jobs.yml | 79 ------------------- 2 files changed, 96 deletions(-) diff --git a/eng/pipelines/templates/upload-build-artifacts-job.yml b/eng/pipelines/templates/upload-build-artifacts-job.yml index 94c2c5b188a..54b72ef2c1d 100644 --- a/eng/pipelines/templates/upload-build-artifacts-job.yml +++ b/eng/pipelines/templates/upload-build-artifacts-job.yml @@ -8,29 +8,12 @@ parameters: # Callers building a different repo (e.g. dotnet/aspnetcore) pass repoName explicitly # so that the upload lands at a tenant-specific path the indexer/crank then read. repoName: 'runtime' - # Optional pool. When poolName is omitted the upload job inherits the pipeline - # default (the historical runtime perf-build behavior). Callers that extend the - # 1ES.Official template (e.g. aspnetcore perf-build) must specify a pool because - # 1ES.Official requires every job to declare one; for those callers pass: - # poolName: $(DncEngInternalBuildPool) - # poolImage: 1es-ubuntu-2204 - # poolOs: linux - poolName: '' - poolImage: '' - poolOs: '' jobs: - ${{ each artifact in parameters.artifacts }}: - job: UploadBuildArtifact_${{ artifact.artifactName }} displayName: 'Upload Build Artifact ${{ artifact.artifactName }}\' condition: eq(stageDependencies.Build.${{ parameters.dependencyJobName }}.result, 'Succeeded') - ${{ if parameters.poolName }}: - pool: - name: ${{ parameters.poolName }} - ${{ if parameters.poolImage }}: - image: ${{ parameters.poolImage }} - ${{ if parameters.poolOs }}: - os: ${{ parameters.poolOs }} steps: - checkout: none - download: current diff --git a/eng/pipelines/upload-build-artifacts-jobs.yml b/eng/pipelines/upload-build-artifacts-jobs.yml index c25d8e69c16..9b5f8364ecf 100644 --- a/eng/pipelines/upload-build-artifacts-jobs.yml +++ b/eng/pipelines/upload-build-artifacts-jobs.yml @@ -8,16 +8,6 @@ parameters: # back-compat with the existing dotnet/runtime perf-build pipeline; callers from # other tenants (e.g. dotnet/aspnetcore) pass repoName explicitly. repoName: 'runtime' - # Optional pool. When poolName is omitted the upload job inherits the pipeline - # default (the historical runtime callers' behavior). Callers that extend the - # 1ES.Official template (e.g. aspnetcore perf-build) must specify a pool because - # 1ES.Official requires every job to declare one; for those callers pass: - # poolName: $(DncEngInternalBuildPool) - # poolImage: 1es-ubuntu-2204 - # poolOs: linux - poolName: '' - poolImage: '' - poolOs: '' jobs: - ${{ if containsValue(parameters.buildType, 'coreclr_arm64_linux') }}: @@ -26,9 +16,6 @@ jobs: buildType: 'coreclr_arm64_linux' dependencyJobName: build_linux_arm64_release_coreclr repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_arm64_Release_coreclr' files: [ 'BuildArtifacts_linux_arm64_Release_coreclr.tar.gz' ] @@ -39,9 +26,6 @@ jobs: buildType: 'coreclr_arm64_windows' dependencyJobName: build_windows_arm64_release_coreclr repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_windows_arm64_Release_coreclr' files: [ 'BuildArtifacts_windows_arm64_Release_coreclr.zip' ] @@ -52,9 +36,6 @@ jobs: buildType: 'coreclr_x64_linux' dependencyJobName: build_linux_x64_release_coreclr repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_x64_Release_coreclr' files: [ 'BuildArtifacts_linux_x64_Release_coreclr.tar.gz' ] @@ -65,9 +46,6 @@ jobs: buildType: 'coreclr_x64_windows' dependencyJobName: build_windows_x64_release_coreclr repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_windows_x64_Release_coreclr' files: [ 'BuildArtifacts_windows_x64_Release_coreclr.zip' ] @@ -78,9 +56,6 @@ jobs: buildType: 'coreclr_x86_windows' dependencyJobName: build_windows_x86_release_coreclr repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_windows_x86_Release_coreclr' files: [ 'BuildArtifacts_windows_x86_Release_coreclr.zip' ] @@ -91,9 +66,6 @@ jobs: buildType: 'coreclr_arm64_android' dependencyJobName: build_android_arm64_release_AndroidCoreCLR repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'AndroidHelloWorldArm64CoreCLR' files: [ 'AndroidHelloWorldArm64CoreCLR.tar.gz' ] @@ -104,9 +76,6 @@ jobs: buildType: 'wasm' dependencyJobName: build_browser_wasm_linux_Release_wasm repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BrowserWasm' files: [ 'BrowserWasm.tar.gz' ] @@ -117,9 +86,6 @@ jobs: buildType: 'monoAot_arm64_linux' dependencyJobName: build_linux_arm64_release_AOT repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'LinuxMonoAOTarm64' files: [ 'LinuxMonoAOTarm64.tar.gz' ] @@ -130,9 +96,6 @@ jobs: buildType: 'monoAot_x64_linux' dependencyJobName: build_linux_x64_release_AOT repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'LinuxMonoAOTx64' files: [ 'LinuxMonoAOTx64.tar.gz' ] @@ -143,9 +106,6 @@ jobs: buildType: 'mono_x64_linux' dependencyJobName: build_linux_x64_release_mono repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_x64_Release_mono' files: [ 'BuildArtifacts_linux_x64_Release_mono.tar.gz' ] @@ -156,9 +116,6 @@ jobs: buildType: 'mono_arm64_linux' dependencyJobName: build_linux_arm64_release_mono repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_arm64_Release_mono' files: [ 'BuildArtifacts_linux_arm64_Release_mono.tar.gz' ] @@ -169,9 +126,6 @@ jobs: buildType: 'mono_arm64_android' dependencyJobName: build_android_arm64_release_AndroidMono repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'AndroidHelloWorldArm64Mono' files: [ 'AndroidHelloWorldArm64Mono.tar.gz' ] @@ -182,9 +136,6 @@ jobs: buildType: 'mono_arm64_ios' dependencyJobName: build_ios_arm64_release_iOSMono repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'iOSSampleAppMonoFullAOTLLVMNoSymbols' files: [ 'iOSSampleAppMonoFullAOTLLVMNoSymbols.zip' ] @@ -197,9 +148,6 @@ jobs: buildType: 'monoBDN_arm64_android' dependencyJobName: build_ios_arm64_release_PerfBDNApp #build_android_arm64_release_Mono_Packs repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'AndroidBDNApk' files: [ 'AndroidBDNApk.tar.gz' ] @@ -210,9 +158,6 @@ jobs: buildType: 'nativeAot_arm64_ios' dependencyJobName: build_ios_arm64_release_iOSNativeAOT repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'iOSSampleAppNativeAOTNoSymbols' files: [ 'iOSSampleAppNativeAOTNoSymbols.zip' ] @@ -223,9 +168,6 @@ jobs: buildType: 'coreclr_arm64_ios' dependencyJobName: build_ios_arm64_release_iOSCoreCLR repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'iOSSampleAppCoreCLRInterpreterNoSymbols' files: [ 'iOSSampleAppCoreCLRInterpreterNoSymbols.zip' ] @@ -238,9 +180,6 @@ jobs: buildType: 'wasm_coreclr' dependencyJobName: build_browser_wasm_linux_Release_wasm_coreclr repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BrowserWasmCoreCLR' files: [ 'BrowserWasmCoreCLR.tar.gz' ] @@ -251,9 +190,6 @@ jobs: buildType: 'coreclr_r2r_interpreter' dependencyJobName: build_linux_x64_release_coreclr_r2r_interpreter repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_x64_Release_coreclr_r2r_interpreter' files: [ 'BuildArtifacts_linux_x64_Release_coreclr_r2r_interpreter.tar.gz' ] @@ -271,9 +207,6 @@ jobs: buildType: 'aspnetcore_x64_linux' dependencyJobName: Linux_x64_build repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_x64_Release_aspnetcore' files: [ 'BuildArtifacts_linux_x64_Release_aspnetcore.tar.gz' ] @@ -284,9 +217,6 @@ jobs: buildType: 'aspnetcore_arm64_linux' dependencyJobName: Linux_arm64_build repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_linux_arm64_Release_aspnetcore' files: [ 'BuildArtifacts_linux_arm64_Release_aspnetcore.tar.gz' ] @@ -297,9 +227,6 @@ jobs: buildType: 'aspnetcore_x64_windows' dependencyJobName: Windows_build repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_windows_x64_Release_aspnetcore' files: [ 'BuildArtifacts_windows_x64_Release_aspnetcore.zip' ] @@ -310,9 +237,6 @@ jobs: buildType: 'aspnetcore_arm64_windows' dependencyJobName: Windows_build repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_windows_arm64_Release_aspnetcore' files: [ 'BuildArtifacts_windows_arm64_Release_aspnetcore.zip' ] @@ -323,9 +247,6 @@ jobs: buildType: 'aspnetcore_x86_windows' dependencyJobName: Windows_build repoName: ${{ parameters.repoName }} - poolName: ${{ parameters.poolName }} - poolImage: ${{ parameters.poolImage }} - poolOs: ${{ parameters.poolOs }} artifacts: - artifactName: 'BuildArtifacts_windows_x86_Release_aspnetcore' files: [ 'BuildArtifacts_windows_x86_Release_aspnetcore.zip' ]