Comportamento imprevisto con le variabili di Azure Pipelines tramite gruppi di variabili e modelli

Aug 25 2020

Dispongo di una pipeline YAML di Azure DevOps per eseguire una distribuzione Terraform utilizzando l'estensione Terraform by MS DevLabs e una connessione al servizio Azure Resource Manager.

L'ultimo stato di lavoro era l'utilizzo di un file yaml del modello di pipeline, tuttavia ho dovuto configurare un parametro all'interno del modello e chiamare la variabile utilizzando la sintassi dell'espressione del modello.

...
...
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 }}
...
...

Credo che il motivo per cui funziona è perché la sintassi dell'espressione del modello ${{ variables.varname}}valuta in fase di compilazione rispetto al runtime. Se non lo facessi in questo modo, verrei $(az_service_connection)passato backendServiceArmnell'input o un valore vuoto.

Con l'introduzione dei gruppi di variabili, ora sto affrontando un comportamento simile. Mi aspetto che il gruppo di variabili valuti dopo la variabile dell'espressione del modello che fa sì ${{ variables.az_service_connection }}che abbia un valore vuoto. Non sono sicuro di come farlo funzionare.

Come posso utilizzare i gruppi di variabili con un modello di pipeline che utilizza una connessione di servizio?

Risposte

1 KrzysztofMadej Aug 25 2020 at 07:57

Ho usato la $()sintassi per passare la connessione arm al modello:

File modello:

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 }}

File principale:

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)

Nota: il gruppo my-variable-groupcontiene una armConnectionvariabile