式
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
式は、パイプラインの作成時に文字列、ブール値、または数値の値を指定する必要がある多くの場所で使用できます。 式の最も一般的な使用方法は、ジョブまたはステップを実行する必要があるかどうかを判断する 条件 にあります。
# Expressions are used to define conditions for a step, job, or stage
steps:
- task: ...
condition: <expression>
式のもう 1 つの一般的な用途は、変数の定義です。
式は、 コンパイル時 または 実行時に評価できます。
コンパイル時の式は、任意の場所で使用できます。ランタイム式は、変数と条件で使用できます。 ランタイム式は、変数と状態の内容を計算する方法として意図されています (例: condition
)。
# Two examples of expressions used to define variables
# The first one, a, is evaluated when the YAML file is compiled into a plan.
# The second one, b, is evaluated at runtime.
# Note the syntax ${{}} for compile time and $[] for runtime expressions.
variables:
a: ${{ <expression> }}
b: $[ <expression> ]
ランタイムとコンパイル時の式の構文の違いは、主に使用できるコンテキストです。
コンパイル時の式 (${{ <expression> }}
) では、 に parameters
アクセスでき、静的に定義されています variables
。
ランタイム式 ($[ <expression> ]
) では、より多くの variables
パラメーターにアクセスできますが、パラメーターはありません。
この例では、ランタイム式によって の $(isMain)
値が設定されます。 コンパイル式の静的変数は、 の $(compileVar)
値を設定します。
variables:
staticVar: 'my value' # static variable
compileVar: ${{ variables.staticVar }} # compile time expression
isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')] # runtime expression
steps:
- script: |
echo ${{variables.staticVar}} # outputs my value
echo $(compileVar) # outputs my value
echo $(isMain) # outputs True
式には、リテラル、変数への参照、依存関係への参照、関数、またはこれらの入れ子になった有効な組み合わせを指定できます。
リテラル
式の一部として、ブール値、null、数値、文字列、またはバージョン リテラルを使用できます。
# Examples
variables:
someBoolean: ${{ true }} # case insensitive, so True or TRUE also works
someNumber: ${{ -1.2 }}
someString: ${{ 'a b c' }}
someVersion: ${{ 1.2.3 }}
ブール型
True
と False
はブールリテラル式です。
[Null]
Null は、辞書ミスから返される特殊なリテラル式です (例: (variables['noSuch']
)。 Null には式の出力を指定できますが、式内で直接呼び出すことはできません。
数値
'-'、'.'、または '0' から '9' で始まります。
String
単一引用符で囲む必要があります。 (例: 'this is a string'
)。
リテラルの単一引用符を表すには、単一引用符でエスケープします。
(例: 'It''s OK if they''re using contractions.'
)。
複数行文字列にはパイプ文字 (|
) を使用できます。
myKey: |
one
two
three
Version
最大 4 つのセグメントを持つバージョン番号。
数値で始まり、2 つまたは 3 つのピリオド (.
) 文字を含める必要があります。
(例: 1.2.3.4
)。
変数
式の一部として、次の 2 つの構文のいずれかを使用して変数にアクセスできます。
- インデックス構文:
variables['MyVar']
- プロパティ逆参照構文:
variables.MyVar
プロパティ参照外しの構文を使用するには、プロパティ名に次の条件が必要です。
- または で
a-Z
始める_
- その後に または を続ける
a-Z
0-9
_
実行コンテキストに応じて、さまざまな変数を使用できます。
- YAML を使用してパイプラインを作成する場合は、 パイプライン変数 を使用できます。
- クラシック エディターを使用してビルド パイプラインを作成する場合は、 ビルド変数 を使用できます。
- クラシック エディターを使用してリリース パイプラインを作成する場合は、 リリース変数 を使用できます。
変数は常に文字列です。 型指定された値を使用する場合は、代わりに パラメーター を使用する必要があります。
Note
変数タブ UI を使用してこのような変数を設定する際に、従来のパイプラインと YAML パイプラインの両方の式で変数を使用する場合には制限があります。 式として定義されている変数は、両方の式が正しく評価されると は限らない ため、値に expression を持つ別の変数に依存しないでください。 たとえば、変数 a
の値の一部として使用 $[ <expression> ]
される値を持つ変数 b
があります。 変数の処理順序は保証されないため、評価後に変数 b
の a
値が正しくない可能性があります。
記述された構築は、YAML パイプラインで variables キーワード を使用して変数を設定する場合にのみ許可されます。 処理後に正しい値を取得するには、変数を処理する必要がある順序で配置する必要があります。
関数
式では、次の組み込み関数を使用できます。
および
- すべてのパラメーターが 次の場合に に
True
評価されますTrue
- 最小パラメーター: 2。 最大パラメーター: N
- 評価のためにパラメーターをブール値にキャストします
- 最初の後の短絡
False
- 例:
and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))
coalesce
- パラメーターを順番に評価し、null または空文字列と等しくない値を返します。
- 最小パラメーター: 2。 最大パラメーター: N
- 例:
coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')
contains
- 左パラメーター String に
True
右パラメーターが含まれているかどうかを評価します - 最小パラメーター: 2。 最大パラメーター: 2
- 評価のためにパラメーターを String にキャストします
- 序数の大文字と小文字を区別しない比較を実行します
- 例:
contains('ABCDE', 'BCD')
(True を返します)
containsValue
- 左側の
True
パラメーターが配列であり、項目が右のパラメーターと等しいかどうかを評価します。 また、左側のTrue
パラメーターが オブジェクトであり、任意のプロパティの値が右のパラメーターと等しいかどうかも評価されます。 - 最小パラメーター: 2。 最大パラメーター: 2
- 左側のパラメーターが配列の場合は、各項目を右のパラメーターの型と一致するように変換します。 左側のパラメーターが オブジェクトの場合は、各プロパティの値を右のパラメーターの型と一致するように変換します。 変換が失敗した場合、特定の
False
項目ごとの等価比較が評価されます。 - 文字列の序数の無視大文字と小文字の比較
- 最初の試合後のショートサーキット
Note
配列を指定するためのリテラル構文が YAML パイプラインにありません。 この関数は、一般的なパイプラインでは限定的に使用されます。 これは、 パイプライン デコレーター コンテキスト で、ステップの一覧などのシステム提供の配列で使用することを目的としています。
式を使用して、 containsValue
オブジェクト内の一致する値を検索できます。 ソース ブランチの一覧で の一致 Build.SourceBranch
を調べることを示す例を次に示します。
parameters:
- name: branchOptions
displayName: Source branch options
type: object
default:
- refs/heads/main
- refs/heads/test
jobs:
- job: A1
steps:
- ${{ each value in parameters.branchOptions }}:
- script: echo ${{ value }}
- job: B1
condition: ${{ containsValue(parameters.branchOptions, variables['Build.SourceBranch']) }}
steps:
- script: echo "Matching branch found"
convertToJson
- 複雑なオブジェクトを取得し、JSON として出力します。
- 最小パラメーター: 1。 最大パラメーター: 1。
parameters:
- name: listOfValues
type: object
default:
this_is:
a_complex: object
with:
- one
- two
steps:
- script: |
echo "${MY_JSON}"
env:
MY_JSON: ${{ convertToJson(parameters.listOfValues) }}
スクリプト出力:
{
"this_is": {
"a_complex": "object",
"with": [
"one",
"two"
]
}
}
counter
- この関数は、変数を定義する式でのみ使用できます。 ステップ、ジョブ、またはステージの条件の一部として使用することはできません。
- パイプラインの実行ごとにインクリメントされる数値を評価します。
- パラメーター: 2。
prefix
およびseed
。 - Prefix は文字列式です。 counter の個別の値は、プレフィックスの一意の値ごとに追跡されます。 には
prefix
UTF-16 文字を使用する必要があります。 - Seed はカウンターの開始値です
パイプラインの実行ごとに 1 ずつ自動的にインクリメントされるカウンターを作成できます。 カウンターを定義するときは、 と を prefix
指定します seed
。 これを示す例を次に示します。
variables:
major: 1
# define minor as a counter with the prefix as variable major, and seed as 100.
minor: $[counter(variables['major'], 100)]
steps:
- bash: echo $(minor)
パイプラインの最初の minor
実行での上記の例の の値は 100 になります。 2 回目の実行では、 の major
値がまだ 1 の場合は 101 になります。
YAML ファイルを編集し、変数 major
の値を 2 に更新した場合、パイプラインの次の実行では、 の minor
値は 100 になります。 後続の実行では、カウンターが 101、102、103、..にインクリメントされます。
その後、YAML ファイルを編集し、 の major
値を 1 に戻すと、カウンターの値は、そのプレフィックスに対して中断したところから再開されます。 この例では、102 で再開されます。
100 から始まり、実行ごとに 1 ずつインクリメントされ、毎日 100 にリセットされるカウンターとして機能するように変数を設定する別の例を次に示します。
Note
pipeline.startTime
は式の外部では使用できません。 pipeline.startTime
は、式を操作できるように、日付と時刻のオブジェクトに書式 system.pipelineStartTime
を設定します。
の既定の pipeline.startTime
タイム ゾーンは UTC です。 組織 のタイム ゾーンを変更 できます。
jobs:
- job:
variables:
a: $[counter(format('{0:yyyyMMdd}', pipeline.startTime), 100)]
steps:
- bash: echo $(a)
PR と CI の実行に対して個別の値を保持するカウンターの例を次に示します。
variables:
patch: $[counter(variables['build.reason'], 0)]
カウンターのスコープはパイプラインです。 つまり、その値は、そのパイプラインの実行ごとにインクリメントされます。 プロジェクト スコープのカウンターはありません。
endsWith
- 左パラメーター String が
True
右パラメーターで終わるかどうかを評価します - 最小パラメーター: 2。 最大パラメーター: 2
- 評価のためにパラメーターを String にキャストします
- 序数の大文字と小文字を区別しない比較を実行します
- 例:
endsWith('ABCDE', 'DE')
(True を返します)
eq
- パラメーターが等しいかどうかを評価します
True
- 最小パラメーター: 2。 最大パラメーター: 2
- 右パラメーターを左パラメーターの型と一致するように変換します。 変換が失敗した場合は を
False
返します。 - 文字列の序数の無視大文字と小文字の比較
- 例:
eq(variables.letters, 'ABC')
format
- 末尾のパラメーターを評価し、先頭のパラメーター文字列に挿入します
- 最小パラメーター: 1。 最大パラメーター: N
- 例:
format('Hello {0} {1}', 'John', 'Doe')
- 日付書式 (
yyyy
、f
d
HH
mm
m
ss
H
s
dd
K
yy
ffff
MM
ff
M
) に .NET カスタムの日付と時刻の書式指定子を使用します - 例:
format('{0:yyyyMMdd}', pipeline.startTime)
. この場合pipeline.startTime
は、特殊な日時オブジェクト変数です。 - 中かっこを 2 倍にしてエスケープします。 例:
format('literal left brace {{ and literal right brace }}')
ge
True
left パラメーターが右のパラメーター以上かどうかを評価します- 最小パラメーター: 2。 最大パラメーター: 2
- 右パラメーターを左パラメーターの型と一致するように変換します。 変換が失敗した場合にエラーが発生します。
- 文字列の序数の無視大文字と小文字の比較
- 例:
ge(5, 5)
(True を返します)
gt
True
left パラメーターが右のパラメーターより大きいかどうかを評価します- 最小パラメーター: 2。 最大パラメーター: 2
- 右パラメーターを左パラメーターの型と一致するように変換します。 変換が失敗した場合にエラーが発生します。
- 文字列の序数の無視大文字と小文字の比較
- 例:
gt(5, 2)
(True を返します)
in
True
left パラメーターが右のパラメーターと等しいかどうかを評価します- 最小パラメーター: 1。 最大パラメーター: N
- 右のパラメーターを左パラメーターの型と一致するように変換します。 等値比較では、変換が失敗した場合に
False
評価されます。 - 文字列の序数の無視大文字と小文字の比較
- 最初の一致後のショートサーキット
- 例:
in('B', 'A', 'B', 'C')
(True を返します)
join
- 右側のパラメーター配列内のすべての要素を、左のパラメーター文字列で区切って連結します。
- 最小パラメーター: 2。 最大パラメーター: 2
- 配列内の各要素は文字列に変換されます。 複合オブジェクトは空の文字列に変換されます。
- 適切なパラメーターが配列でない場合、結果は文字列に変換された適切なパラメーターになります。
この例では、配列内の各項目の間にセミコロンが追加されます。 パラメーター型は オブジェクトです。
parameters:
- name: myArray
type: object
default:
- FOO
- BAR
- ZOO
variables:
A: ${{ join(';',parameters.myArray) }}
steps:
- script: echo $A # outputs FOO;BAR;ZOO
le
True
left パラメーターが右のパラメーター以下かどうかを評価します- 最小パラメーター: 2。 最大パラメーター: 2
- 右パラメーターを左パラメーターの型と一致するように変換します。 変換が失敗した場合にエラーが発生します。
- 文字列の序数の無視大文字と小文字の比較
- 例:
le(2, 2)
(True を返します)
length
- 文字列または配列の長さを返します。システムから取得されたもの、またはパラメーターから取得されたものを返します。
- 最小パラメーター: 1。 最大パラメーター 1
- 例:
length('fabrikam')
8 を返します
lower
- 文字列または変数の値をすべての小文字に変換します
- 最小パラメーター: 1。 最大パラメーター 1
- 文字列に相当する小文字を返します。
- 例:
lower('FOO')
を返します。foo
lt
- left パラメーターが
True
右のパラメーターより小さいかどうかを評価します - 最小パラメーター: 2。 最大パラメーター: 2
- 右パラメーターを左パラメーターの型と一致するように変換します。 変換が失敗した場合にエラーが発生します。
- 文字列の序数の無視大文字と小文字の比較
- 例:
lt(2, 5)
(True を返します)
ne
- パラメーターが等しくないかどうかを評価します
True
- 最小パラメーター: 2。 最大パラメーター: 2
- 右パラメーターを左パラメーターの型と一致するように変換します。 変換が失敗した場合は を
True
返します。 - 文字列の序数の無視大文字と小文字の比較
- 例:
ne(1, 2)
(True を返します)
not
- パラメーターが かどうかを評価します
True
False
- 最小パラメーター: 1。 最大パラメーター: 1
- 評価のために値をブール値に変換します
- 例:
not(eq(1, 2))
(True を返します)
notIn
True
left パラメーターが右のパラメーターと等しくないかどうかを評価します- 最小パラメーター: 1。 最大パラメーター: N
- 右のパラメーターを左パラメーターの型と一致するように変換します。 等値比較では、変換が失敗した場合に
False
評価されます。 - 文字列の序数の無視大文字と小文字の比較
- 最初の一致後のショートサーキット
- 例:
notIn('D', 'A', 'B', 'C')
(True を返します)
または
- パラメーターが 次の値であるかどうかを評価します
True
。True
- 最小パラメーター: 2。 最大パラメーター: N
- 評価のためにパラメーターをブール値にキャストします
- 最初の後の短絡
True
- 例:
or(eq(1, 1), eq(2, 3))
(True、短絡を返します)
replace
- 現在のインスタンス内の文字列のすべてのインスタンスが別の文字列に置き換えられる新しい文字列を返します。
- 最小パラメーター: 3。 最大パラメーター: 3
replace(a, b, c)
: b のすべてのインスタンスを c に置き換えて、 を返します。- 例:
replace('https://www.tinfoilsecurity.com/saml/consume','https://www.tinfoilsecurity.com','http://server')
(を返しますhttp://server/saml/consume
)
split
- 指定した区切り文字に基づいて文字列を部分文字列に分割します。
- 最小パラメーター: 2。 最大パラメーター: 2
- 最初のパラメーターは、分割する文字列です
- 2 番目のパラメーターは区切り文字です
- 部分文字列の配列を返します。 区切り文字が連続して出現する場合、または文字列の末尾に表示される場合、配列には空の文字列が含まれます
- 例:
variables: - name: environments value: prod1,prod2 steps: - ${{ each env in split(variables.environments, ',')}}: - script: ./deploy.sh --environment ${{ env }}
- replace() で split() を使用する例:
parameters: - name: resourceIds type: object default: - /subscriptions/mysubscription/resourceGroups/myResourceGroup/providers/Microsoft.Network/loadBalancers/kubernetes-internal - /subscriptions/mysubscription02/resourceGroups/myResourceGroup02/providers/Microsoft.Network/loadBalancers/kubernetes - name: environments type: object default: - prod1 - prod2 trigger: - main steps: - ${{ each env in parameters.environments }}: - ${{ each resourceId in parameters.resourceIds }}: - script: echo ${{ replace(split(resourceId, '/')[8], '-', '_') }}_${{ env }}
startsWith
- 左パラメーター文字列が
True
右パラメーターで始まるかどうかを評価します - 最小パラメーター: 2。 最大パラメーター: 2
- 評価のためにパラメーターを String にキャストします
- 序数の大文字と小文字を区別しない比較を実行します
- 例:
startsWith('ABCDE', 'AB')
(True を返します)
upper
- 文字列または変数の値をすべての大文字に変換します
- 最小パラメーター: 1。 最大パラメーター 1
- 文字列に相当する大文字を返します。
- 例:
upper('bah')
を返します。BAH
xor
- パラメーターが 1 つだけかどうかを評価します
True
True
- 最小パラメーター: 2。 最大パラメーター: 2
- 評価のためにパラメーターをブール値にキャストします
- 例:
xor(True, False)
(True を返します)
ジョブの状態チェック機能
次の状態チェック関数は、条件の式として使用できますが、変数定義では使用できません。
常時
- 常に に
True
評価されます (取り消された場合でも)。 注: 重大な障害が発生しても、タスクの実行が妨げられる可能性があります。 たとえば、ソースの取得に失敗した場合などがそれにあたります。
canceled
- パイプラインが
True
取り消されたかどうかを に評価します。
失敗
- ステップの場合は、 と
eq(variables['Agent.JobStatus'], 'Failed')
同等です。 - ジョブの場合:
- 引数がない場合、 は、依存関係グラフ内の以前のジョブが失敗した場合にのみ に評価
True
されます。 - ジョブ名を引数として使用すると、 は、それらのジョブのいずれかが失敗した場合にのみ に
True
評価されます。
- 引数がない場合、 は、依存関係グラフ内の以前のジョブが失敗した場合にのみ に評価
succeeded
- ステップの場合は、
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues')
dependsOn
を使用してジョブを操作し、前のジョブが成功したかどうかを評価する場合。 ジョブは、ステージが順番に実行されている間に並列で実行されるように設計されています。- ジョブの場合:
- 引数がない場合、 は、依存関係グラフ内の以前のすべてのジョブが成功したか、部分的に成功した場合にのみ に評価
True
されます。 - ジョブ名を引数として使用すると
True
、それらのジョブがすべて成功したか、部分的に成功したかが 評価されます。 - パイプラインが
False
取り消された場合に を評価します。
- 引数がない場合、 は、依存関係グラフ内の以前のすべてのジョブが成功したか、部分的に成功した場合にのみ に評価
succeededOrFailed
ステップの場合は、
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed')
ジョブの場合:
- 引数がない場合、依存関係グラフ内のジョブが成功したか失敗したかに関係なく、 が に評価
True
されます。 - ジョブ名を引数として使用すると
True
、それらのジョブのいずれかが成功したか失敗したかに評価されます。
これは のようなものです
always()
が、パイプラインが取り消されたときに評価False
される点が除きます。- 引数がない場合、依存関係グラフ内のジョブが成功したか失敗したかに関係なく、 が に評価
条件付き挿入
、elseif
、および else
句を使用if
して、条件付きで変数値を割り当てたり、タスクの入力を設定したりできます。 条件が満たされたときにステップを条件付きで実行することもできます。
を使用 if
すると、条件付きで変数値を割り当てたり、タスクの入力を設定したりできます。 条件が満たされたときにステップを条件付きで実行することもできます。
elseif
句と else
句は Azure DevOps 2022 以降で使用でき、Azure DevOps Server 2020 以前のバージョンの Azure DevOps では使用できません。
条件は、テンプレート構文を使用する場合にのみ機能します。 変数構文の詳細については、こちらを参照してください。
テンプレートの場合、シーケンスまたはマッピングを追加するときに条件付き挿入を使用できます。 テンプレートでの条件付き挿入の詳細については、こちらを参照してください。
変数を条件付きで割り当てる
variables:
${{ if eq(variables['Build.SourceBranchName'], 'main') }}: # only works if you have a main branch
stageName: prod
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo ${{variables.stageName}}
タスク入力を条件付きで設定する
pool:
vmImage: 'ubuntu-latest'
steps:
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)'
${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
artifact: 'prod'
${{ else }}:
artifact: 'dev'
publishLocation: 'pipeline'
ステップを条件付きで実行する
変数が設定されていない場合、または の foo
値が条件と if
一致しない場合は、ステートメントが else
実行されます。 ここで の値 foo
は、条件で true を elseif
返します。
variables:
- name: foo
value: contoso # triggers elseif condition
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo "start"
- ${{ if eq(variables.foo, 'adaptum') }}:
- script: echo "this is adaptum"
- ${{ elseif eq(variables.foo, 'contoso') }}: # true
- script: echo "this is contoso"
- ${{ else }}:
- script: echo "the value is not adaptum or contoso"
Each キーワード
キーワードを使用して、 each
オブジェクト型のパラメーターをループ処理できます。
parameters:
- name: listOfStrings
type: object
default:
- one
- two
steps:
- ${{ each value in parameters.listOfStrings }}:
- script: echo ${{ value }}
さらに、オブジェクト内の入れ子になった要素を反復処理できます。
parameters:
- name: listOfFruits
type: object
default:
- fruitName: 'apple'
colors: ['red','green']
- fruitName: 'lemon'
colors: ['yellow']
steps:
- ${{ each fruit in parameters.listOfFruits }} :
- ${{ each fruitColor in fruit.colors}} :
- script: echo ${{ fruit.fruitName}} ${{ fruitColor }}
依存関係
式では、依存関係コンテキストを使用して、前のジョブまたはステージを参照できます。 依存関係を使用すると、次のことができます。
- 前のジョブのジョブの状態を参照する
- 前のステージのステージの状態を参照する
- 同じステージの前のジョブの出力変数を参照する
- ステージの前のステージの出力変数を参照する
- 次のステージの前のステージのジョブの出力変数を参照する
コンテキストはジョブとステージに対して呼び出 dependencies
され、変数とよく似ています。
ジョブ内で、別のステージのジョブから出力変数を参照する場合、コンテキストは と呼ばれます stageDependencies
。
出力変数に引用符文字 ('
または "
) が含まれる問題が発生した場合は、 このトラブルシューティング ガイドを参照してください。
依存関係をステージングするステージ
構造的には、 dependencies
オブジェクトは、 と outputs
へのresults
ジョブ名とステージ名のマップです。
JSON として表現すると、次のようになります。
"dependencies": {
"<STAGE_NAME>" : {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"jobName.stepName.variableName": "value"
}
},
"...": {
// another stage
}
}
この形式の を dependencies
使用して、ステージ レベルで変数にマップしたり、条件を確認したりします。
この例では、ステージ B はステージ A が成功したかスキップされたかを実行します。
Note
次の例では、標準パイプライン構文を使用します。 デプロイ パイプラインを使用している場合、変数と条件付き変数の構文の両方が異なります。 使用する特定の構文の詳細については、「 デプロイ ジョブ」を参照してください。
stages:
- stage: A
condition: false
jobs:
- job: A1
steps:
- script: echo Job A1
- stage: B
condition: in(dependencies.A.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
jobs:
- job: B1
steps:
- script: echo Job B1
ステージでは、別のステージからの出力変数を使用することもできます。 この例では、ステージ B はステージ A の変数に依存します。
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
condition: and(succeeded(), eq(dependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
dependsOn: A
jobs:
- job: B1
steps:
- script: echo hello from Stage B
Note
既定では、パイプライン内の各ステージは、YAML ファイル内の直前のステージによって異なります。
現在のステージの直前ではないステージを参照する必要がある場合は、ステージにセクションを追加することで、この自動既定値を dependsOn
オーバーライドできます。
1 つのステージ内のジョブ間の依存関係
1 つのステージ内のジョブ レベルでは、データに dependencies
ステージ レベルの情報は含まれません。
"dependencies": {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value1"
}
},
"...": {
// another job
}
}
この例では、ジョブ A は常にスキップされ、ジョブ B は実行されます。 ジョブ C は、すべての依存関係が成功するかスキップされるため、実行されます。
jobs:
- job: a
condition: false
steps:
- script: echo Job A
- job: b
steps:
- script: echo Job B
- job: c
dependsOn:
- a
- b
condition: |
and
(
in(dependencies.a.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
in(dependencies.b.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
)
steps:
- script: echo Job C
この例では、ジョブ B はジョブ A からの出力変数に依存しています。
jobs:
- job: A
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- job: B
condition: and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
dependsOn: A
steps:
- script: echo hello from B
ジョブからジョブへの依存関係 (ステージ間)
ジョブ レベルでは、前のステージのジョブからの出力を参照することもできます。
これには、コンテキストを使用する stageDependencies
必要があります。
"stageDependencies": {
"<STAGE_NAME>" : {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value"
}
},
"...": {
// another job
}
},
"...": {
// another stage
}
}
この例では、ジョブ A1 がスキップされると、ジョブ B1 が実行されます。 ジョブ B2 は、ジョブ A1 の出力変数の値を確認して、実行する必要があるかどうかを判断します。
trigger: none
pool:
vmImage: 'ubuntu-latest'
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
dependsOn: A
jobs:
- job: B1
condition: in(stageDependencies.A.A1.result, 'Skipped') # change condition to `Succeeded and stage will be skipped`
steps:
- script: echo hello from Job B1
- job: B2
condition: eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
steps:
- script: echo hello from Job B2
ジョブが別のステージのデプロイ ジョブによって定義された変数に依存している場合、構文は異なります。 次の例では、デプロイ ジョブrun_tests
が に設定runTests
されている場合にbuild_job
ジョブがtrue
実行されます。 ディクショナリに使用されるキーが outputs
であることに build_job.setRunTests.runTests
注意してください。
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: Production
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
jobs:
- job: run_tests
condition: eq(stageDependencies.build.build_job.outputs['build_job.setRunTests.runTests'], 'true')
steps:
...
ジョブ出力に応じたステージ
ビルド後に変更が必要ない場合は、特定の条件下でパイプライン内のステージをスキップできます。 たとえば、Terraform プランを使用していて、承認をトリガーし、プランに変更が含まれている場合にのみ適用する場合です。
ステージでこの条件を使用する場合は、 ではなく stageDependencies
変数を使用するdependencies
必要があります。
次の例は、ステージのステップで変数 (Terraform プランの実際の情報を使用) を設定し、変数に特定の値がある場合にのみ 2 番目のステージを呼び出す単純なスクリプトです。
stages:
- stage: plan_dev
jobs:
- job: terraform_plan_dev
steps:
- bash: echo '##vso[task.setvariable variable=terraform_plan_exitcode;isOutput=true]2'
name: terraform_plan
- stage: apply_dev
dependsOn: plan_dev
condition: eq(dependencies.plan_dev.outputs['terraform_plan_dev.terraform_plan.terraform_plan_exitcode'], '2')
jobs:
- job: part_b
steps:
- bash: echo "BA"
ステージが別のステージのデプロイメント・ジョブによって定義された変数に依存している場合、構文は異なります。 次の例では、ステージtest
は へのデプロイbuild_job
設定shouldTest
true
によって異なります。 ステージの でcondition
、 build_job
が test
2 回表示されていることに注意してください。
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: Production
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
condition: eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
jobs:
...
上記の例では、条件は環境リソースではなく環境を参照しています。 環境リソースを参照するには、環境リソース名を依存関係条件に追加する必要があります。 次の例では、 条件は という名前 vmtest
の環境仮想マシン リソースを参照しています。
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: vmtest
resourceName: winVM2
resourceType: VirtualMachine
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
condition: eq(dependencies.build.outputs['build_job.Deploy_winVM2.setRunTests.runTests']
, 'true')
jobs:
...
フィルター処理された配列
項目のコレクションを操作する場合は、 構文を *
使用してフィルター処理された配列を適用できます。 フィルター処理された配列は、名前に関係なく、すべてのオブジェクト/要素を返します。
たとえば、 という名前 foo
のオブジェクトの配列を考えてみましょう。 配列内の各オブジェクトの プロパティの値の id
配列を取得します。
[
{ "id": 1, "a": "avalue1"},
{ "id": 2, "a": "avalue2"},
{ "id": 3, "a": "avalue3"}
]
次の操作を実行できます。
foo.*.id
これにより、フィルター処理された配列として操作するようにシステムに foo
指示し、 プロパティを id
選択します。
これにより、次が返されます。
[ 1, 2, 3 ]
型キャスト
式の値は、式が評価されると、ある型から別の型に変換できます。 式が評価されると、パラメーターは関連するデータ型に結合され、文字列に戻されます。
たとえば、この YAML では、 の値True
と が に1
変換され、0
式が評価False
されるときに変換されます。
関数 lt()
は、 True
left パラメーターが right パラメーターより小さい場合に を返します。
variables:
firstEval: $[lt(False, True)] # 0 vs. 1, True
secondEval: $[lt(True, False)] # 1 vs. 0, False
steps:
- script: echo $(firstEval)
- script: echo $(secondEval)
この例では、値 variables.emptyString
と空の文字列の両方が空の文字列として評価されます。
関数 coalesce()
はパラメーターを順番に評価し、null または empty-string と等しくない最初の値を返します。
variables:
coalesceLiteral: $[coalesce(variables.emptyString, '', 'literal value')]
steps:
- script: echo $(coalesceLiteral) # outputs literal value
詳細な変換規則を以下に示します。
From/To | Boolean | [Null] | Number | String | Version |
---|---|---|---|---|---|
Boolean | - | - | はい | はい | - |
Null | はい | - | はい | はい | - |
Number | はい | - | - | はい | 部分的 |
String | はい | 部分的 | Partial | - | Partial |
バージョン | はい | - | - | はい | - |
Boolean
番号を付ける:
False
→0
True
→1
文字列を指定するには:
False
→'False'
True
→'True'
[Null]
- ブール値:
False
- 番号を付ける:
0
- 文字列
''
: (空の文字列)
数値
- ブール値へ:
0
→False
、その他の数値→True
- バージョン指定: 0 より大きく、0 以外の 10 進数を含める必要があります。 Int32.MaxValue (10 進コンポーネントも) より小さくする必要があります。
- 文字列へ: 数値を、桁区切り記号のない文字列に変換し、小数点を付けずに変換します。
String
- ブール値:
''
(空の文字列) →False
、その他の任意の文字列→True
- null の場合:
''
(空の文字列) →Null
。その他の文字列は変換できません - 番号を付ける:
''
(空の文字列) → 0 以外の場合は、InvariantCulture と次のInt32.TryParse
規則を使用して C#の を実行します:AllowDecimalPoint |AllowLeadingSign |AllowLeadingWhite |AllowThousands |AllowTrailingWhite。 失敗した場合TryParse
は、変換できません。 - バージョン設定: C#の
Version.TryParse
を実行します。 少なくとも Major コンポーネントと Minor コンポーネントを含む必要があります。 失敗した場合TryParse
は、変換できません。
Version
- ブール値:
True
- 文字列: Major.Minor または Major.Minor.Build または Major.Minor.Build.Revision。
よく寄せられる質問
私は式でサポートされていない何かをしたい。 パイプライン機能を拡張するには、どのようなオプションがありますか?
式を含むスクリプトを使用してパイプラインをカスタマイズできます。 たとえば、このスニペットは 変数を BUILD_BUILDNUMBER
受け取り、Bash で分割します。 このスクリプトは、 $MAJOR_RUN
メジャーとマイナーの実行番号の 2 つの新しい変数 と $MINOR_RUN
を出力します。
次に、2 つの変数を使用して、 $major
$minor
task.setvariable と共に 2 つのパイプライン変数を作成します。 これらの変数は、ダウンストリームステップで使用できます。 パイプライン間で変数を共有するには、「 変数グループ」を参照してください。
steps:
- bash: |
MAJOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f1)
echo "This is the major run number: $MAJOR_RUN"
echo "##vso[task.setvariable variable=major]$MAJOR_RUN"
MINOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f2)
echo "This is the minor run number: $MINOR_RUN"
echo "##vso[task.setvariable variable=minor]$MINOR_RUN"
- bash: echo "My pipeline variable for major run is $(major)"
- bash: echo "My pipeline variable for minor run is $(minor)"