如何让流水线环境同步显示触发流水线的分支名作为构建名
问题
我拥有两条流水线及两个代码仓库:一条流水线负责构建Docker镜像并推送至镜像仓库,另一条则使用K8s配置将应用部署至K8s集群。同时我使用dev、test、prod三个流水线环境,希望在环境状态概览中同时查看配置仓库(config-repo)的分支名与应用仓库(application-repo)的分支名。
我在流水线中设置构建名为:
name: $(Build.Sourcebranch)-$(RESOURCES.PIPELINE.BUILDPIPELINECI.sourceBranch)
触发流水线的定义如下:
resources: pipelines: - pipeline: buildpipelineCI source: XXXweb-CI trigger: true branch: ${{variables['Build.SourceBranch']}}
此时构建名包含特殊字符,我添加了一段Bash脚本动态修改构建名:
- task: Bash@3 displayName: 'Set build number' inputs: targetType: 'inline' script: | newbuildnumber=$(Build.SourceBranch)-$(RESOURCES.PIPELINE.BUILDPIPELINECI.sourceBranch) newbuildnumber=${newbuildnumber////_} echo $newbuildnumber echo "##vso[build.updatebuildnumber]$newbuildnumber"
修改后构建名显示正常,但环境中仍显示最初的旧构建名。请问如何让环境中显示触发仓库的分支名?
解决方案
环境概览里显示的构建名是流水线初始化阶段生成的原始值,后续通过##vso[build.updatebuildnumber]更新的构建号不会同步到环境记录中。可以通过以下两种方式解决:
1. 提前处理分支名特殊字符,直接生成合法构建名
无需等到运行阶段修改,直接在流水线定义的name字段中用表达式替换特殊字符,让初始化的构建名就是最终要展示的内容,环境会直接读取这个值:
name: ${{ replace(variables['Build.SourceBranch'], '/', '_') }}-${{ replace(resources.pipeline.buildpipelineCI.sourceBranch, '/', '_') }}
这种方式利用Azure Pipelines的replace表达式语法,在编译阶段就把分支名里的/替换成_,生成合法且符合需求的构建名,完全不需要后续脚本修改。
2. 部署时显式更新环境关联的构建信息(兼容运行时修改场景)
如果必须在运行阶段动态生成构建名,可在部署任务前添加命令,强制更新环境记录的构建号:
- task: Bash@3 displayName: 'Update environment build info' inputs: targetType: 'inline' script: | newbuildnumber=$(Build.SourceBranch)-$(RESOURCES.PIPELINE.BUILDPIPELINECI.sourceBranch) newbuildnumber=${newbuildnumber////_} echo "##vso[environment.updateenvironment]buildNumber=$newbuildnumber"
注:此方法兼容性不如第一种,部分场景下环境记录可能不会实时同步,优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者Viktor Eriksson
相关产品推荐
相关产品推荐

