指定條件

Azure Pipelines |TFS 2018 |TFS 2017。3

您可以指定每個階段、作業或步驟執行時所依據的條件。 依預設,如果作業或階段不依存于任何其他作業或階段,或其相依的所有工作或階段都已完成且成功,則會執行該工作或階段。 依預設,如果作業中沒有任何專案失敗,且緊接在其之前的步驟完成,步驟就會執行。 即使先前的相依性失敗或藉由指定自訂條件,您也可以藉由強制執行階段、作業或步驟來自訂此行為。

注意

在 Microsoft Team Foundation Server (TFS) 2018 和舊版本中,組建和發行管線稱為定義執行稱為組建服務連接稱為服務端點階段稱為環境,以及作業稱為階段

您可以指定將執行步驟、作業或階段的條件。

  • 只有在所有先前具有相同代理程式組件區的相依性都成功時。 如果您有不同的代理程式組件區,則會同時執行這些階段或作業。 如果未在 YAML 中設定條件,則這是預設值。

  • 即使先前的相依性失敗、除非已取消執行。 succeededOrFailed()在此條件的 YAML 中使用。

  • 即使先前的相依性失敗、即使已取消執行。 always()在此條件的 YAML 中使用。

  • 只有在先前的相依性失敗時。 failed()在此條件的 YAML 中使用。

  • 自訂條件

依預設,如果所有先前的步驟/作業都已成功,則會執行步驟、作業和階段。 如同您指定了 "condition: 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。

啟用自訂條件

如果內建條件不符合您的需求,則您可以指定 自訂條件

在 TFS 2017.3 中,自訂工作條件僅適用于組建管線的使用者介面。 您可以使用版本 REST api 來建立發行管線的自訂條件。

條件會以運算式的形式寫入 YAML 管線中。 代理程式會從最內層的函式開始評估運算式,並以其方式運作。最終結果是一個布林值,可判斷工作、作業或階段是否應該執行。 如需語法的完整指南,請參閱「 運算式 」主題。

您是否有任何條件可以讓工作在使用者取消組建之後仍能執行? 如果是的話,請指定合理的 cancel timeout 值,讓這類的工作在使用者取消執行之後有足夠的時間完成。

範例

如果成功,為主要分支執行

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'))

釋放。Artifacts。{成品-別名}。SourceBranch相當於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 檔中的腳本將會執行,因為 parameters.doThing 是 true。

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: false # 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 # will not be evaluated in time
  type: boolean

trigger:
- none

extends:
  template: parameters.yml

在後續作業的條件中使用來自作業的輸出變數

您可以將變數設為可供未來的作業使用,並在條件中指定。 可供未來作業使用的變數,必須使用來標示為 多個工作的輸出變數

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."

常見問題集

我有一個條件式步驟,即使工作已取消也會執行。 我的條件式步驟是否會影響我在佇列中取消的作業?

不會。 如果您在佇列中取消工作,則會取消整個作業,包括條件式步驟。

我有一個條件式步驟,即使部署已取消也應該執行。 如何? 指定此專案嗎?

如果您使用 YAML 檔來定義管線,則會支援此功能。 發行管線尚未支援此案例。

如果先前的工作成功但有問題,該如何觸發作業?

您可以使用前一個作業的結果。 例如,在此 YAML 檔中,此條件 eq(dependencies.A.result,'SucceededWithIssues') 可讓工作執行,因為作業 A 成功但有問題。

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'