変数グループとテンプレートを使用したAzureパイプライン変数での予期しない動作

Aug 25 2020

Terraform by MSDevLabs拡張機能とAzureResourceManagerサービス接続を使用してTerraformデプロイメントを実行するAzureDevOpsYAMLパイプラインがあります。

最後の動作状態はパイプラインテンプレートの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 KrzysztofMadej Aug 25 2020 at 07:57

$()構文を使用して、アーム接続をテンプレートに渡しました。

テンプレートファイル:

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-grouparmConnection変数が含まれています