如何在YAML流水线脚本中正确获取$(rev:.r)变量?
问题分析与解决方案
核心原因
$(rev:.r)是Azure DevOps的特殊预定义变量,仅能在流水线的name字段中直接解析,无法在自定义变量(比如你定义的lowerversion)中被正确解析。当你在自定义变量里引用它时,它会被当作原始字符串$(rev:.r)处理,最终导致构建号包含$、:这类Azure DevOps不允许的字符,触发报错。而$(Build.BuildId)是普通预定义变量,在自定义变量中可以正常解析。
解决方案
方案1:直接在name字段中拼接修订号
把$(rev:.r)从自定义变量移到name字段里,利用name字段的特殊解析逻辑处理这个变量:
variables: - group: NumVersion - name: upperversion ${{ if eq(parameters.VersionBuild,'ReleaseProd') }}: value: $(1-VersionMajeur).$(2-VersionMineure-ReleaseProd) ${{ if eq(parameters.VersionBuild,'Release') }}: value: $(1-VersionMajeur).$(2-VersionMineure-Release) ${{ if eq(parameters.VersionBuild,'Develop') }}: value: $(1-VersionMajeur).$(2-VersionMineure-Dev) - name: lowerversion ${{ if eq(parameters.TypeBuild,'Feature') }}: value: 99.$(Build.BuildId) ${{ if eq(parameters.TypeBuild,'Production') }}: value: $(3-VersionCorrective-Release) # 根据TypeBuild参数动态拼接修订号 name: ${{ if eq(parameters.TypeBuild,'Feature') }}$(upperversion).$(lowerversion) ${{ else }}$(upperversion).$(lowerversion).$(rev:.r) stages: - stage: Build jobs: - job: Prerequisites displayName: Prerequisites steps: - checkout: self # 后续任务中直接用$(Build.BuildNumber)即可获取完整构建号 - script: | echo "完整构建号:$(Build.BuildNumber)"
方案2:用脚本动态生成并更新构建号
如果需要在自定义变量中更灵活地控制版本号,可以用脚本动态生成包含修订号的版本,再通过日志命令更新构建号,同时将版本号存入变量供后续任务使用:
variables: - group: NumVersion - name: upperversion ${{ if eq(parameters.VersionBuild,'ReleaseProd') }}: value: $(1-VersionMajeur).$(2-VersionMineure-ReleaseProd) ${{ if eq(parameters.VersionBuild,'Release') }}: value: $(1-VersionMajeur).$(2-VersionMineure-Release) ${{ if eq(parameters.VersionBuild,'Develop') }}: value: $(1-VersionMajeur).$(2-VersionMineure-Dev) - name: lowerversion ${{ if eq(parameters.TypeBuild,'Feature') }}: value: 99.$(Build.BuildId) ${{ if eq(parameters.TypeBuild,'Production') }}: value: $(3-VersionCorrective-Release) stages: - stage: Build jobs: - job: Prerequisites displayName: Prerequisites steps: - checkout: self - powershell: | # 生成基础版本号 $fullVersion = "$(upperversion).$(lowerversion)" if ("${{ parameters.TypeBuild }}" -eq "Production") { # 拼接修订号 $fullVersion += ".$(rev:.r)" } # 更新构建号 Write-Host "##vso[build.updatebuildnumber]$fullVersion" # 将版本号存入变量供后续任务使用 Write-Host "##vso[task.setvariable variable=FullBuildNumber]$fullVersion" - script: | echo "完整构建号:$(FullBuildNumber)"
关键提示
- 后续任务中如果需要使用完整构建号,直接引用
$(Build.BuildNumber)即可,无需重复生成。 $(rev:.r)的生成逻辑由Azure DevOps自动维护,同版本前缀下每次运行流水线时修订号自增,仅在name字段中能被正确解析为数字。
内容的提问来源于stack exchange,提问作者Goufalite
相关产品推荐
相关产品推荐

