スクリプトで変数を設定する
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
パイプラインで PowerShell スクリプトと Bash スクリプトを使用する場合は、将来のタスクで使用可能な変数を設定できると便利です。 新しく設定した変数は、同じタスクでは使用できません。
スクリプトは、タスクでサポートされていない操作を実行する場合に適しています。 たとえば、スクリプトを使用してカスタム REST API を呼び出し、応答を解析できます。
注意
デプロイ ジョブでは、出力変数に別の構文を使用します。 デプロイ ジョブでの出力変数のサポートの詳細については、「デプロイ ジョブ」を参照してください。
パイプラインで条件付きの変数を使用する場合は、「条件の指定」を参照してください。
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)
」のように入力します。
変数を読み取り専用として設定した場合、ダウンストリーム タスクでは上書きできません。 isreadonly
を true
に設定します。 変数を読み取り専用に設定すると、その変数は不変になるためセキュリティが強化されます。
変数をシークレットとして設定する
issecret
が true に設定されている場合、変数の値はシークレットとして保存され、ログからマスクされます。
注意
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 でのシークレット変数の出力。
出力変数のレベル
4 種類の出力変数があり、それぞれに構文が異なります。
- 同じジョブ内で
isOutput
パラメーターの指定なしで設定された出力変数。 これらの変数を参照するには、マクロ構文を使用します。 例:$(myVar)
. - 同じジョブ内で
isOutput
パラメーターを指定して設定された出力変数。 これらの変数を参照するには、タスク名を含めます。 例:$(myTask.myVar)
. - 将来のジョブで設定される出力変数。
variables
セクションでこれらの変数を参照するには、dependency
構文を使用します。 - 将来のステージで設定される出力変数。 これらの変数を参照するには、
variables
セクションで変数をstageDependencies
構文で参照します。
注意
将来のステージまたはジョブは、出力変数が設定されたステージまたはジョブに依存している場合にのみ、その出力変数にアクセスできます。 出力変数にアクセスできるようにするには、次のステージまたはジョブが、変数を作成したステージまたはジョブに依存していることを確認します。 複数のステージまたはジョブで同じ出力変数を使用する必要がある場合は、dependsOn
条件を使用して、この依存関係を確立します。
同じジョブで使用するための出力変数を設定する
同じジョブ内で出力変数を使用する場合は、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
このスクリプトは、同じジョブの変数 myJobVar
と 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
- 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)"