使用觸發程序來控制管線執行的時機
您現在有一個運作中的管線,可將您的 Bicep 檔案部署到 Azure 環境。 但是,每當您變更檔案,都必須手動執行管線。 在本單元中,您將學習如何在每次變更 Bicep 程式碼後,即觸發管線自動執行。
注意
本單元中的命令僅用於示範概念。 請先不要執行命令。 您很快就會在此練習所學到的內容。
什麼是管線觸發程序?
管線觸發程序是一種條件,一旦符合,即會根據您建立的規則自動執行管線。 您可以設定這些觸發程序依排程間隔執行管線。 您也可以設定觸發程序,只要存放庫中的檔案一有變更即執行管線。 您可以選擇第二個選項,因為每當他人變更您的程式碼時,執行所有的測試和部署步驟會是個好主意。
如果不使用自動觸發程序,可能有人會變更 Bicep 檔案,甚至認可該變更並將變更推送至存放庫。 但如果這些人忘了執行管線,則您 Bicep 檔案中的資源定義和部署至 Azure 環境的資源間就會有差異。 假設已完成更多認可和推送,但尚未部署。 如果有人在 Bicep 檔案的其中一個變更中造成錯誤或設定錯誤,可能很難立刻在稍後部署的多個認可之間追蹤到錯誤。 一段時間之後,您將無法信任 Bicep 程式碼能真正代表您的基礎結構,而且其值已遭侵蝕。
當將管線設定為每次更新檔案後都會執行時,管線就會在您推送變更後開始執行。 您可以立即獲得有效性變更的意見反應,並確定實際執行環境永遠保持在最新狀態。
分支觸發程序
常見的觸發程序類型是「分支觸發程序」,也稱為「持續整合觸發程序」或「CI 觸發程序」。 當您使用分支觸發程序後,只要指定的分支一有變更,就會執行管線。 如果您認可某項變更並將其推送至不同的分支,則不會觸發執行管線。 透過此程式碼,針對您的預設或主要分支使用此類型的觸發程序,是相當常見的作法:
trigger:
- main
在變更多個分支時觸發
您可以設定觸發程序,針對特定的分支或分支集合執行管線。 例如,假設所建立的「版本分支」包含您將為專案特定版本部署的程式碼。 您可以使用類似 release/v1、release/v2 的分支名稱。 您希望名稱開頭為 release/ 的分支程式碼一有變更時,就會執行管線。 您可以使用 include
屬性搭配 *
萬用字元:
trigger:
branches:
include:
- main
- release/*
您也可以排除特定分支。 假設您要與小組成員合作處理專案。 您的同事建立了「功能分支」,要在 Bicep 檔案中嘗試其想法。 所有功能分支都使用類似 feature/add-database、feature/improve-performance 的名稱。 您想要對所有分支自動執行管線,但您同事建立的功能分支除外。 使用 exclude
屬性,您可確保功能分支的變更不會自動觸發管線:
trigger:
branches:
include:
- '*'
exclude:
- feature/*
提示
請注意在 include
篩選條件中,萬用字元要用引號括住。 YAML 檔案格式要求當單一 *
字元用為萬用字元時,要用引號括住。
路徑篩選
您的存放庫中有時會有與部署無關的檔案。 例如,您的存放庫中可能有一個包含 Bicep 程式碼的 deploy 資料夾,另有一個 docs 資料夾則包含文件檔。 您希望只要有人變更 deploy 資料夾中的任何 Bicep 檔案就會觸發管線,但您不想要因為文件檔變更而觸發管線。 若要設定觸發程序以回應存放庫中特定資料夾的變更,您可以使用「路徑篩選」:
trigger:
branches:
include:
- main
paths:
exclude:
- docs
include:
- deploy
如果有人認可了只更新文件檔的變更,就不會執行管線。 但如果有人變更了 Bicep 檔案,或在變更文件檔以外還變更了 Bicep 檔案,則觸發程序就會執行管線。
排程管線自動執行
您可以依照設定的排程執行管線,而不是為回應檔案變更而執行。 例如,您可以執行 Bicep 程式碼的夜間版本,或在每天早上自動部署測試環境。 使用 schedules
關鍵字而非 trigger
,並使用 Cron 運算式設定頻率:
schedules:
- cron: "0 0 * * *"
displayName: Daily environment restore
branches:
include:
- main
注意
「Cron 運算式」是一串經過特殊格式化的字元,可設定某個事件發生的頻率。 在本範例中,0 0 * * *
表示「在 UTC 時間每天午夜執行」。
您也可以設定要在排程事件中使用的存放庫分支。 當管線啟動時,會使用您在排程中所設定之分支的最新版程式碼。
使用多個觸發程序
您可以合併多個觸發程序和排程,如下列範例所示:
trigger:
- main
schedules:
- cron: "0 0 * * *"
displayName: Deploy test environment
branches:
include:
- main
當您在相同管線中建立分支觸發程序「和」排程觸發程序時,管線會在兩種情況下執行:觸發程序所設定分支的檔案每次發生變更時,「以及」您設定的排程。 在本範例中,管線會在 UTC 時間每天午夜執行,且會在變更推送至 main 分支時執行。
提示
為每個管線設定觸發程序是良好的做法。 如果您沒有設定觸發程序,則根據預設,任何分支的任何檔案只要發生變更,管線就會自動執行,而這通常不是您想要的結果。
並行控制
根據預設,Azure Pipelines 允許同時執行管線的多個執行個體。 當您在短時間內對分支進行多個認可時,就會發生這種情況。
在某些情況下,同時執行多個管線並不是問題。 但是當您以部署管線進行作業時,若想確保您的管線執行不會以超估您預期的方式覆寫 Azure 資源或設定,可能不太容易。
若要避免這些問題,您可以使用 batch
關鍵字搭配觸發程序,如下列範例所示:
trigger:
batch: true
branches:
include:
- main
觸發程序引發時,Azure Pipelines 可確保其會等待任何作用中的管線執行完成。 然後,其會啟動新的執行,其中包含自上次執行以來累積的所有變更。