設定管線的排程

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

接下來,會根據 main 名為 new-feature 的新分支建立。 會讀取新分支中 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

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

# 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 要比對此欄位的間隔,例如每 4 個值或範圍 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 DW) 為 30 21 * * Sun-Thu

  • 分鐘和小時 - 30 21 這會對應至 21:30 UTC (9:30 PM UTC) 。 由於傳統編輯器中的指定時區是 UTC + 5:30,因此我們必須從所需的建置時間減去 5 小時和 30 分鐘,以抵達 YAML 觸發程式所需的 UTC 時間。
  • 天數和月份會指定為萬用字元,因為此排程不會指定只在月份的特定天數或特定月份執行。
  • 星期幾 - 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  

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