Azure Pipelines で variable を使ってみる

# yaml 中に variable を定義する
yaml 中で定義される variable にはスコープがあり、スコープ外の variable は参照できない。
次のように定義する。

```yml
variables:
  - name: pipeline_var
    value: 'yaml-pipeline-val'

stages:
- stage: var_test_stage
  displayName: var test stage
  variables:
  - name: stage_var
    value: 'yaml-stage-val'

  jobs:
  - job: var_test_job
    pool:
      vmImage: 'windows-latest'
    variables:
    - name: job_var
      value: 'yaml-job-val'
```

- Pipeline レベルの variable : pipeline_var
- Stage レベルの variable : stage_var
- Job レベルのvariable : job_var

# variable が展開される順番
Azure Pipelines の variable は以下の順番で展開される。
1. yaml 中の Job レベルで定義された variable
2. yaml 中の Stage レベルで定義された variable
3. yaml 中の Pipeline レベルで定義された variable
4. UI で定義されて "settable at queue time (実行時に設定可能)" の variable
5. UI で定義された variable

# yaml 中で variable を参照する
yaml 中で variable を参照する方法は 3 つあり、それぞれ処理されるタイミングが異なる。
### macro syntax
書式 : \$(var)
処理のタイミング : 実行時
実行例

```yml
    - task: CmdLine@2
      displayName: reference variables with macro syntax
      inputs:
        script: |
         echo reference variables with macro syntax
         echo pipeline_var : $(pipeline_var)
         echo stage_var : $(stage_var)
         echo job_var : $(job_var)
         echo ui_var : $(ui_var)
```

実行結果
すべての variable を参照することができる

```txt
reference variables with macro syntax
pipeline_var : yaml-pipeline-val
stage_var : yaml-stage-val
job_var : yaml-job-val
ui_var : ui_val
```

### template expression syntax
書式 : \${{variables.var}} または ${{variables['var']}}
処理のタイミング : コンパイル時
実行例

```yml
    - task: CmdLine@2
      displayName: reference variables with template expression syntax
      inputs:
        script: |
         echo reference variables with template expression syntax
         echo pipeline_var : ${{variables.pipeline_var}} or ${{variables['pipeline_var']}}
         echo stage_var : ${{variables.stage_var}} or ${{variables['stage_var']}}
         echo job_var : ${{variables.job_var}} or ${{variables['job_var']}}
         echo ui_var : ${{variables.ui_var}} or ${{variables['ui_var']}}
```

実行結果
UI で定義された variable は参照できず空になっている。

```txt
reference variables with template expression syntax
pipeline_var : yaml-pipeline-val or yaml-pipeline-val
stage_var : yaml-stage-val or yaml-stage-val
job_var : yaml-job-val or yaml-job-val
ui_var :  or

```

### runtime expression syntax
書式 : \$[variables.var]
処理のタイミング : 実行時
実行例

```yml
    - task: CmdLine@2
      displayName: reference variables with runtime expression syntax
      inputs:
        script: |
         echo reference variables with runtime expression syntax
         echo pipeline_var : $[variables.pipeline_var]
         echo stage_var : $[variables.stage_var]
         echo job_var : $[variables.job_var]
         echo ui_var : $[variables.ui_var]
```

実行結果
macro syntax のときと異なり、そもそも variable として処理されずに文字列として扱われる。

```txt
reference variables with runtime expression syntax
pipeline_var : $[variables.pipeline_var]
stage_var : $[variables.stage_var]
job_var : $[variables.job_var]
ui_var : $[variables.ui_var]
```

上記の方法と別に variable は環境変数として参照することもできる。
スクリプトを yaml に直接書かずに、スクリプトファイルを参照するときはこの方法を使う。

書式 : %VAR% (Windows コマンドラインの場合)

実行例

```yml
    - task: CmdLine@2
      displayName: reference as environment variables
      inputs:
        script: |
         echo reference as environment variables
         echo pipeline_var : %PIPELINE_VAR%
         echo stage_var : %STAGE_VAR%
         echo job_var : %JOB_VAR%
         echo ui_var : %UI_VAR%
```

実行結果
すべての variable を参照することができる

```yml
reference as environment variables
pipeline_var : yaml-pipeline-val
stage_var : yaml-stage-val
job_var : yaml-job-val
ui_var : ui_val
```

# 参考
[Define variables](https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch)

検証用 yaml

```yml
# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger: none

variables:
  - name: pipeline_var
    value: 'yaml-pipeline-val'

stages:
- stage: var_test_stage
  displayName: var test stage
  variables:
  - name: stage_var
    value: 'yaml-stage-val'

  jobs:
  - job: var_test_job
    pool:
      vmImage: 'windows-latest'
    variables:
    - name: job_var
      value: 'yaml-job-val'
    
    steps:
    - task: CmdLine@2
      displayName: reference variables with macro syntax
      inputs:
        script: |
         echo reference variables with macro syntax
         echo pipeline_var : $(pipeline_var)
         echo stage_var : $(stage_var)
         echo job_var : $(job_var)
         echo ui_var : $(ui_var)

    - task: CmdLine@2
      displayName: reference variables with template expression syntax
      inputs:
        script: |
         echo reference variables with template expression syntax
         echo pipeline_var : ${{variables.pipeline_var}} or ${{variables['pipeline_var']}}
         echo stage_var : ${{variables.stage_var}} or ${{variables['stage_var']}}
         echo job_var : ${{variables.job_var}} or ${{variables['job_var']}}
         echo ui_var : ${{variables.ui_var}} or ${{variables['ui_var']}}
    - task: CmdLine@2
      displayName: reference variables with runtime expression syntax
      inputs:
        script: |
         echo reference variables with runtime expression syntax
         echo pipeline_var : $[variables.pipeline_var]
         echo stage_var : $[variables.stage_var]
         echo job_var : $[variables.job_var]
         echo ui_var : $[variables.ui_var]

    - task: CmdLine@2
      displayName: reference as environment variables
      inputs:
        script: |
         echo reference as environment variables
         echo pipeline_var : %PIPELINE_VAR%
         echo stage_var : %STAGE_VAR%
         echo job_var : %JOB_VAR%
         echo ui_var : %UI_VAR%
```