新增階段、相依性和條件
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 管線,但建議您使用 手動核准 ,以便在這很重要時手動排序並控制執行順序。
指定核准
您可以使用核准檢查手動控制階段何時應該執行。 這通常用來控制生產環境的部署。 檢查是可供資源擁有者用來控制管線中階段是否可以取用資源的機制。 身為資源的擁有者,例如環境,您可以定義在取用該資源的階段之前必須滿足的檢查。
目前,環境支援手動核准檢查。 如需詳細資訊,請參閱 核准。
此版本的 Azure DevOps Server 尚不支援 YAML 管線中的核准。
新增手動觸發程式
手動觸發的 YAML 管線階段可讓您擁有統一的管線,而不一律執行至完成。
例如,您的管線可能包含建置、測試、部署至預備環境,以及部署到生產環境的階段。 您可能希望所有階段都自動執行,但生產部署除外,您想要在準備好時手動觸發。
若要使用這項功能,請將 屬性新增 trigger: manual
至階段。
在下列範例中,開發階段會自動執行,而生產階段需要手動觸發。 這兩個階段都會執行你好世界輸出腳本。
stages:
- stage: development
displayName: Deploy to development
jobs:
- job: DeployJob
steps:
- script: echo 'hello, world'
displayName: 'Run script'
- stage: production
displayName: Deploy to production
trigger: manual
jobs:
- job: DeployJob
steps:
- script: echo 'hello, world'
displayName: 'Run script'
將階段標示為不可置身分
將階段標示為 isSkippable: false
,以防止管線使用者略過階段。 例如,您可能有 YAML 範本,會在所有管線中插入執行惡意代碼偵測的階段。 如果您為此階段設定 isSkippable: false
,管線將無法略過惡意代碼偵測。
在下列範例中,惡意代碼偵測階段標示為不可略過,這表示必須在管線執行時執行。
- stage: malware_detection
displayName: Malware detection
isSkippable: false
jobs:
- job: check_job
...
當階段無法略過時,它會在 [階段] 中 顯示停用的複選框,以執行 組態面板。