如何让Azure Pipeline变量存储构建ID,未设置时默认取最新构建
Azure Pipeline 跨流水线拉取工件:指定ID或默认最新构建
核心逻辑
当用户指定了artifactBuildId时,拉取对应构建的工件;若未指定,则自动调用Azure DevOps API获取目标流水线的最新成功完成构建的ID,再拉取其工件。
具体实现步骤
- 定义基础变量:在流水线中声明用户可输入的
artifactBuildId(默认空)、目标流水线的定义ID和项目名称。 - 动态获取最新构建ID:通过PowerShell调用Azure DevOps Build API,仅当
artifactBuildId为空时执行此步骤,将获取到的最新构建ID存入临时变量。 - 条件下载工件:在下载工件任务中,根据
artifactBuildId是否为空,选择使用用户指定ID或动态获取的最新ID。
YAML 示例代码
variables: # 用户可手动输入的构建ID,留空则自动拉取最新 artifactBuildId: '' # 替换为你的目标流水线定义ID(在流水线编辑页URL中可找到) targetPipelineDefinitionId: '123' # 替换为你的Azure DevOps项目名称 projectName: 'YourProjectName' # 替换为要拉取的工件名称 artifactName: 'YourPublishedArtifact' steps: - task: PowerShell@2 displayName: '获取目标流水线最新成功构建ID' # 仅当artifactBuildId为空时执行 condition: eq(variables.artifactBuildId, '') inputs: targetType: 'inline' script: | # 构建API请求URL,过滤已完成且成功的构建,取最新1条 $apiUrl = "$(System.TeamFoundationCollectionUri)$(projectName)/_apis/build/builds?definitions=$(targetPipelineDefinitionId)&statusFilter=completed&resultFilter=succeeded&top=1&api-version=7.1-preview.7" # 调用API,使用系统自动生成的访问令牌 $buildResponse = Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Method Get # 提取最新构建ID并设置为流水线变量 $latestBuildId = $buildResponse.value[0].id Write-Host "##vso[task.setvariable variable=latestBuildId]$latestBuildId" Write-Host "已获取最新成功构建ID:$latestBuildId" - task: DownloadPipelineArtifact@2 displayName: '下载目标流水线工件' inputs: buildType: 'specific' project: '$(projectName)' definition: '$(targetPipelineDefinitionId)' buildVersionToDownload: 'specific' # 条件选择构建ID:若artifactBuildId非空则用指定值,否则用最新ID buildId: ${{ if eq(variables.artifactBuildId, '') }}: $(latestBuildId) ${{ else }}: $(artifactBuildId) artifactName: '$(artifactName)' targetPath: '$(Pipeline.Workspace)/artifacts'
关键注意事项
- 权限配置:确保当前流水线的服务账号(Project Build Service)对目标流水线拥有读取权限,否则API调用会返回403错误。可在项目设置→权限→流水线权限中配置。
- API参数调整:可根据需求修改API的过滤条件,比如去掉
resultFilter=succeeded来允许拉取失败构建,或调整top=1获取更多构建。 - 变量作用域:PowerShell中通过
##vso[task.setvariable]设置的latestBuildId为任务级变量,后续任务可直接引用。 - 流水线定义ID:可在目标流水线的编辑页面URL中找到,格式为
.../build/definition?id=xxx,其中xxx就是定义ID。
内容的提问来源于stack exchange,提问作者Sterling Chargois
相关产品推荐
相关产品推荐

