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 }}

ブール型

TrueFalse はブールリテラル式です。

[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-Z0-9_

実行コンテキストに応じて、さまざまな変数を使用できます。

  • YAML を使用してパイプラインを作成する場合は、 パイプライン変数 を使用できます。
  • クラシック エディターを使用してビルド パイプラインを作成する場合は、 ビルド変数 を使用できます。
  • クラシック エディターを使用してリリース パイプラインを作成する場合は、 リリース変数 を使用できます。

変数は常に文字列です。 型指定された値を使用する場合は、代わりに パラメーター を使用する必要があります。

Note

変数タブ UI を使用してこのような変数を設定する際に、従来のパイプラインと YAML パイプラインの両方の式で変数を使用する場合には制限があります。 式として定義されている変数は、両方の式が正しく評価されると は限らない ため、値に expression を持つ別の変数に依存しないでください。 たとえば、変数 a の値の一部として使用 $[ <expression> ] される値を持つ変数 bがあります。 変数の処理順序は保証されないため、評価後に変数 ba 値が正しくない可能性があります。

記述された構築は、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')
  • 日付書式 (yyyyfdHHmmmssHsddKyyffffMMffM) に .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

  • パラメーターが かどうかを評価しますTrueFalse
  • 最小パラメーター: 1。 最大パラメーター: 1
  • 評価のために値をブール値に変換します
  • 例: not(eq(1, 2)) (True を返します)

notIn

  • True left パラメーターが右のパラメーターと等しくないかどうかを評価します
  • 最小パラメーター: 1。 最大パラメーター: N
  • 右のパラメーターを左パラメーターの型と一致するように変換します。 等値比較では、変換が失敗した場合に False 評価されます。
  • 文字列の序数の無視大文字と小文字の比較
  • 最初の一致後のショートサーキット
  • 例: notIn('D', 'A', 'B', 'C') (True を返します)

または

  • パラメーターが 次の値であるかどうかを評価します TrueTrue
  • 最小パラメーター: 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 つだけかどうかを評価しますTrueTrue
  • 最小パラメーター: 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設定shouldTesttrueによって異なります。 ステージの でconditionbuild_jobtest 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

番号を付ける:

  • False0
  • True1

文字列を指定するには:

  • False'False'
  • True'True'

[Null]

  • ブール値: False
  • 番号を付ける: 0
  • 文字列 '' : (空の文字列)

数値

  • ブール値へ: 0False、その他の数値→ 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$minortask.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)"