如何在YAML模板Deployment作业中使用变量组值作为环境及服务连接名
问题解答
结论
你当前的写法无法实现需求,运行会直接报错。
原因说明
Azure DevOps YAML流水线的处理分为两个独立阶段:
- 编译期:展开模板、解析
${{ }}格式的表达式、校验参数合法性。这个阶段变量组还未加载,$(xxx)格式的运行时变量不会被解析,只会被当做普通字符串处理。 - 运行期:加载变量组取值、解析
$(xxx)格式的变量、执行作业步骤。
你当前的写法里,把变量组里才有的$(azure_environment_name)等值传给模板参数,又在模板里用${{ parameters.environmentName }}引用,编译期无法拿到实际值,会直接触发参数校验失败、环境名不合法等错误。
可行的改造方案
调整模板逻辑,不要将环境名、服务连接作为模板参数传递,直接在作业和步骤中使用运行时变量即可,改造后的代码如下:
调整deployment.dev.yml配置
parameters: - name: variableGroups type: object default: [] stages: - stage: Deployment variables: - ${{ each value in parameters.variableGroups }}: - group: ${{ value }} jobs: - template: /templates/jobs/deployToKubernetes.yml parameters: variableGroups: ${{ parameters.variableGroups }}
调整deployToKubernetes.yml配置
parameters: - name: variableGroups type: object default: [] jobs: # 部署作业名称使用编译期可确定的固定值即可 - deployment: DeployToKubernetes # 环境名称直接使用运行时变量解析 environment: $(azure_environment_name) variables: - ${{ each value in parameters.variableGroups }}: - group: ${{ value }} strategy: runOnce: deploy: steps: - download: none - task: KubernetesManifest@0 displayName: Create Secret inputs: action: 'createSecret' # 直接引用运行时变量作为服务连接取值 kubernetesServiceConnection: $(serviceConnection_kubernetes) namespace: 'value' secretType: 'dockerRegistry' secretName: 'value' dockerRegistryEndpoint: $(serviceConnection_dockerRegistry) - task: KubernetesManifest@0 displayName: Deploy to Kubernetes cluster inputs: action: 'deploy' kubernetesServiceConnection: $(serviceConnection_kubernetes) namespace: 'value' manifests: 'value'
注意事项
- 你需要提前在Azure DevOps项目中创建好变量组取值对应的环境,否则运行时会报环境不存在或无权限的错误
- 变量组中存储的服务连接名称必须和实际创建的服务连接名称完全一致,且流水线服务账号有该服务连接的使用权限
- 原模板中对environmentName的可选值校验是编译期校验,改用运行时变量后无法自动校验,你可以在步骤最前面加一个自定义脚本校验
$(azure_environment_name)的取值是否符合要求。
内容的提问来源于stack exchange,提问作者ayfer
相关产品推荐
相关产品推荐

