'In Azure yaml, how to use local variables, conditional variables and template variables together?

Consider the following scenario, on where a job (or stage), needs to use some local, conditional and template variables:

# (1) Local for the yaml file
variables:
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

# (2) Conditional, depending on parameters
variables:
  - ${{ if eq(parameters.environment, 'dev') }}:
    - environment: 'development'
  - ${{ if eq(parameters.environment, 'test') }}:
    - environment: 'test'
  - ${{ if eq(parameters.environment, 'prod') }}:
    - environment: 'production'

# (3) Specific, defined on a template file
variables:
  - template: environment-variables-$(environment).yml

How can I combine these 3?

I need variables that are not environment dependant (1), but some others are environment specific (3), so, I read a different template (2) depending on a "parameter.environment" value.

Obviously, when I try to use "variables tag" more than once, Azure-Devops complains because "variables" is already defined. How could I do it?



Solution 1:[1]

How can I combine these 3?

In Pipeline YAML, variables can only be defined once at a stage or root level.

To meet your requirements, you need to define three type of variables in the same variables field.

Here is an example:

parameters:
- name: environment
  displayName: Test
  type: string
  values:
  - dev
  - test
  - prod

variables:
- name: buildPlatform
  value: 'Any CPU'
- name: buildConfiguration
  value: 'Release'
- template: variables.yml


- ${{ if eq(parameters.environment, 'dev') }}:
  - name: environment
    value: development
- ${{ if eq(parameters.environment, 'test') }}:
  - name: environment
    value: test
- ${{ if eq(parameters.environment, 'prod') }}:
  - name: environment
    value: prod

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1