分享方式:


一個管線執行完成後再觸發另一個

Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020

大型產品有數個彼此相依的元件。 這些元件通常會獨立建置。 當上游元件(例如連結庫)變更時,必須重建和重新驗證下游相依性。

在這類情況下,新增管線觸發程式,以在觸發管線成功完成 時執行管線

注意

先前,您可能已流覽至 YAML 管線的傳統編輯器,並在 UI 中設定 建置完成觸發程式 。 雖然該模型仍可運作,但已不再建議使用。 建議的方法是直接在 YAML 檔案內指定 管線觸發 程式。 在傳統編輯器中定義的建置完成觸發程式有各種缺點,這些缺點現在已在管線觸發程式中解決。 例如,沒有任何方法可以使用建置完成觸發程式,在與觸發管線相同的分支上觸發管線。

設定管線資源觸發程式

若要在另一個管線完成時觸發管線,請設定 管線資源 觸發程式。

下列範例會設定管線資源觸發程式,讓名為 app-ci 的管線在管線的任何執行 security-lib-ci 完成後執行。

此範例有下列兩個管線。

  • security-lib-ci - 此管線會先執行。

    # security-lib-ci YAML pipeline
    steps:
    - bash: echo "The security-lib-ci pipeline runs first"
    
  • app-ci - 此管線具有管線資源觸發程式,可 app-ci 設定管線在每次管線執行完成時 security-lib-ci 自動執行。

    # app-ci YAML pipeline
    # We are setting up a pipeline resource that references the security-lib-ci
    # pipeline and setting up a pipeline completion trigger so that our app-ci
    # pipeline runs when a run of the security-lib-ci pipeline completes
    resources:
      pipelines:
      - pipeline: securitylib # Name of the pipeline resource.
        source: security-lib-ci # The name of the pipeline referenced by this pipeline resource.
        project: FabrikamProject # Required only if the source pipeline is in another project
        trigger: true # Run app-ci pipeline when any run of security-lib-ci completes
    
    steps:
    - bash: echo "app-ci runs after security-lib-ci completes"
    
  • - pipeline: securitylib 指定管線資源的名稱。 從管線的其他部分參考管線資源時,請使用此處定義的標籤,例如使用管線資源變數或下載成品時。
  • source: security-lib-ci 指定這個管線資源所參考的管線名稱。 您可以在數個位置,例如 Pipelines 登陸頁面,從 Azure DevOps 入口網站擷取管線的名稱。 根據預設,管線會以包含管線的存放庫命名。 若要更新管線的名稱,請參閱 管線設定。 如果管線包含在資料夾中,請包含資料夾名稱,包括前置 \,例如 \security pipelines\security-lib-ci
  • project: FabrikamProject - 如果觸發管線位於另一個 Azure DevOps 專案中,您必須指定項目名稱。 如果來源管線和觸發的管線都位於相同的專案中,這個屬性是選擇性的。 如果您指定此值,且管線未觸發,請參閱本節結尾的附注。
  • trigger: true - 使用此語法在來源管線的任何版本完成時觸發管線。 請參閱本文中的下列各節,以瞭解如何篩選完成的來源管線版本將觸發執行。 指定篩選條件時,來源管線執行必須符合所有篩選條件,才能觸發執行。

如果觸發管線和觸發的管線使用相同的存放庫,當其中一個觸發另一個管線時,兩個管線都會使用相同的認可來執行。 如果您的第一個管線建置程序代碼,而第二個管線會加以測試,這會很有説明。 不過,如果兩個管線使用不同的存放庫,觸發的管線將會使用設定所Default branch for manual and scheduled builds指定分支中的程式代碼版本,如管線完成觸發程式的分支考慮中所述

注意

在某些情況下,手動建置和排程組建的預設分支不包含 refs/heads 前置詞。 例如,預設分支可能會設定為 main ,而不是 設定為 refs/heads/main。 在此案例中, 來自不同專案的觸發程式無法運作。 如果您在設定 project 為目標管線以外的值時遇到問題,您可以將預設分支的值變更為包含 refs/heads ,然後將它變更回您想要使用的預設分支。

YAML 範本不支援設定管線完成觸發程式。 您仍然可以在範本中定義管線資源。

分支篩選

您可以選擇性地指定要在設定觸發程式時包含或排除的分支。 如果您指定分支篩選,每當來源管線執行順利完成且符合分支篩選條件時,就會觸發新的管線。 在下列範例中,如果 在任何分支上releases/*完成 ,管security-lib-ci線就會app-ci執行,但 除外releases/old*

# app-ci YAML pipeline
resources:
  pipelines:
  - pipeline: securitylib
    source: security-lib-ci
    trigger: 
      branches:
        include: 
        - releases/*
        exclude:
        - releases/old*

若要針對觸發父系的不同分支觸發子管線,請包含觸發父系的所有分支篩選。 在下列範例中, app-ci 如果 security-lib-ci 在任何 releases/* 分支或主要分支上完成,則管線會執行,但 除外 releases/old*

# app-ci YAML pipeline
resources:
  pipelines:
  - pipeline: securitylib
    source: security-lib-ci
    trigger: 
      branches:
        include: 
        - releases/*
        - main
        exclude:
        - releases/old*

注意

如果您分支篩選無法運作,請嘗試使用前置詞 refs/heads/。 例如,使用 refs/heads/releases/old* 而不是 releases/old*

標籤篩選

注意

管線資源的 標籤篩選支援需要 Azure DevOps Server 2020 Update 1 或更新版本。

tags管線完成事件可以觸發管線之篩選的 trigger 屬性。 如果觸發管線符合清單中的所有標記 tags ,管線就會執行。

resources:
  pipelines:
  - pipeline: MyCIAlias
    source: Farbrikam-CI
    trigger:
      tags:        # This filter is used for triggering the pipeline run
      - Production # Tags are AND'ed
      - Signed

注意

管線資源也有 tags 屬性。 管 tags 線資源的 屬性可用來判斷當管線手動或由排程觸發程式觸發時,要從中擷取成品的管線執行。 如需詳細資訊,請參閱 資源:管線成品版本的評估。

階段篩選

注意

管線資源觸發程式的 階段篩選需要 Azure DevOps Server 2020 Update 1 或更新版本。

當觸發管線的一或多個階段使用 stages 篩選完成時,您可以觸發管線。 如果您提供多個階段,則觸發的管線會在所有列出的階段完成時執行。

resources:
  pipelines:
  - pipeline: MyCIAlias  
    source: Farbrikam-CI  
    trigger:    
      stages:         # This stage filter is used when evaluating conditions for 
      - PreProduction # triggering your pipeline. On successful completion of all the stages
      - Production    # provided, your pipeline will be triggered. 

分支考慮

管線完成觸發程式會使用 預設分支進行手動和排程的組建 設定,來判斷哪一個分支版本的 YAML 管線分支篩選條件,以在判斷是否要因為另一個管線完成而執行管線時進行評估。 根據預設,此設定會指向存放庫的預設分支。

當管線完成時,Azure DevOps 運行時間會評估任何管線的管線資源觸發程式分支篩選,其中包含參考已完成管線的管線完成觸發程式。 管線在不同的分支中可以有多個版本,因此運行時間會評估設定所 Default branch for manual and scheduled builds 指定分支版本中管線版本的分支篩選。 如果有相符專案,管線會執行,但執行管線的版本可能會在不同的分支中,視觸發的管線是否位於與已完成管線相同的存放庫中而定。

  • 如果兩個管線位於不同的存放庫中,則會執行 所 Default branch for manual and scheduled builds 指定分支中的觸發管線版本。
  • 如果兩個管線位於相同的存放庫中,則會執行與觸發管線相同的分支中觸發的管線版本(在符合觸發條件時使用該分支的管線版本),即使該分支與 不同 Default branch for manual and scheduled builds,而且即使該版本沒有符合已完成管線分支的分支篩選。 這是因為來自分支的 Default branch for manual and scheduled builds 分支篩選可用來判斷管線是否應該執行,而不是位於已完成管線分支中版本的分支篩選。

如果您的管線完成觸發程式似乎並未引發,請檢查 [預設] 分支的值 ,以取得所觸發管線的手動和排程組建 設定。 該分支版本管線中的分支篩選可用來判斷管線完成觸發程式是否起始管線的執行。 根據預設,會 Default branch for manual and scheduled builds 設定為存放庫的預設分支,但您可以在建立管線之後加以變更。

當建立新的分支時,管線完成觸發程式不會引發的典型案例,管線完成觸發程式分支篩選會修改為包含這個新分支,但當第一個管線在符合新分支篩選的分支上完成時,第二個管線不會觸發。 如果分支中管線版本中的 Default branch for manual and scheduled builds 分支篩選不符合新分支,就會發生這種情況。 若要解決此觸發程序問題,您有下列兩個選項。

  • 更新分支中管線中的 Default branch for manual and scheduled builds 分支篩選,使其符合新的分支。
  • 將手動和排程組建設定的預設分支更新為具有與新分支相符分支之分支篩選版本的分支。

結合觸發程序類型

當您在管線中同時指定 CI 觸發程式和管線觸發程式時,每次進行符合 CI 觸發程式篩選的推送時,您都可以預期會啟動新的執行,而且來源管線的執行已完成,符合管線完成觸發程式的篩選條件。

例如,假設有兩個名為 A 且位於相同存放庫中的管線,兩者都有 CI 觸發程式,而且B已設定管線完成觸發程式以完成管線 AB 。 如果您將推送至存放庫:

  • 的新回合 A 會根據其 CI 觸發程序啟動。
  • 同時,會根據其 CI 觸發程式啟動 新的 執行 B 。 此執行會從先前的管線 A執行取用成品。
  • 完成時A,它會根據 中的B管線完成觸發程式,觸發 另一個 執行 B

若要防止在此範例中觸發兩次 B 執行,您必須停用其 CI 觸發程式 (trigger: none) 或管線觸發程式 (pr: none)。