新增階段、相依性和條件
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
階段是 Azure DevOps 管線中的邏輯界限。 階段可用來將軟體開發程式中的動作分組(例如,建置應用程式、執行測試、部署至生產階段)。 每個階段都包含了一或多個作業。
當您在管線中定義多個階段時,預設情況下,它們會一個接一個地執行。 階段也可以彼此相依。 您可以使用 dependsOn
關鍵詞來定義 相依性。 階段也可以根據具有條件的上一個階段的結果來執行。
若要了解階段如何使用平行作業和授權,請參閱 設定和支付平行作業的費用。
若要了解階段與管線的其他部分的關係,例如作業,請參閱 重要管線概念。
您也可以深入了解階段與 YAML 架構階段一文中管線部分的關聯程度。
您可以將管線作業組織成階段。 階段是管線中的主要部門:建置此應用程式、執行這些測試,以及部署到生產階段是良好的階段範例。 它們是管線中的邏輯界限,您可以在其中暫停管線並執行各種檢查。
即使您未明確定義管線,每個管線至少有一個階段。 您也可以將階段排列成相依性圖形,讓一個階段在另一個階段之前執行。 階段的作業限制為256個。
注意
Azure DevOps Server 2019.1 已新增階段支援。
指定階段
注意
Azure DevOps Server 2019.1 已新增階段支援。
在最簡單的情況下,您不需要管線中的任何邏輯界限。 在此情況下,您不需要明確使用 stage
關鍵詞。 您可以直接在 YAML 檔案中指定作業。
# this has one implicit stage and one implicit job
pool:
vmImage: 'ubuntu-latest'
steps:
- bash: echo "Hello world"
# this pipeline has one implicit stage
jobs:
- job: A
steps:
- bash: echo "A"
- job: B
steps:
- bash: echo "B"
如果您將管線組織成多個階段,請使用 stages
關鍵詞。
stages:
- stage: A
jobs:
- job: A1
- job: A2
- stage: B
jobs:
- job: B1
- job: B2
如果您選擇在階段層級指定 pool
,除非在作業層級指定,否則在該階段中定義的所有作業都會使用該集區。
注意
在 Azure DevOps Server 2019 中,集區只能在作業層級指定。
stages:
- stage: A
pool: StageAPool
jobs:
- job: A1 # will run on "StageAPool" pool based on the pool defined on the stage
- job: A2 # will run on "JobPool" pool
pool: JobPool
指定階段的完整語法為:
stages:
- stage: string # name of the stage, A-Z, a-z, 0-9, and underscore
displayName: string # friendly name to display in the UI
dependsOn: string | [ string ]
condition: string
pool: string | pool
variables: { string: string } | [ variable | variableReference ]
jobs: [ job | templateReference]
指定相依性
注意
Azure DevOps Server 2019.1 已新增階段支援。
在管線中定義多個階段時,預設會依您在 YAML 檔案中定義的順序循序執行。 不過新增相依性時,就會出現例外狀況。 使用相依性時,階段會依 dependsOn
需求的順序執行。
管線至少必須包含一個沒有相依性的階段。
定義多個階段及其相依性的語法如下:
stages:
- stage: string
dependsOn: string
condition: string
循序執行的範例階段:
# if you do not use a dependsOn keyword, stages run in the order they are defined
stages:
- stage: QA
jobs:
- job:
...
- stage: Prod
jobs:
- job:
...
平行執行的範例階段:
stages:
- stage: FunctionalTest
jobs:
- job:
...
- stage: AcceptanceTest
dependsOn: [] # this removes the implicit dependency on previous stage and causes this to run in parallel
jobs:
- job:
...
展開扇出和風扇的範例:
stages:
- stage: Test
- stage: DeployUS1
dependsOn: Test # this stage runs after Test
- stage: DeployUS2
dependsOn: Test # this stage runs in parallel with DeployUS1, after Test
- stage: DeployEurope
dependsOn: # this stage runs after DeployUS1 and DeployUS2
- DeployUS1
- DeployUS2
定義條件
您可以指定每個階段使用 表示式執行的條件。 根據預設,如果階段不相依於任何其他階段,或相依的所有階段都已完成且成功,則會執行階段。 您可以強制階段執行此行為,即使先前階段失敗或指定自定義條件也一樣。
如果您針對階段自定義上述步驟的默認條件,您可以移除完成和成功的條件。 因此,如果您使用自定義條件,通常會使用 and(succeeded(),custom_condition)
來檢查上一個階段是否成功執行。 否則,不論上一個階段的結果為何,階段都會執行。
注意
失敗的條件 ('JOBNAME/STAGENAME') 和成功 #'JOBNAME/STAGENAME'),如下列範例 僅適用於 YAML 管線。
注意
Azure DevOps Server 2019.1 已新增階段支援。
根據執行上一個階段狀態執行階段的範例:
stages:
- stage: A
# stage B runs if A fails
- stage: B
condition: failed()
# stage C runs if B succeeds
- stage: C
dependsOn:
- A
- B
condition: succeeded('B')
使用 自訂條件的範例:
stages:
- stage: A
- stage: B
condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/main'))
指定佇列原則
YAML 管線不支援佇列原則。 管線的每個執行都與其他執行無關,而且不知道其他執行。 換句話說,您的兩個連續認可可能會觸發兩個管線,而且兩者都會執行相同的階段順序,而不會彼此等候。 雖然我們努力將佇列原則帶入 YAML 管線,但建議您使用 手動核准 ,以便在這很重要時手動排序並控制執行順序。