Rush Stack商店部落格活動
跳至主要內容

將 Mergify 與 Rush 搭配使用

Mergify 為 GitHub 提供額外的服務,擴展了合併佇列的功能。如果您不熟悉合併佇列,請先參閱 Rush 文件中的最佳實務:啟用合併佇列,以及 Mergify 的什麼是合併佇列?為何要使用它?

最佳化佇列的常見問題牽涉到許多取捨和啟發式方法,用於選擇要平行化或合併的工作。這為實作者之間創造了許多最佳化和差異化的機會。Mergify 的服務目標是大型、高速度的單一儲存庫。他們的合併佇列效能基準呈現了一個功能矩陣,突顯了各系統之間的差異。

基本範例

Mergify 設定檔通常稱為 .mergify.yml,它定義了大部分的行為。讓我們總結提取要求的基本生命週期:一旦在您的儲存庫中建立 PR,Mergify 將會偵測到它,並根據pull-request-rules 進行檢查。此規則集可讓您自動化並調整各種工作流程。

pull-request-rules 包含條件和動作,特別是 queue 動作。一旦 PR 驗證了提取要求規則的條件,它將會觸發其動作,導致 PR 進入佇列。以下是一個範例設定檔

.mergify.yml

queue_rules:
- name: default
merge_conditions:
- '#approved-reviews-by>=2'
- check-success=Travis CI - Pull Request

pull_request_rules:
- name: merge using the merge queue
conditions:
- base=main
- label=queue
actions:
queue:

在上面,我們定義了一個獨特的合併佇列,名為 default,它具有自己的一組條件。在合併 PR 之前,需要驗證 merge_conditions

使用分割來提高平行處理能力

最佳化合併佇列的關鍵在於識別可以平行執行,因為它們的 Git diff 是獨立的工作。如果 (1) 它們的 diff 不涉及相同的檔案,而且 (2) 根據相依性圖表,兩個 diff「影響」的檔案沒有重疊,則兩個 PR 是「獨立」的。Rush 的相依性分析以 Rush 專案的粒度(而不是個別檔案)運作。就Rush 專案選取器而言,這表示 rush list --impacted-by git:origin/main 在兩個 PR 之間不得有任何重疊。

Mergify 的分割與此分析中的 Rush 專案類似;每個分割都定義了一組檔案,並且能夠宣告分割之間的相依性關聯,然後它可以判斷工作是否平行建置。

例如,假設您的 Rush 工作區包含三個專案,分別稱為 project-aproject-bproject-c。以下是一個範例硬式連線設定

.mergify.yml

partition_rules:
- name: project-a
conditions:
- files~=^apps/project-a

- name: project-a
conditions:
- files~=^apps/project-a

- name: project-a
conditions:
- files~=^apps/project-c

queue_rules:
- name: default
merge_conditions:
- and:
- or:
- queue-partition-name!=project-a
- check-success=ciA
- or:
- queue-partition-name!=project-a
- check-success=ciB
- or:
- queue-partition-name!=project-a
- check-success=ciC

pull_request_rules:
- name: merge using the merge queue
conditions:
- base=main
- label=queue
actions:
queue:

在此範例中,如果 PR 修改了 project-a 資料夾下的檔案,則將用於自動檢查和合併 PR 的分割和合併佇列將是 project-a 的分割和合併佇列。

如果 PR 同時修改了來自兩個或更多專案的檔案,則將在每個對應的分割中檢查 PR。

在大型單一儲存庫中,手動編碼 files~= 條件是不切實際的;它需要使用指令碼產生。

💡即將推出

我們正在共同開發一個不限於供應商的project-impact-graph.yaml 規格和隨附的 Rush 外掛程式,讓 Mergify 等服務能夠直接查詢 rush.json 相依性圖表。

自動化動作

Mergify 還包含工作流程自動化功能,可以自動執行新增註解、指派審閱者或新增標籤等工作。例如

.mergify.yml

pull_request_rules:
- name: comment on project-a pull request
conditions:
- files~=^apps/project-a
actions:
comment:
message: This pull request modifies a file in project-a

- name: assign review to a project-b reviewer
conditions:
- files~=^apps/project-b
actions:
assign:
add_users:
- projectb_reviewer

- name: add label on project-c pull request
conditions:
- files~=^apps/projectC
actions:
label:
toggle:
- project-c

其他一些實用的動作

  • Backport:在合併後,將提取要求複製到另一個分支。
  • Update:使用其基本分支更新提取要求分支。

另請參閱