使用变量组和模板的Azure管道变量的意外行为

时间:2020-08-24 15:01:48

标签: azure azure-devops azure-pipelines

我有一个Azure DevOps YAML管道,可以使用Terraform by MS DevLabs扩展和Azure Resource Manager服务连接来执行Terraform部署。

最后一个工作状态是使用管道模板yaml文件,但是我必须在模板中配置一个参数,然后使用模板表达式语法调用该变量。

...
...
stages:
- stage: Plan
  displayName: Terrafom Plan
  jobs:  
  - job: DEV PLAN
    displayName: Plan (DEV)
    pool:
      vmImage: "ubuntu-latest"
    variables:
      az_service_connection: "MyServiceConnection"
      tf_environment: "DEV"
      tf_state_rg: "DEV"
      tz_state_location: "canadacentral"
      tf_state_stgacct_name: "mystorageaccuontname1231231"
      tf_state_container_name: "tfstate"
    steps:
    - template: templates/terraform-plan.yml
      parameters:
        az_service_connection: ${{ variables.az_service_connection }}
...
...
steps:
  - task: terraformInstaller@0
    displayName: "Install Terraform $(tf_version)"
    inputs:
      terraformVersion: $(tf_version)
  - task: TerraformTaskV1@0
    displayName: "Run > terraform init"
    inputs:
      command: "init"
      commandOptions: "-input=false"
      backendServiceArm: ${{ parameters.az_service_connection }}
...
...

我认为之所以可行,是因为模板表达式语法${{ variables.varname}}在编译时与运行时进行评估。如果我不这样做,我要么将$(az_service_connection)传递到backendServiceArm输入中,要么将其设置为空值。

随着变量组的引入,我现在面临着类似的行为。我希望变量组在模板表达式变量之后求值,这会导致${{ variables.az_service_connection }}具有空值。我不确定如何使它工作。

如何将变量组与使用服务连接的管道模板一起使用?

1 个答案:

答案 0 :(得分:1)

我使用import React, { Component } from 'react'; class App extends Component { render() { const greeting = 'Welcome to React'; return ( <div> <Greeting greeting={greeting} /> </div> ); } } class Greeting extends Component { render() { return <h1>{this.props.greeting}</h1>; } } export default App; 语法将手臂连接传递给模板:

模板文件:

$()

主文件:

parameters:
- name: 'instances'
  type: object
  default: {}
- name: 'server'
  type: string
  default: ''
- name: 'armConnection'
  type: string
  default: ''

steps:
- task: TerraformTaskV1@0
  inputs:
    provider: 'azurerm'
    command: 'init'
    backendServiceArm: '${{ parameters.armConnection }}'
    backendAzureRmResourceGroupName: 'TheCodeManual'
    backendAzureRmStorageAccountName: 'thecodemanual'
    backendAzureRmContainerName: 'infra'
    backendAzureRmKey: 'some-terrform'
- ${{ each instance in parameters.instances }}:
  - script: echo ${{ parameters.server }}:${{ instance }}

注意:组trigger: branches: include: - master paths: include: - stackoverflow/09-array-parameter-for-template/* # no PR triggers pr: none pool: vmImage: 'ubuntu-latest' variables: - group: my-variable-group - name: my-passed-variable value: $[variables.myhello] # uses runtime expression steps: - template: template.yaml parameters: instances: - test1 - test2 server: $(myhello) armConnection: $(armConnection) 包含my-variable-group变量