將 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-a
、project-b
和 project-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
其他一些實用的動作
另請參閱
- Rush 文件中的最佳實務:啟用合併佇列
- Mergify 文件