Share via


スクリプトで変数を設定する

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

パイプラインで PowerShell スクリプトと Bash スクリプトを使用する場合は、将来のタスクで使用可能な変数を設定できると便利です。 新しく設定した変数は、同じタスクでは使用できません。

スクリプトは、カスタム REST API の呼び出しや応答の解析など、タスクではサポートされていない処理が必要な場合に適したものです。

task.setvariable ログ コマンドは、PowerShell および Bash スクリプトの変数を設定する場合に使用します。

注意

デプロイ ジョブでは、出力変数に別の構文を使用します。 デプロイ ジョブでの出力変数のサポートの詳細については、「デプロイ ジョブ」を参照してください。

パイプラインで条件付きの変数を使用する場合は、「条件の指定」を参照してください。

task.setvariable のバージョン情報

task.setvariable で変数を追加すると、次のタスクではマクロ構文 $(myVar)を使用することで、その変数を使用できます。 この変数は、既定では同じジョブ内のタスクでのみ使用できます。 パラメーター isoutput を追加する場合は、変数を呼び出す構文が変化します。 「同じジョブで使用するための出力変数を設定する」を参照してください。

値が myVar の変数 foo を設定します。

- bash: |
    echo "##vso[task.setvariable variable=myVar;]foo"

変数 myVar を読み取ります。

- bash: |
    echo "You can use macro syntax for variables: $(myVar)"

変数のプロパティを設定する

task.setvariable コマンドには、変数をシークレット、出力変数、読み取り専用として設定するためのプロパティが含まれています。 次に、使用可能なプロパティを示します。

  • variable = 変数名 (必須)
  • issecret = ブール値 (オプション、既定値は false)
  • isoutput = ブール値 (オプション、既定値は false)
  • isreadonly = ブール値 (オプション、既定値は false)

次のステージで変数を使用する場合は、isoutput プロパティを true に設定します。 isoutput が true に設定された変数を参照するには、タスク名を含めます。 たとえば、「 $(TaskName.myVar) 」のように入力します。

変数を読み取り専用として設定すると、ダウンストリームのタスクでは上書きできなくなります。 isreadonlytrue に設定します。 変数を読み取り専用に設定すると、その変数は不変になるためセキュリティが強化されます。

変数をシークレットとして設定する

issecret が true に設定されている場合、変数の値はシークレットとして保存され、ログからマスクされます。

Note

Azure Pipelines は、パイプライン ログにデータを出力するときにシークレットをマスクする作業を行うため、シークレットとして設定されていない出力とログに追加でマスクされた変数とデータが表示される場合があります。

シークレット変数 mySecretVal を設定します。

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"

シークレット変数 mySecretVal を取得します。

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
    echo $(mySecretVal)

bash でのシークレット変数の出力。

bash の変数出力のスクリーンショット。

出力変数のレベル

4 種類の出力変数があり、それぞれに構文が異なります。

同じジョブで使用するための出力変数を設定する

同じジョブ内で出力変数を使用する場合は、isoutput プロパティを使用しないようにします。 既定では、変数は同じジョブ内のダウンストリームのステップで使用できます。 ただし、isoutput プロパティを追加した場合は、その変数の参照にはタスク名を指定することが必要になります。

ここに示すスクリプトでは、myJobVar の指定なしで同じジョブの出力変数 isoutput を設定し、myOutputJobVar の指定ありで isoutput=true を設定しています。

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myJobVar]this is the same job"
  - bash: |
     echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
    name: setOutput

このスクリプトは、同じジョブの変数 myJobVarmyOutputJobVar を取得します。 出力変数を参照するための構文は、isoutput=true が追加されると変化する点に注目してください。

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myJobVar]this is the same job"
  - bash: |
     echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
    name: setOutput
  - bash: |
     echo $(myJobVar) 
  - bash: |
     echo $(setOutput.myOutputJobVar)

将来のジョブで使用するための出力変数を設定する

ジョブ間で出力変数を使用する場合は、dependencies を使用して変数を参照します。 将来のジョブまたはステージで出力変数にアクセスするための構文は、その変数のセッターとコンシューマーの関係によって異なります。 それぞれのケースについては、「依存関係」を参照してください。

まず、出力変数 myOutputVar を設定します。

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
    name: passOutput

次に、将来のジョブで myOutputVar にアクセスして、myVarFromJobA 変数として出力します。 dependencies を使用するには、出力変数を設定した過去のジョブの名前を使用して、将来のジョブで dependsOn プロパティを設定する必要があります。

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
    name: passOutput
- job: B
  dependsOn: A
  variables:
    myVarFromJobA: $[ dependencies.A.outputs['passOutput.myOutputVar'] ]  
  steps:
  - bash: |
     echo $(myVarFromJobA)

将来のステージで使用するための出力変数を設定する

出力変数は、パイプラインのステージ間で使用できます。 出力変数は、生成された出力の ID などの有用な情報を、あるステージから次のステージに渡すために使用できます。

isoutput プロパティを使用して変数を設定すると、その変数はタスク名と stageDependencies 構文を使用して、その後のステージで参照できます。 詳細については、「依存関係」を参照してください。

出力変数は、次のダウンストリーム ステージでのみ使用できます。 複数のステージで同じ出力変数を使用する場合は、dependsOn 条件を使用します。

まず、出力変数 myStageVal を設定します。

steps:
  - bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
    name: MyOutputVar

次に、将来のステージで、出力変数 myStageVal をステージ、ジョブ、またはタスク スコープの変数 (例: myStageAVar) にマップします。 マッピング構文では実行時式 $[] を使用し、stageDependencies からステージ名 (A) とジョブ名 (A1) の両方を使用することで完全修飾した出力変数へのパスをトレースします。

stages:
- stage: A
  jobs:
  - job: A1
    steps:
     - bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
       name: MyOutputVar
- stage: B
  dependsOn: A
  jobs:
  - job: B1
    variables:
      myStageAVar: $[stageDependencies.A.A1.outputs['MyOutputVar.myStageVal']]
    steps:
      - bash: echo $(myStageAVar)

値に改行が含まれている場合は、その改行をエスケープできます。エスケープはエージェントによって自動的に解除されます。

steps:
- bash: |
    escape_data() {
      local data=$1
      data="${data//'%'/'%AZP25'}"
      data="${data//$'\n'/'%0A'}"
      data="${data//$'\r'/'%0D'}"
      echo "$data"
    }
    echo "##vso[task.setvariable variable=myStageVal;isOutput=true]$(escape_data $'foo\nbar')"
  name: MyOutputVar

よく寄せられる質問

出力変数がレンダリングされません。 何が問題なのでしょうか。

出力変数が表示されない理由はいくつかあります。

  • isoutput を指定して設定した出力変数は、同じジョブでは使用できなくなる代わりに、ダウンストリーム ジョブでのみ使用できるようになります。
  • どの変数構文を使用したかによって、出力変数の値を設定する変数が実行時に使用できない場合があります。 たとえば、マクロ構文 ($(var)) の変数は、タスクの実行前に処理されます。 それに対して、テンプレート構文の変数は、実行時に処理されます ($[variables.var])。 通常、出力変数を設定するときに実行時構文を使用します。 変数構文の詳細については、「変数の定義」を参照してください。
  • 式に余分な空白が含まれている可能性があります。 変数がレンダリングされない場合は、isOutput=true の周囲に余分なスペースがないかを確認してください。

依存関係の変数を追加し、その変数を印刷することによって、パイプラインジョブまたはステージのdependencies出力をトラブルシューティングできます。 たとえば、このパイプラインジョブAは出力変数MyTaskを設定します。 2番目のジョブ(B)はジョブAに依存します。 新しい変数depsは、ジョブ依存性のJSON表現を保持します。 ジョブBの2番目のステップでは、ジョブ依存性を確認できるように、PowerShellを使用してdepsを出力します。

trigger:
- '*'

pool:
  vmImage: 'ubuntu-latest'
 
jobs:
- job: A
  steps:
    - script: |
        echo "##vso[task.setvariable variable=MyTask;isOutput=true]theoutputval"
      name: ProduceVar  
- job: B
  dependsOn: A
  variables:
    varFromA: $[ dependencies.A.outputs['ProduceVar.MyTask'] ]
    deps: $[convertToJson(dependencies)] # create a variable with the job dependencies
  steps:
  - script: echo $(varFromA) # 
  - powershell: Write-Host "$(deps)"