應急拉取請求的處理:合併隊列策略

自從敏捷和DevOps實踐興起以來,處理緊急拉取請求(PR)一直是開發者社群中的熱議話題。

在這類情境中,我們需要一個系統,能夠將這些「緊急」請求置於常規PR之上,並在必要時允許我們暫緩某些CI檢查。

一個有效的策略是建立一個獨立的合併隊列,使我們能在CI測試通過前,就讓緊急修復優先於默認隊列,快速推進至生產環境。

本文中,我們將利用Mergify根據PR標籤建立兩個合併隊列。一個用於常規PR,另一個專門處理緊急PR。

那麼,讓我們捲起袖子開始吧!

為此示範,我們將初始化一個簡單的React應用程式。至於CI,我們將使用CircleCI

我們將建立兩個合併隊列:

  • 默認:所有PR將按常規流程通過此隊列,需先完成CircleCI檢查。
  • 緊急:此隊列僅針對帶有緊急標籤的PR。這使得這些PR能在不執行CircleCI檢查的情況下,跳至默認隊列的前端。

透過這樣的配置,帶有緊急標籤的拉取請求將在CI運行前就進入隊列。

它將位於默認隊列之前。Mergify將視需要更新拉取請求的基礎分支,等待CI通過,然後合併該拉取請求。

從開發團隊的角度來看,這也是一個相當簡單的過程。開發者只需在創建PR時添加一個urgent標籤,以加快流程。

設置我們的項目

讓我們開始設置我們的項目。我們將使用create-react-app創建一個新的React應用程序。

Shell

 

mkdir emergency-pr-demo
cd emergency-pr-demo
git init
npx create-react-app .

作為參考,這將是我們添加CI和Mergify配置後的最終項目結構。

YAML

 

emergency-pr-demo/
├── .circleci
│   └── config.yml
├── README.md
├── package-lock.json
├── package.json
├── .gitignore
├── .mergify.yml
├── .vscode
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   ├── manifest.json
│   └── robots.txt
└── src
    ├── App.css
    ├── App.js
    ├── App.test.js
    ├── index.css
    ├── index.js
    ├── logo.svg
    ├── reportWebVitals.js
    └── setupTests.js

創建CI配置

為了運行我們的測試,我們將使用CircleCI。它設置簡單,易於上手。

在此,我們將在項目根目錄下新建一個.circleci目錄,並在其中創建一個config.yml文件。

我們將創建一個簡單的作業build_and_test,首先幫助我們檢查項目是否按預期構建,然後使用npm run test命令運行單元測試。

YAML

 

version: 2.1
orbs:
  node: circleci/[email protected]

jobs:
  build_and_test:
    executor: node/default
    steps:
      - checkout
      - node/install-packages:
          pkg-manager: npm
      - run:
          command: npm run test
          name: Run tests
      - run:
          command: npm run build
          name: Build app
      - persist_to_workspace:
          root: ~/project
          paths:
            - .

workflows:
  test_my_app:
    jobs:
      - build_and_test

.circleci/config.yml

創建Mergify配置

現在是時候創建我們的Mergify配置文件了。

Mergify是一個工具,它根據預定義的規則和條件自動化代碼倉庫中合併拉取請求的過程。

我們需要在配置文件中定義兩個隊列,如計劃中的urgentdefault

兩者皆設有相同的merge_conditions, check-success=ci/circleci: build_and_test,意即代碼必須在CircleCI中通過build_and_test檢查後方能合併。

pull_request_rules部分,說明了如何處理拉取請求。若我們的PR標有urgent標籤,將被置於urgent隊列;否則,將進入默認隊列。

.mergify.yml

YAML

 

queue_rules:
  - name: urgent
    merge_conditions:
      - "check-success=ci/circleci: build_and_test"

  - name: default
    merge_conditions:
      - "check-success=ci/circleci: build_and_test"

pull_request_rules:
  - name: move to urgent queue when label urgent
    conditions:
      - base=main
      - label=urgent
    actions:
      queue:
        name: urgent

  - name: merge using the default queue after running the CI checks
    conditions:
      - base=main
      - "check-success=ci/circleci: build_and_test"
      - label!=urgent
    actions:
      queue:
        name: default

設置倉庫

不,我們將直接在GitHub上創建一個新倉庫。

接著,我們需要進行初始提交並使用以下命令推送代碼:

Shell

 

git add .
git commit -m "Initial commit"
git remote add origin <REPO_URL>
git push -u origin master

下一步,我們需配置CircleCI。為此,我們將訪問CircleCI儀表板,進入項目部分並設置我們的項目。

同時,我們還需指定main分支。在這種情況下,CircleCI將自動檢測config文件。

我們可以通過訪問dashboard.mergify.comgithub.com/apps/mergify/installations/new並使用GitHub帳戶登錄,來在GitHub帳戶中安裝Mergify。

隨後,我們可以選擇希望授予Mergify訪問權限的倉庫。

設定完成後,我們將能在Mergify Dashboard上看到兩個佇列。

提出第一個PR(常規PR)

現在讓我們開始創建第一個PR。首先,我們將創建一個新分支regular-pr

Shell

 

git checkout -b regular-pr
git add .

僅為示範目的,接下來我們將在App.css文件中添加一個類。

CSS

 

.Regular-change-class {
    background-color: white;
}

完成後,我們將提交更改並推送至GitHub。

Shell

 

git commit -m 'regular CSS change'
git push --set-upstream origin regular-pr

接著,我們將提出一個不帶任何標籤的Pull Request。

提出第二個PR(緊急PR)

現在我們將為更改創建一個新分支urgent-pr

Shell

 

git checkout main
git branch -b urgent-pr

首先,我們將進行commit,在其中創建一個新組件Urgent.js

JavaScript

 

import React from "react";

export default function Urgent() {
  return <div>This is an Urgent Change</div>;
}

然後,我們將推送此(urgent-pr)分支至我們的GitHub倉庫。

Shell

 

git add .
git commit -m 'Create a component for Urgent change'
git push --set-upstream origin urgent-pr

接著,我們將前往我們的倉庫,從urgent-pr分支向main分支提出一個新PR,並添加一個新標籤urgent

Mergify會自動將第二個PR放入urgent佇列,然後運行CI檢查並將其合併到main分支。

隨後,它會自動合併第一個PR。

您可以在此處查看GitHub倉庫以供參考:github.com/hugoescafit/emergency-pr-demo

結論

本次介紹到此結束!

在本教程中,我們探討了如何借助Mergify設置兩個獨立的合併隊列——默認隊列和緊急隊列,並利用CircleCI建立CI檢查。同時,我們也學習了如何優先處理緊急的PR,使其超越常規PR。

對於緊急拉取請求的管理,還存在多種其他解決方案,例如為其創建專門的hotfix分支、指定專門的審查人員,甚至手動覆蓋檢查。然而,合併隊列是處理此問題的最佳且易於實施的策略之一。

立即訪問Mergify,開始為您的應用程序添加合併隊列吧!

Source:
https://dzone.com/articles/handling-emergency-pull-requests-using-merge-queue