条件の指定

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

各ステージ、ジョブ、ステップを実行する条件を指定できます。 既定では、ジョブまたはステージが他のジョブまたはステージに依存しない場合、または依存するすべてのジョブまたはステージが完了して成功した場合に実行されます。 既定では、ジョブ内でまだ何も失敗しておらず、その直前のステップが完了した場合に、ステップは実行されます。 この動作をカスタマイズするには、前の依存関係が失敗した場合でも、ステージ、ジョブ、またはステップを強制的に実行するようにするか、カスタム条件を指定します。

Note

Microsoft Team Foundation Server (TFS) 2018 以前のバージョンでは、ビルドとリリースの "パイプライン" は "定義"、"実行" は "ビルド"、"サービス接続" は "サービス エンドポイント"、"ステージ" は "環境"、"ジョブ" は "フェーズ" と呼ばれます。

ステップ、ジョブ、またはステージを実行する条件を指定できます。

  • 同じエージェント プールを持つ以前のすべての直接依存関係と間接依存関係が成功した場合のみ。 エージェント プールが異なる場合、それらのステージまたはジョブは同時に実行されます。 これは、YAML に条件が設定されていない場合の既定値です。

  • 実行が取り消された場合を除き、前の依存関係が失敗した場合でも。 この条件には YAML で使用 succeededOrFailed() します。

  • 実行が取り消された場合も含め、前の依存関係が失敗した場合でも。 この条件には YAML で使用 always() します。

  • 前の依存関係が失敗したときだけ。 この条件には YAML で使用 failed() します。

  • カスタム条件

既定では、前のすべてのステップ/ジョブが成功した場合、ステップ、ジョブ、およびステージが実行されます。 "条件: succeeded()" を指定したかのように表示されます ( ジョブの状態関数を参照)。

jobs:
- job: Foo

  steps:
  - script: echo Hello!
    condition: always() # this step will always run, even if the pipeline is canceled

- job: Bar
  dependsOn: Foo
  condition: failed() # this job will only run if Foo fails

条件で変数を使用することもできます。

variables:
  isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')]

stages:
- stage: A
  jobs:
  - job: A1
    steps:
      - script: echo Hello Stage A!

- stage: B
  condition: and(succeeded(), eq(variables.isMain, 'true'))
  jobs:
  - job: B1
    steps:
      - script: echo Hello Stage B!
      - script: echo $(isMain)

条件は、ステージ、ジョブ、またはステップを開始するかどうかを決定するために評価されます。 つまり、その作業単位内の実行時に計算される何も使用できなくなります。 たとえば、構文を使用してランタイム式 $[ ] を使用して変数を設定するジョブがある場合、その変数をカスタム条件で使用することはできません。

TFS では YAML はまだサポートされていません。

カスタム条件を有効にする

組み込み条件がニーズを満たしていない場合は、 カスタム条件を指定できます。

条件は YAML パイプラインで式として記述されます。 エージェントは、最も内側の関数で始まる式を評価し、その方法を実行します。最終的な結果は、タスク、ジョブ、またはステージを実行するかどうかを決定するブール値になります。 構文の完全なガイドについては、 のトピックを参照してください。

ユーザーがビルドを取り消した後でも、いずれかの条件でタスクを実行できますか? その場合は、ユーザーが実行を 取り消 した後に完了するのに十分な時間を確保できるように、キャンセル タイムアウトの妥当な値を指定します。

成功した場合は、メイン ブランチに対して実行します

and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))

ブランチがメインでない場合は実行します(成功した場合)

and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main'))

成功した場合は、ユーザー トピック ブランチに対して実行します

and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/heads/users/'))

継続的インテグレーション (CI) ビルドの実行 (成功した場合)

and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI'))

ビルドがプル要求のブランチ ポリシーによって実行された場合に実行されます (失敗した場合)

and(failed(), eq(variables['Build.Reason'], 'PullRequest'))

ビルドがスケジュールされている場合、失敗した場合でも、キャンセルされた場合でも実行する

and(always(), eq(variables['Build.Reason'], 'Schedule'))

Release.Artifacts。{artifact-alias}。SourceBranchBuild.SourceBranch と同等です。

変数が true に設定されている場合に実行する

condition: eq(variables['System.debug'], 'true')

変数が null (空の文字列) の場合に実行する

すべての変数は Azure Pipelines の文字列として扱われるので、空の文字列はこのパイプラインと同じです null

variables:
- name: testEmpty
  value: ''

jobs:
  - job: A
    steps:
    - script: echo testEmpty is blank
    condition: eq(variables.testEmpty, '')

条件の一部としてテンプレート パラメーターを使用する

条件があるのと同じパイプラインでパラメーターを宣言すると、条件が考慮される前にパラメーターの拡張が行われます。 この場合は、条件の中にパラメーターを埋め込むことができます。 この YAML ファイル内のスクリプトは true であるため parameters.doThing 実行されます。

parameters:
- name: doThing
  default: true
  type: boolean

steps:
- script: echo I did a thing
  condition: and(succeeded(), eq('${{ parameters.doThing }}', 'true'))

ただし、パラメーターをテンプレートに渡すと、条件の評価時にパラメーターに値は含まれません。 その結果、テンプレートとパイプライン YAML ファイルの両方でパラメーター値を設定すると、テンプレートの値が条件で使用されます。

# parameters.yml
parameters:
- name: doThing
  default: true # value passed to the condition
  type: boolean

jobs:
  - job: B
    steps:
    - script: echo I did a thing
    condition: and(succeeded(), eq('${{ parameters.doThing }}', 'true'))
# azure-pipeline.yml
parameters:
- name: doThing
  default: true 
  type: boolean

trigger:
- none

extends:
  template: parameters.yml

このパイプラインの出力は、 I did a thing パラメーター doThing が true であるためです。

後続のジョブの条件でジョブからの出力変数を使用する

将来のジョブで変数を使用できるようにし、条件で指定できます。 将来のジョブで使用できる変数は、次を使用してisOutput=trueマルチジョブ出力変数としてマークする必要があります。

jobs:
- job: Foo
  steps:
  - bash: |
      echo "This is job Foo."
      echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #set variable doThing to Yes
    name: DetermineResult
- job: Bar
  dependsOn: Foo
  condition: eq(dependencies.Foo.outputs['DetermineResult.doThing'], 'Yes') #map doThing and check the value
  steps:
  - script: echo "Job Foo ran and doThing is Yes."

後続のステップの条件でステップから作成されたパイプライン変数を使用する

変数を将来のステップで使用できるようにし、条件で指定することができます。 既定では、ステップから作成された変数は将来のステップで使用でき、使用してisOutput=trueマルチジョブ出力変数としてマークする必要はありません。

上記のアプローチと スコープに関して注意すべき重要な点がいくつかあります。

  • ジョブ内のステップで作成された変数は、同じジョブ内のステップのスコープに設定されます。
  • ステップで作成された変数は、以降のステップでのみ環境変数として使用できます。
  • ステップで作成された変数は、それらを定義するステップでは使用できません。

ステップでパイプライン変数を作成し、後続のステップの条件とスクリプトで変数を使用する例を次に示します。

steps:

# This step creates a new pipeline variable: doThing. This variable will be available to subsquent steps.
- bash: |
    echo "##vso[task.setvariable variable=doThing]Yes"
  displayName: Step 1

# This step is able to use doThing, so it uses it in its condition
- script: |
    # You can access the variable from Step 1 as an environment variable.
    echo "Value of doThing (as DOTHING env var): $DOTHING."
  displayName: Step 2
  condition: and(succeeded(), eq(variables['doThing'], 'Yes')) # or and(succeeded(), eq(variables.doThing, 'Yes'))

よく寄せられる質問

ジョブがキャンセルされた場合でも実行される条件付きステップがあります。 条件付きステップは、キューで取り消したジョブに影響しますか?

いいえ。 キュー内のジョブを取り消すと、条件ステップを含むジョブ全体が取り消されます。

デプロイがキャンセルされた場合でも実行する必要がある条件付きステップがあります。 これを指定操作方法?

YAML ファイルを使用してパイプラインを定義した場合は、これがサポートされます。 このシナリオは、リリース パイプラインではまだサポートされていません。

以前のジョブがエラーありで成功した場合にジョブをトリガーするにはどうすればよいですか?

前のジョブの結果を使用できます。 たとえば、この YAML ファイルでは、ジョブ A が問題で成功したため、この条件 eq(dependencies.A.result,'SucceededWithIssues') によってジョブを実行できます。

jobs:
- job: A
  displayName: Job A
  continueOnError: true # next job starts even if this one fails
  steps:
  - script: echo Job A ran
  - script: exit 1

- job: B
  dependsOn: A
  condition: eq(dependencies.A.result,'SucceededWithIssues') # targets the result of the previous job 
  displayName: Job B
  steps:
  - script: echo Job B ran

ジョブがキャンセルされた場合でも実行される条件付きステップがあります。 すべてのジョブを一度に取り消操作方法?

ステージで構成されている条件にジョブの状態チェック機能が含まれていない場合、この問題が発生します。 問題を解決するには、ジョブの状態チェック機能を条件に追加します。 キュー内のジョブを取り消すと、ジョブ全体が取り消され、他のすべてのステージも含めて、この関数が構成されます。 詳細については、 ジョブ状況機能を参照してください。

stages:
- stage: Stage1
  displayName: Stage 1
  dependsOn: []
  condition: and(contains(variables['build.sourceBranch'], 'refs/heads/main'), succeeded())
  jobs:
  - job: ShowVariables
    displayName: Show variables
    steps:
    - task: CmdLine@2
      displayName: Show variables
      inputs:
        script: 'printenv'

- stage: Stage2
  displayName: stage 2
  dependsOn: Stage1
  condition: contains(variables['build.sourceBranch'], 'refs/heads/main')
  jobs:
  - job: ShowVariables
    displayName: Show variables 2
    steps:
    - task: CmdLine@2
      displayName: Show variables 2
      inputs:
        script: 'printenv'
          
- stage: Stage3
  displayName: stage 3
  dependsOn: Stage2
  condition: and(contains(variables['build.sourceBranch'], 'refs/heads/main'), succeeded())
  jobs:
  - job: ShowVariables
    displayName: Show variables 3
    steps:
    - task: CmdLine@2
      displayName: Show variables 3
      inputs:
        script: 'printenv'