Azure Pipelines中如何将运行时serviceName变量转为小写存储?
我有一个用于服务部署的azure-pipelines.yml,部署逻辑存放于另一个仓库,简化后的内容如下:
variables: serviceName: $(System.TeamProject) stages: - template: standard-services-pipeline.yml@templates parameters: serviceName: ${{ variables.serviceName }}
需要在另一个仓库的standard-services-pipeline.yml中,将传入的serviceName转换为小写并存储到lowerName变量中,但尝试多种写法均未生效。目标文件的初始写法如下:
parameters: - name: serviceName type: string variables: - name: lowerName value: ${{ lower(parameters.serviceName) }} steps: - script: echo $(lowerName)
详细尝试记录
所有操作均在standard-services-pipeline.yml中进行:
尝试1
parameters: - name: serviceName type: string variables: - name: lowerName value: ${{ lower(parameters.serviceName) }} steps: - script: echo ${{ parameters.serviceName }} # 输出结果:IdentityProvider(原驼峰格式服务名) - script: echo ${{ lower(parameters.serviceName) }} # 输出结果:IdentityProvider(未转换为小写) - script: echo ${{ variables.lowerName }} # 输出结果:IdentityProvider(未转换为小写)
尝试2
parameters: - name: serviceName type: string variables: - name: lowerName value: ${{ lower(parameters.serviceName) }} steps: - script: echo $(variables.lowerName) # 输出结果:IdentityProvider(未转换为小写)
尝试3
parameters: - name: serviceName type: string variables: - name: lowerName value: ${{ lower(parameters.serviceName) }} steps: - script: echo $(lowerName) # 输出结果:IdentityProvider(未转换为小写)
尝试4
parameters: - name: serviceName type: string variables: - name: lowerName value: ${{ lower(parameters.serviceName) }} steps: - script: echo ${{ lower('$(parameters.serviceName)') }} # 脚本内容:echo $(parameters.servicename) # 输出结果:空
尝试5
parameters: - name: serviceName type: string variables: - name: lowerName value: ${{ lower(parameters.serviceName) }} steps: - script: ${{format('{0} {1}', 'echo', '$(lower(parameters.serviceName))')}} # 脚本内容:echo $(lower(parameters.serviceName)) # 报错信息:command substitution: line 2: syntax error near unexpected token `parameters.serviceName'
解决方案
问题核心在于:$(System.TeamProject)是运行时变量,而Azure Pipeline的${{ ... }}表达式属于编译时执行逻辑。编译阶段$(System.TeamProject)尚未被替换为实际项目名称,因此直接用${{ lower(parameters.serviceName) }}处理的是字符串"$(System.TeamProject)",而非实际的项目名。
针对运行时变量的转换需求,可通过以下两种方式解决:
方法1:使用运行时表达式(推荐)
在standard-services-pipeline.yml中,用$[lower()]运行时表达式定义lowerName:
parameters: - name: serviceName type: string variables: - name: lowerName value: $[lower('${{ parameters.serviceName }}')] steps: - script: echo $(lowerName)
逻辑说明:${{ parameters.serviceName }}在编译阶段会被替换为$(System.TeamProject),后续$[lower()]会在运行时将实际的项目名称转换为小写。
方法2:通过脚本生成并设置变量
若方法1不适用,可通过运行时脚本转换值并设置为环境变量,供后续步骤引用:
parameters: - name: serviceName type: string steps: - script: | lowerName=$(echo "${{ parameters.serviceName }}" | tr '[:upper:]' '[:lower:]') echo "##vso[task.setvariable variable=lowerName]$lowerName" displayName: 'Convert serviceName to lowercase' - script: echo $(lowerName)
逻辑说明:脚本在运行时获取实际的serviceName值,通过tr命令转换为小写,再借助Azure Pipeline的日志命令##vso[task.setvariable]将值设置为环境变量,后续步骤可直接通过$(lowerName)引用。
内容的提问来源于stack exchange,提问作者M. Ozn

