手动触发安装器流水线时获取对应分支/提交构建工件的问题
解决手动触发安装器流水线获取对应分支/提交构建工件的问题
问题分析
你手动触发安装器流水线时,当前DownloadPipelineArtifact@2任务未指定目标分支,导致无法关联对应分支的构建,出现PipelineId from non-trigerringBuild错误,且无法通过硬编码方式适配不同分支/提交。
解决方案
场景1:基于所选分支获取最新构建工件
直接利用安装器流水线触发时的分支变量,指定要下载的构建分支:
修改后的任务配置:
- task: DownloadPipelineArtifact@2 inputs: source: specific project: '$(System.TeamProjectId)' pipeline: 23 path: '$(System.ArtifactsDirectory)' artifact: 'drop' runVersion: 'latestFromBranch' runBranch: '$(Build.SourceBranch)' # 指定触发安装器流水线时选择的分支
$(Build.SourceBranch)会自动获取你手动触发时所选的分支,任务将据此找到流水线23中该分支的最新成功构建工件。
场景2:基于所选提交哈希获取对应构建工件
若手动触发时选择了特定提交,需先通过API查询该提交对应的构建ID,再下载工件:
- 添加PowerShell任务查询构建ID
- task: PowerShell@2 inputs: targetType: 'inline' script: | $headers = @{ Authorization = "Bearer $(System.AccessToken)" } $apiUrl = "https://dev.azure.com/$(System.TeamProjectId)/$(System.TeamProject)/_apis/build/builds?definitions=23&commitId=$(Build.SourceVersion)&statusFilter=completed&resultFilter=succeeded&api-version=7.1-preview.7" $buildResponse = Invoke-RestMethod -Uri $apiUrl -Headers $headers -Method Get if ($buildResponse.value.Count -gt 0) { $targetBuildId = $buildResponse.value[0].id Write-Host "##vso[task.setvariable variable=TargetBuildId]$targetBuildId" } else { throw "未找到流水线23中与提交 $(Build.SourceVersion) 对应的成功构建" }
- 使用获取到的构建ID下载工件
- task: DownloadPipelineArtifact@2 inputs: source: specific project: '$(System.TeamProjectId)' pipeline: 23 path: '$(System.ArtifactsDirectory)' artifact: 'drop' runVersion: 'specific' runId: '$(TargetBuildId)' # 引用上一步获取的构建ID
$(Build.SourceVersion)会自动获取手动触发时所选的提交哈希,API将查询流水线23中该提交对应的成功构建,获取ID后用于下载对应工件。
注意:确保安装器流水线的服务账号拥有读取构建的权限,
$(System.AccessToken)默认具备该权限,若出现权限问题需检查项目权限配置。
内容的提问来源于stack exchange,提问作者Todilo
相关产品推荐
相关产品推荐

