設定管線的排程

Azure DevOps Services |Azure DevOps Server 2020 |Azure DevOps Server 2019 |TFS 2018

注意

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

Azure Pipelines提供數種類型的觸發程式來設定管線的啟動方式。

  • 排程的觸發程式會根據排程啟動管線,例如夜間組建。 本文提供使用排程觸發程式根據排程執行管線的指引。
  • 事件型觸發程式會啟動管線以回應事件,例如建立提取要求或推送至分支。 如需使用事件型觸發程式的資訊,請參閱Azure Pipelines 中的觸發程式。

您可以在管線中結合排程和事件型觸發程式,例如,在每次推送 (CI 觸發 程式) 、提取要求 (PR 觸發 程式) 進行時,以及 (排程觸發程式的夜間建置) 。 如果您想要只依排程建置管線,而不是回應事件型觸發程式,請確定您的管線未啟用任何其他觸發程式。 例如,GitHub存放庫中的 YAML 管線預設會啟用 CI 觸發程式和 PR 觸發程式。 如需停用預設觸發程式的資訊,請參閱Azure Pipelines中的觸發程式,並流覽至涵蓋存放庫類型的區段。

已排程的觸發程序

重要

使用管線設定 UI 定義的排程觸發程式優先于 YAML 排程觸發程式。

如果您的 YAML 管線同時有 YAML 排程觸發程式和 UI 定義的排程觸發程式,則只會執行 UI 定義的排程觸發程式。 若要在 YAML 管線中執行 YAML 定義的排程觸發程式,您必須移除管線設定 UI 中定義的已排程觸發程式。 移除所有 UI 排程觸發程式之後,必須進行推送,YAML 排程觸發程式才能開始評估。

若要從 YAML 管線刪除 UI 排程觸發程式,請參閱 UI 設定會覆寫 YAML 排程觸發程式

排程觸發程式會設定管線,以使用 cron 語法定義的排程執行。

schedules:
- cron: string # cron syntax defining a schedule
  displayName: string # friendly name given to a specific schedule
  branches:
    include: [ string ] # which branches the schedule applies to
    exclude: [ string ] # which branches to exclude from the schedule
  always: boolean # whether to always run the pipeline or only if there have been source code changes since the last successful scheduled run. The default is false.

YAML 中的排程管線具有下列條件約束。

  • cron 排程的時區是 UTC。
  • 如果您為 指定 exclude 子句, include 但沒有 子 branches 句,它就相當於在 include 子句中指定 *
  • 指定排程時,您無法使用管線變數。
  • 如果您在 YAML 檔案中使用範本,則必須在主要 YAML 檔案中指定排程,而不是在範本檔案中指定。

排程觸發程式的分支考慮

當發生下列事件時,會評估分支的排程觸發程式。

  • 建立管線。
  • 管線的 YAML 檔案會從推送更新,或在管線編輯器中編輯它。
  • 管線的 YAML 檔案路徑會 更新為參考不同的 YAML 檔案。 這項變更只會更新預設分支,因此只會在預設分支更新的 YAML 檔案中挑選排程。 如果後續有任何其他分支合併預設分支,例如 git pull origin main ,系統會針對該分支評估來自新參考 YAML 檔案的排程觸發程式。
  • 系統會建立新的分支。

在分支中發生其中一個事件之後,如果該分支符合該分支中 YAML 檔案中包含的排程觸發程式的分支篩選準則,則會新增該分支的任何排程執行。

重要

只有在分支符合 該特定分支中 YAML 檔案中排程觸發程式的分支篩選準則時,才會新增分支的排程執行。

例如,系統會使用下列排程建立管線,並將這個版本的 YAML 檔案簽入 main 分支。 此排程會每天建 main 置分支。

# YAML file in the main branch
schedules:
- cron: "0 0 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - main

接下來,會根據 名為 new-feature 的新 main 分支來建立。 系統會讀取新分支中 YAML 檔案中的排程觸發程式,而且因為分支沒有相符 new-feature 專案,所以不會對排程的組建進行任何變更,而且 new-feature 分支不會使用排程觸發程式來建置。

如果 new-feature 已新增至 branches 清單,且此變更會推送至 new-feature 分支,則會讀取 YAML 檔案,因為 new-feature 現在位於分支清單中,所以會新增分支的 new-feature 排程組建。

# YAML file in the new-feature-branch
schedules:
- cron: "0 0 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - main
    - new-feature

現在,請考慮根據 建立 main 名為 release 的分支,然後將 release 新增至分支中 YAML 檔案 main 中的分支篩選,但不是在新建立 release 的分支中。

# YAML file in the release branch
schedules:
- cron: "0 0 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - main

# YAML file in the main branch with release added to the branches list
schedules:
- cron: "0 0 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - main
    - release

由於 release 已新增至分支中的 main 分支篩選,但 新增至分支中的 release 分支篩選, release 因此不會在該排程上建置分支篩選。 只有在將 release 分支新增至 發行分支 中 YAML 檔案中的分支篩選時,才會將排程的組建新增至排程器。

AZURE DEVOPS SERVER 2019 的 YAML 語法不支援排程組建。 建立 YAML 組建管線之後,您可以使用管線設定來指定排程的觸發程式。

TFS 不支援 YAML。

範例

下列範例會定義兩個排程:

schedules:
- cron: "0 0 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - main
    - releases/*
    exclude:
    - releases/ancient/*
- cron: "0 12 * * 0"
  displayName: Weekly Sunday build
  branches:
    include:
    - releases/*
  always: true

第一個排程 每日午夜組建會在每天午夜執行管線,但只有在程式碼自上次成功排程執行 main 之後變更,以及針對 和 所有 releases/* 分支執行,但 下分支除外 releases/ancient/*

第二個排程 「每週星期日」組建會在星期日的下午執行管線,不論程式碼自上次執行以來是否已變更,都會針對所有 releases/* 分支執行。

注意

cron 排程的時區是 UTC,因此在這些範例中,午夜組建和下午組建是 UTC 的午夜和下午。

如需更多範例,請參閱 從傳統編輯器移轉

AZURE DEVOPS SERVER 2019 的 YAML 語法不支援排程組建。 建立 YAML 組建管線之後,您可以使用管線設定來指定排程的觸發程式。

TFS 不支援 YAML。

Cron 語法

每個Azure Pipelines排程觸發程式 cron 運算式都是以空格分隔的運算式,並以下列順序包含五個專案。

mm HH DD MM DW
 \  \  \  \  \__ Days of week
  \  \  \  \____ Months
   \  \  \______ Days
    \  \________ Hours
     \__________ Minutes
欄位 接受的值
分鐘 0 到 59
小時 0 到 23
1 到 31
1 到 12,完整英文名稱,英文名稱的前三個字母
星期幾 0 到 6 (開頭為星期日) 、完整英文名稱、英文名稱的前三個字母

值可以是下列格式。

[格式] 範例 描述
萬用字元 * 符合此欄位的所有值
單一值 5 指定此欄位的單一值
逗號分隔 3,5,6 指定此欄位的多個值。 可以合併多個格式,例如 1,3-6
範圍 1-3 此欄位值的內含範圍
間隔 */41-5/2 要符合此欄位的間隔,例如每四個值或範圍 1-5,步驟間隔為 2
範例 Cron 運算式
在每個星期一、星期三和星期五下午 6:00 建置 0 18 * * Mon,Wed,Fri0 18 * * 1,3,50 18 * * 1-5/2
每隔 6 小時建置一次 0 0,6,12,18 * * *0 */6 * * *0 0-18/6 * * *
從上午 9:00 開始每隔 6 小時建置一次 0 9,15,21 * * *0 9-21/6 * * *

如需支援格式的詳細資訊,請參閱 Crontab 運算式

AZURE DEVOPS SERVER 2019 中的 YAML 語法不支援排程組建。 建立 YAML 組建管線之後,您可以使用管線設定來指定排程的觸發程式。

TFS 不支援 YAML。

排程的執行檢視

您可以從管線詳細資料頁面上的操作功能表中,選擇 [排程執行] 來檢視即將推出的排程組建預覽。

Scheduled runs menu

建立或更新已排程的觸發程式之後,您可以使用此檢視來驗證這些觸發程式。

Scheduled runs

此範例會顯示下列排程的排程執行。

schedules:
- cron: "0 0 * * *"
  displayName: Daily midnight build
  branches:
    include:
    - main

[已排程的執行] 視窗會顯示轉換成電腦上用來流覽至Azure DevOps入口網站之本機時區的時間。 此範例會顯示在 EST 時區中擷取的螢幕擷取畫面。

AZURE DEVOPS SERVER 2019 中的 YAML 語法不支援排程組建。 建立 YAML 組建管線之後,您可以使用管線設定來指定排程的觸發程式。

TFS 不支援 YAML。

即使沒有任何程式碼變更,仍執行

注意

不論 TFS 2018.1 和更低版本的程式碼變更,排程組建一律會依排程執行。

根據預設,如果您的管線在上次成功排程執行之後沒有程式碼變更,則不會依照排程執行的方式執行。 例如,假設您已排程管線在下午 9:00 執行一次。 在工作日期間,您會將各種變更推送至程式碼。 管線會依排程執行。 在週末,您不會對程式碼進行任何變更。 如果在星期五排程執行之後沒有任何程式碼變更,則管線不會如週末的排程執行一樣執行。

若要強制管線在沒有任何程式碼變更時執行,您可以使用 always 關鍵字。

schedules:
- cron: ...
  ...
  always: true

此版本Azure DevOps Server的 YAML 語法不支援排程組建。 建立 YAML 組建管線之後,您可以使用管線設定來指定排程的觸發程式。

TFS 不支援 YAML。

排程執行數目的限制

您可以排程管線執行的頻率有一些限制。 這些限制已就緒,以防止誤用Azure Pipelines資源,特別是 Microsoft 裝載的代理程式。 此限制大約是每週每個管線 1000 次執行。

從傳統編輯器移轉

下列範例示範如何將排程從傳統編輯器移轉至 YAML。

範例:在多個時區中建置 Git 存放庫的夜間組建

在此範例中,傳統編輯器排程觸發程式有兩個專案,會產生下列組建。

  • 每個星期一 - 星期五上午 3:00 (UTC + 5:30 時區) ,建置符合分支篩選準則的 features/india/* 分支

    Scheduled trigger UTC + 5:30 time zone

  • 每星期一 - 星期五上午 3:00 (UTC - 5:00 時區) ,建置符合分支篩選準則的 features/nc/* 分支

    Scheduled trigger UTC -5:00 time zone

對等的 YAML 排程觸發程式為:

schedules:
- cron: "30 21 * * Sun-Thu"
  displayName: M-F 3:00 AM (UTC + 5:30) India daily build
  branches:
    include:
    - /features/india/*
- cron: "0 8 * * Mon-Fri"
  displayName: M-F 3:00 AM (UTC - 5) NC daily build
  branches:
    include:
    - /features/nc/*

在第一個排程中, M-F 3:00 AM (UTC + 5:30) 印度每日組建,cron 語法 () mm HH DD MM DW30 21 * * Sun-Thu

  • 分鐘和小時 - 30 21 這會對應至 21:30 UTC (9:30 PM UTC) 。 由於傳統編輯器中的指定時區是 UTC + 5:30,因此我們需要從所需的建置時間 3:00 AM 減去 5 小時和 30 分鐘,才能到達所需的 UTC 時間,以指定 YAML 觸發程式。
  • 天數和月份會指定為萬用字元,因為此排程不會指定只在特定月份或特定月份執行。
  • 一周的天數 - Sun-Thu 由於時區轉換,我們的組建在 UTC + 5:30 印度時區的上午 3:00 執行,我們必須指定在 UTC 時間的前一天開始。 我們也可以將星期幾指定為 0-40,1,2,3,4

第二個排程 中,M-F 3:00 AM (UTC - 5) NC 每日組建,cron 語法為 0 8 * * Mon-Fri

  • 分鐘和小時 - 0 8 這對應至 8:00 AM UTC 。 由於傳統編輯器中的指定時區是 UTC - 5:00,因此我們需要從所需的建置時間 3:00 AM 新增 5 小時,才能抵達所需的 UTC 時間,以指定 YAML 觸發程式。
  • 天數和月份會指定為萬用字元,因為此排程不會指定只在特定月份或特定月份執行。
  • 一周的天數 - Mon-Fri 因為我們的時區轉換不會針對我們想要的排程跨越一周的多個天,因此我們不需要在這裡進行任何轉換。 我們也可以將星期幾指定為 1-51,2,3,4,5

重要

YAML 排程觸發程式中的 UTC 時區不會考慮日光節約時間。

提示

使用一周的 3 個字母天數,並想要跨越數天到 Sun 時,Sun 應該視為一周的第一天,例如,針對午夜 EST、星期四到星期日的排程,cron 語法為 0 5 * * Sun,Thu-Sat

範例:以不同頻率的夜間建置

在此範例中,傳統編輯器排程觸發程式有兩個專案,會產生下列組建。

  • 每星期一 - 星期五上午 3:00 UTC,建置符合 和 releases/* 分支篩選準則的 main 分支

    Scheduled trigger frequency 1.

  • 每星期日上午 3:00 UTC,建 releases/lastversion 置分支,即使來源或管線未變更也一樣

    Scheduled trigger frequency 2.

對等的 YAML 排程觸發程式為:

schedules:
- cron: "0 3 * * Mon-Fri"
  displayName: M-F 3:00 AM (UTC) daily build
  branches:
    include:
    - main
    - /releases/*
- cron: "0 3 * * Sun"
  displayName: Sunday 3:00 AM (UTC) weekly latest version build
  branches:
    include:
    - /releases/lastversion
  always: true

在第一個排程中, M-F 3:00 AM (UTC) 每日組建,cron 語法為 0 3 * * Mon-Fri

  • 分鐘和小時 - 0 3 這對應至 3:00 AM UTC 。 由於傳統編輯器中的指定時區是 UTC,因此我們不需要進行任何時區轉換。
  • 天數和月份會指定為萬用字元,因為此排程不會指定只在特定月份或特定月份執行。
  • 一周的天數 - Mon-Fri 因為沒有時區轉換,所以一周中的天數會直接從傳統編輯器排程對應。 我們也可以將星期幾指定為 1,2,3,4,5

第二個排程中, 星期天上午 3:00 (UTC) 最新版本組建,cron 語法為 0 3 * * Sun

  • 分鐘和小時 - 0 3 這對應至 3:00 AM UTC 。 由於傳統編輯器中的指定時區是 UTC,因此我們不需要進行任何時區轉換。
  • 天數和月份會指定為萬用字元,因為此排程不會指定只在特定月份或特定月份執行。
  • 星期幾 - Sun - 因為我們的時區轉換不會針對所需的排程跨越一周中的多天,所以我們不需要在這裡進行任何轉換。 我們也可以將星期幾指定為 0
  • 我們也指定 always: true ,因為此組建已排定執行原始程式碼是否已更新。

常見問題集

我在 YAML 檔案中定義了排程。 但未執行。 結果如何?

  • 檢查Azure Pipelines排程管線的後續幾個執行。 您可以在管線中選取 [已排程的執行 ] 動作來找到這些執行。 清單會向下篩選,只顯示接下來幾天的後續執行。 如果不符合您的預期,可能是您輸入錯誤的 cron 排程,或者您沒有正確分支中定義的排程。 請閱讀上述主題,以瞭解如何設定排程。 重新評估您的 cron 語法。 cron 排程的所有時間都是 UTC。

  • 對 YAML 檔案進行小型變更,並將該更新推送至您的存放庫。 如果稍早從 YAML 檔案讀取排程時發生任何問題,則現在應該加以修正。

  • 如果您在 UI 中定義了任何排程,則不會接受您的 YAML 排程。 流覽至管線的編輯器,然後選取 [ 觸發程式],確定您沒有任何 UI 排程。

  • 您可以排程管線的執行數目有限制。 深入瞭解 限制

  • 如果您的程式碼沒有任何變更,Azure Pipelines可能不會啟動新的執行。 瞭解如何 覆寫 此行為。

我的 YAML 排程正常運作。 但是,他們現在已停止運作。 如何?偵錯此問題嗎?

  • 如果您未指定 always:true ,除非對程式碼進行任何更新,否則不會排程管線。 檢查是否有任何程式碼變更,以及您設定 排程的方式。

  • 您可以排程管線的次數 有限制 。 檢查您是否已超過這些限制。

  • 檢查某人是否在 UI 中啟用更多排程。 開啟管線的編輯器,然後選取 [觸發程式]。 如果他們在 UI 中定義排程,則不會接受您的 YAML 排程。

  • 檢查管線是否已暫停或停用。 選取管線設定

  • 檢查Azure Pipelines排程管線的後續幾個執行。 您可以在管線中選取 [已排程的執行 ] 動作來找到這些執行。 如果您沒有看到預期的排程,請對 YAML 檔案進行小型變更,並將更新推送至您的存放庫。 這應該會重新同步排程。

  • 如果您使用 GitHub 來儲存程式碼,Azure Pipelines可能會在嘗試啟動新的執行時,GitHub節流。 檢查您是否可以手動啟動新的執行。

我的程式碼尚未變更,但已觸發排程的組建。 為什麼?

  • 您可能已啟用一個選項 來一律 執行排程的組建,即使沒有任何程式碼變更也一樣。 如果您使用 YAML 檔案,請確認 YAML 檔案中排程的語法。 如果您使用傳統管線,請確認您已在排程觸發程式中核取此選項。

  • 您可能已更新組建管線或管線的某些屬性。 即使您尚未更新原始程式碼,這會導致排程新的執行。 使用傳統編輯器確認管線中變更的 歷程 記錄。

  • 您可能已更新用來連線到存放庫的服務連線。 即使您尚未更新原始程式碼,這會導致排程新的執行。

  • Azure Pipelines會先檢查程式碼是否有任何更新。 如果Azure Pipelines無法連線到您的存放庫或取得此資訊,則會建立資訊執行。 這是虛擬組建,可讓您知道Azure Pipelines無法連線到您的存放庫。

我在 [排程的執行] 面板中看到計劃性執行。 不過,它不會在該時間執行。 為什麼?

  • [ 已排程的執行 ] 面板會顯示所有可能的排程。 不過,除非您已對程式碼進行實際更新,否則它可能不會實際執行。 若要強制排程一律執行,請確定您已在 YAML 管線中設定 always 屬性,或核取選項一律在傳統管線中執行。

YAML 管線中定義的排程適用于一個分支,而不是另一個分支。 我要如何修正此問題?

排程是在 YAML 檔案中定義,而且這些檔案會與分支相關聯。 如果您想要為特定分支排程管線,例如 features/X ,請確定 該分支中的 YAML 檔案已定義 cron 排程,而且其包含排程的正確分支。 分支中的 features/X YAML 檔案在此範例中應該有下列專案 schedule

schedules: 
- cron: "0 12 * * 0"   # replace with your schedule 
  branches: 
    include: 
    - features/X  

如需詳細資訊,請參閱 排程觸發程式的分支考慮