如何在经典发布成功部署至指定阶段后为构建添加标签
替代Artefact Tagger任务实现构建自动标签管理
核心实现方案
用PowerShell任务调用Azure DevOps REST API,完成「移除旧标签→添加新标签」的流程,确保每个构建仅保留对应环境的最新标签。
1. 添加PowerShell任务到目标阶段
在需要触发标签操作的[Env]阶段末尾,添加PowerShell任务,并设置任务为「仅在阶段成功时运行」。
2. 内联脚本代码
脚本会自动处理指定构件的标签更新,按需替换占位符即可:
# 基础配置 $collectionUri = "$(System.TeamFoundationCollectionUri)" $projectName = "$(System.TeamProject)" $targetTag = "Latest-$(Env)" # 自定义标签格式,比如Latest-Prod $accessToken = "$(System.AccessToken)" # === 处理单个构件(示例:构件名称为MyApp) === $buildId = "$(Release.Artifacts.MyApp.BuildId)" # 移除旧标签(不存在则静默跳过) $removeTagUrl = "$collectionUri$projectName/_apis/build/builds/$buildId/tags/$targetTag`?api-version=7.1-preview.1" Invoke-RestMethod -Uri $removeTagUrl -Method Delete -Headers @{Authorization = "Bearer $accessToken"} -ErrorAction SilentlyContinue # 添加新标签 $addTagUrl = "$collectionUri$projectName/_apis/build/builds/$buildId/tags`?api-version=7.1-preview.1" $body = @($targetTag) | ConvertTo-Json Invoke-RestMethod -Uri $addTagUrl -Method Post -Headers @{Authorization = "Bearer $accessToken"; "Content-Type" = "application/json"} -Body $body
3. 多构件处理
如果发布包含多个构件,复制上述构件处理代码块,修改Release.Artifacts.<ArtifactName>.BuildId中的<ArtifactName>即可,比如:
# 处理第二个构件MyService $buildId2 = "$(Release.Artifacts.MyService.BuildId)" $removeTagUrl2 = "$collectionUri$projectName/_apis/build/builds/$buildId2/tags/$targetTag`?api-version=7.1-preview.1" Invoke-RestMethod -Uri $removeTagUrl2 -Method Delete -Headers @{Authorization = "Bearer $accessToken"} -ErrorAction SilentlyContinue $addTagUrl2 = "$collectionUri$projectName/_apis/build/builds/$buildId2/tags`?api-version=7.1-preview.1" Invoke-RestMethod -Uri $addTagUrl2 -Method Post -Headers @{Authorization = "Bearer $accessToken"; "Content-Type" = "application/json"} -Body $body
4. 权限配置
确保构建服务账户拥有编辑构建权限:
- 进入项目设置 → 权限 → 构建权限
- 找到「构建服务(<项目名称>)」账户,赋予「编辑构建」权限
关键说明
-ErrorAction SilentlyContinue:避免因旧标签不存在导致脚本中断- API版本
7.1-preview.1为当前稳定支持标签操作的版本,可根据Azure DevOps版本调整 - 标签命名可自定义,便于后续在发布管道中按标签筛选构建
内容的提问来源于stack exchange,提问作者karthik
相关产品推荐
相关产品推荐

