Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
13 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions eng/Version.Details.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
</Dependency>
</ProductDependencies>
<ToolsetDependencies>
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="11.0.0-beta.26059.1">
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="11.0.0-beta.26211.1">
<Uri>https://github.com/dotnet/arcade</Uri>
<Sha>367e3ab44812021f59aaf4c7506d5b4569769eec</Sha>
<Sha>a08169b890573cfd7f949ea9062c86a4db1aab1b</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.XliffTasks" Version="11.0.0-beta.26059.1">
<Dependency Name="Microsoft.DotNet.XliffTasks" Version="11.0.0-beta.26211.1">
<Uri>https://github.com/dotnet/arcade</Uri>
<Sha>367e3ab44812021f59aaf4c7506d5b4569769eec</Sha>
<Sha>a08169b890573cfd7f949ea9062c86a4db1aab1b</Sha>
</Dependency>
<!-- Intermediate is necessary for source build. -->
<Dependency Name="Microsoft.SourceBuild.Intermediate.arcade" Version="10.0.0-beta.24605.1">
Expand Down
2 changes: 2 additions & 0 deletions eng/common/build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Param(
[string][Alias('v')]$verbosity = "minimal",
[string] $msbuildEngine = $null,
[bool] $warnAsError = $true,
[string] $warnNotAsError = '',
[bool] $nodeReuse = $true,
[switch] $buildCheck = $false,
[switch][Alias('r')]$restore,
Expand Down Expand Up @@ -70,6 +71,7 @@ function Print-Usage() {
Write-Host " -excludeCIBinarylog Don't output binary log (short: -nobl)"
Write-Host " -prepareMachine Prepare machine for CI run, clean up processes after build"
Write-Host " -warnAsError <value> Sets warnaserror msbuild parameter ('true' or 'false')"
Write-Host " -warnNotAsError <value> Sets a semi-colon delimited list of warning codes that should not be treated as errors"
Write-Host " -msbuildEngine <value> Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)."
Write-Host " -excludePrereleaseVS Set to exclude build engines in prerelease versions of Visual Studio"
Write-Host " -nativeToolsOnMachine Sets the native tools on machine environment variable (indicating that the script should use native tools on machine)"
Expand Down
6 changes: 6 additions & 0 deletions eng/common/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ usage()
echo " --prepareMachine Prepare machine for CI run, clean up processes after build"
echo " --nodeReuse <value> Sets nodereuse msbuild parameter ('true' or 'false')"
echo " --warnAsError <value> Sets warnaserror msbuild parameter ('true' or 'false')"
echo " --warnNotAsError <value> Sets a semi-colon delimited list of warning codes that should not be treated as errors"
echo " --buildCheck <value> Sets /check msbuild parameter"
echo " --fromVMR Set when building from within the VMR"
echo ""
Expand Down Expand Up @@ -78,6 +79,7 @@ ci=false
clean=false

warn_as_error=true
warn_not_as_error=''
node_reuse=true
build_check=false
binary_log=false
Expand Down Expand Up @@ -176,6 +178,10 @@ while [[ $# -gt 0 ]]; do
warn_as_error=$2
shift
;;
-warnnotaserror)
warn_not_as_error=$2
shift
;;
-nodereuse)
node_reuse=$2
shift
Expand Down
5 changes: 1 addition & 4 deletions eng/common/core-templates/job/job.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ parameters:
enablePublishBuildArtifacts: false
enablePublishBuildAssets: false
enablePublishTestResults: false
enablePublishing: false
enableBuildRetry: false
mergeTestResults: false
testRunTitle: ''
testResultsFormat: ''
name: ''
componentGovernanceSteps: []
preSteps: []
artifactPublishSteps: []
runAsPublic: false
Expand Down Expand Up @@ -152,9 +152,6 @@ jobs:
- ${{ each step in parameters.steps }}:
- ${{ step }}

- ${{ each step in parameters.componentGovernanceSteps }}:
- ${{ step }}

- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- template: /eng/common/core-templates/steps/cleanup-microbuild.yml
parameters:
Expand Down
4 changes: 2 additions & 2 deletions eng/common/core-templates/job/onelocbuild.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ jobs:
# We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
name: AzurePipelines-EO
image: 1ESPT-Windows2022
image: 1ESPT-Windows2025
demands: Cmd
os: windows
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
name: $(DncEngInternalBuildPool)
image: 1es-windows-2022
image: windows.vs2026.amd64
os: windows

steps:
Expand Down
16 changes: 9 additions & 7 deletions eng/common/core-templates/job/publish-build-assets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,13 @@ jobs:
# We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
name: AzurePipelines-EO
image: 1ESPT-Windows2022
image: 1ESPT-Windows2025
demands: Cmd
os: windows
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
name: NetCore1ESPool-Publishing-Internal
image: windows.vs2019.amd64
image: windows.vs2026.amd64
os: windows
steps:
- ${{ if eq(parameters.is1ESPipeline, '') }}:
Expand Down Expand Up @@ -172,17 +172,18 @@ jobs:
targetPath: '$(Build.ArtifactStagingDirectory)/MergedManifest.xml'
artifactName: AssetManifests
displayName: 'Publish Merged Manifest'
retryCountOnTaskFailure: 10 # for any logs being locked
sbomEnabled: false # we don't need SBOM for logs
retryCountOnTaskFailure: 10 # for any files being locked
isProduction: false # just metadata for publishing

- template: /eng/common/core-templates/steps/publish-build-artifacts.yml
- template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml
parameters:
is1ESPipeline: ${{ parameters.is1ESPipeline }}
args:
displayName: Publish ReleaseConfigs Artifact
pathToPublish: '$(Build.StagingDirectory)/ReleaseConfigs'
publishLocation: Container
targetPath: '$(Build.StagingDirectory)/ReleaseConfigs'
artifactName: ReleaseConfigs
retryCountOnTaskFailure: 10 # for any files being locked
isProduction: false # just metadata for publishing

- ${{ if or(eq(parameters.publishAssetsImmediately, 'true'), eq(parameters.isAssetlessBuild, 'true')) }}:
- template: /eng/common/core-templates/post-build/setup-maestro-vars.yml
Expand Down Expand Up @@ -218,4 +219,5 @@ jobs:
- template: /eng/common/core-templates/steps/publish-logs.yml
parameters:
is1ESPipeline: ${{ parameters.is1ESPipeline }}
StageLabel: 'BuildAssetRegistry'
JobLabel: 'Publish_Artifacts_Logs'
196 changes: 196 additions & 0 deletions eng/common/core-templates/job/renovate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
# --------------------------------------------------------------------------------------
# Renovate Bot Job Template
# --------------------------------------------------------------------------------------
# This Azure DevOps pipeline job template runs Renovate (https://docs.renovatebot.com/)
# to automatically update dependencies in a GitHub repository.
#
# Renovate scans the repository for dependency files and creates pull requests to update
# outdated dependencies based on the configuration specified in the renovateConfigPath
# parameter.
#
# Usage:
# For each product repo wanting to make use of Renovate, this template is called from
# an internal Azure DevOps pipeline, typically with a schedule trigger, to check for
# and propose dependency updates.
#
# For more info, see https://github.com/dotnet/arcade/blob/main/Documentation/Renovate.md
# --------------------------------------------------------------------------------------

parameters:

# Path to the Renovate configuration file within the repository.
- name: renovateConfigPath
type: string
default: 'eng/renovate.json'

# GitHub repository to run Renovate against, in the format 'owner/repo'.
# This could technically be any repo but convention is to target the same
# repo that contains the calling pipeline. The Renovate config file would
# be co-located with the pipeline's repo and, in most cases, the config
# file is specific to the repo being targeted.
- name: gitHubRepo
type: string

# List of base branches to target for Renovate PRs.
# NOTE: The Renovate configuration file is always read from the branch where the
# pipeline is run, NOT from the target branches specified here. If you need different
# configurations for different branches, run the pipeline from each branch separately.
- name: baseBranches
type: object
default:
- main

# When true, Renovate will run in dry run mode, which previews changes without creating PRs.
# See the 'Run Renovate' step log output for details of what would have been changed.
- name: dryRun
type: boolean
default: false

# By default, Renovate will not recreate a PR for a given dependency/version pair that was
# previously closed. This allows opting in to always recreating PRs even if they were
# previously closed.
- name: forceRecreatePR
type: boolean
default: false

# Name of the arcade repository resource in the pipeline.
# This allows repos which haven't been onboarded to Arcade to still use this
# template by checking out the repo as a resource with a custom name and pointing
# this parameter to it.
- name: arcadeRepoResource
type: string
default: self

# Directory name for the self repo under $(Build.SourcesDirectory) in multi-checkout.
# In multi-checkout (when arcadeRepoResource != 'self'), Azure DevOps checks out the
# self repo to $(Build.SourcesDirectory)/<repoName>. Set this to match the auto-generated
# directory name. Using the auto-generated name is necessary rather than explicitly
# defining a checkout path because container jobs expect repos to live under the agent's
# workspace ($(Pipeline.Workspace)). On some self-hosted setups the host path
# (e.g., /mnt/vss/_work) differs from the container path (e.g., /__w), and a custom checkout
# path can fail validation. Using the default checkout location keeps the paths consistent
# and avoids this issue.
- name: selfRepoName
type: string
default: ''
- name: arcadeRepoName
type: string
default: ''

# Pool configuration for the job.
- name: pool
type: object
default:
name: NetCore1ESPool-Internal
image: build.azurelinux.3.amd64
os: linux

jobs:
- job: Renovate
displayName: Run Renovate
container: RenovateContainer
variables:
- group: dotnet-renovate-bot
# The Renovate version is automatically updated by https://github.com/dotnet/arcade/blob/main/azure-pipelines-renovate.yml.
# Changing the variable name here would require updating the name in https://github.com/dotnet/arcade/blob/main/eng/renovate.json as well.
- name: renovateVersion
value: '42'
readonly: true
- name: renovateLogFilePath
value: '$(Build.ArtifactStagingDirectory)/renovate.json'
readonly: true
- name: dryRunArg
readonly: true
${{ if eq(parameters.dryRun, true) }}:
value: 'full'
${{ else }}:
value: ''
- name: recreateWhenArg
readonly: true
${{ if eq(parameters.forceRecreatePR, true) }}:
value: 'always'
${{ else }}:
value: ''
# In multi-checkout (without custom paths), Azure DevOps places each repo under
# $(Build.SourcesDirectory)/<repoName>. selfRepoName must be provided in that case.
- name: selfRepoPath
readonly: true
${{ if eq(parameters.arcadeRepoResource, 'self') }}:
value: '$(Build.SourcesDirectory)'
${{ else }}:
value: '$(Build.SourcesDirectory)/${{ parameters.selfRepoName }}'
- name: arcadeRepoPath
readonly: true
${{ if eq(parameters.arcadeRepoResource, 'self') }}:
value: '$(Build.SourcesDirectory)'
${{ else }}:
value: '$(Build.SourcesDirectory)/${{ parameters.arcadeRepoName }}'
pool: ${{ parameters.pool }}

templateContext:
outputParentDirectory: $(Build.ArtifactStagingDirectory)
outputs:
- output: pipelineArtifact
displayName: Publish Renovate Log
condition: succeededOrFailed()
targetPath: $(Build.ArtifactStagingDirectory)
artifactName: $(Agent.JobName)_Logs_Attempt$(System.JobAttempt)
isProduction: false # logs are non-production artifacts

steps:
- checkout: self
fetchDepth: 1

- ${{ if ne(parameters.arcadeRepoResource, 'self') }}:
- checkout: ${{ parameters.arcadeRepoResource }}
fetchDepth: 1

- script: |
renovate-config-validator $(selfRepoPath)/${{parameters.renovateConfigPath}} 2>&1 | tee /tmp/renovate-config-validator.out
validatorExit=${PIPESTATUS[0]}
if grep -q '^ WARN:' /tmp/renovate-config-validator.out; then
echo "##vso[task.logissue type=warning]Renovate config validator produced warnings."
echo "##vso[task.complete result=SucceededWithIssues]"
fi
exit $validatorExit
displayName: Validate Renovate config
env:
LOG_LEVEL: info
LOG_FILE_LEVEL: debug
LOG_FILE: $(Build.ArtifactStagingDirectory)/renovate-config-validator.json

- script: |
. $(arcadeRepoPath)/eng/common/renovate.env
renovate 2>&1 | tee /tmp/renovate.out
renovateExit=${PIPESTATUS[0]}
if grep -q '^ WARN:' /tmp/renovate.out; then
echo "##vso[task.logissue type=warning]Renovate produced warnings."
echo "##vso[task.complete result=SucceededWithIssues]"
fi
exit $renovateExit
displayName: Run Renovate
env:
RENOVATE_FORK_TOKEN: $(BotAccount-dotnet-renovate-bot-PAT)
RENOVATE_TOKEN: $(BotAccount-dotnet-renovate-bot-PAT)
RENOVATE_REPOSITORIES: ${{parameters.gitHubRepo}}
RENOVATE_BASE_BRANCHES: ${{ convertToJson(parameters.baseBranches) }}
RENOVATE_DRY_RUN: $(dryRunArg)
RENOVATE_RECREATE_WHEN: $(recreateWhenArg)
LOG_LEVEL: info
LOG_FILE_LEVEL: debug
LOG_FILE: $(renovateLogFilePath)
RENOVATE_CONFIG_FILE: $(selfRepoPath)/${{parameters.renovateConfigPath}}

- script: |
echo "PRs created by Renovate:"
if [ -s "$(renovateLogFilePath)" ]; then
if ! jq -r 'select(.msg == "PR created" and .pr != null) | "https://github.com/\(.repository)/pull/\(.pr)"' "$(renovateLogFilePath)" | sort -u; then
echo "##vso[task.logissue type=warning]Failed to parse Renovate log file with jq."
echo "##vso[task.complete result=SucceededWithIssues]"
fi
else
echo "##vso[task.logissue type=warning]No Renovate log file found or file is empty."
echo "##vso[task.complete result=SucceededWithIssues]"
fi
displayName: List created PRs
condition: and(succeededOrFailed(), eq('${{ parameters.dryRun }}', false))
8 changes: 4 additions & 4 deletions eng/common/core-templates/job/source-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,19 +60,19 @@ jobs:
pool:
${{ if eq(variables['System.TeamProject'], 'public') }}:
name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore-Svc-Public' ), False, 'NetCore-Public')]
demands: ImageOverride -equals build.ubuntu.2204.amd64
demands: ImageOverride -equals build.azurelinux.3.amd64.open
${{ if eq(variables['System.TeamProject'], 'internal') }}:
name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore1ESPool-Svc-Internal'), False, 'NetCore1ESPool-Internal')]
image: 1es-azurelinux-3
image: build.azurelinux.3.amd64
os: linux
${{ else }}:
pool:
${{ if eq(variables['System.TeamProject'], 'public') }}:
name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore-Svc-Public' ), False, 'NetCore-Public')]
demands: ImageOverride -equals Build.Ubuntu.2204.Amd64.Open
demands: ImageOverride -equals build.azurelinux.3.amd64.open
${{ if eq(variables['System.TeamProject'], 'internal') }}:
name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore1ESPool-Svc-Internal'), False, 'NetCore1ESPool-Internal')]
demands: ImageOverride -equals Build.Ubuntu.2204.Amd64
demands: ImageOverride -equals build.azurelinux.3.amd64
${{ if ne(parameters.platform.pool, '') }}:
pool: ${{ parameters.platform.pool }}

Expand Down
6 changes: 4 additions & 2 deletions eng/common/core-templates/job/source-index-stage1.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ jobs:
variables:
- name: BinlogPath
value: ${{ parameters.binlogPath }}
- name: skipComponentGovernanceDetection
value: true
- template: /eng/common/core-templates/variables/pool-providers.yml
parameters:
is1ESPipeline: ${{ parameters.is1ESPipeline }}
Expand All @@ -25,10 +27,10 @@ jobs:
pool:
${{ if eq(variables['System.TeamProject'], 'public') }}:
name: $(DncEngPublicBuildPool)
image: windows.vs2026preview.scout.amd64.open
image: windows.vs2026.amd64.open
${{ if eq(variables['System.TeamProject'], 'internal') }}:
name: $(DncEngInternalBuildPool)
image: windows.vs2026preview.scout.amd64
image: windows.vs2026.amd64

steps:
- ${{ if eq(parameters.is1ESPipeline, '') }}:
Expand Down
Loading