Skip to content

Tự gộp PR khi CI xanh (SRC-1334) ​

Chủ dự án 11.10.2026: gộp tay sau mỗi lượt CI dài khoảng 20 phút thì main thường đã đổi, PR xung đột, phải gỡ và chạy CI lại. Nút "Allow auto-merge" của GitHub cần luật bảo vệ nhánh, mà repo private gói miễn phí không có (API trả "Upgrade to GitHub Pro"). Chủ dự án chọn tự dựng thay vì trả tiền.

Cách dùng ​

bash
gh pr edit <số PR> --add-label automerge

Workflow .github/workflows/automerge.yml chạy mỗi khi workflow ci của một PR xong, và khi một PR vừa được gắn nhãn. PR được gộp (kiểu merge commit) khi đủ bốn điều:

  1. PR mở và có nhãn automerge.
  2. Lượt ci mới nhất của đúng commit đầu PR xanh. Đẩy commit mới thì phải chờ lượt CI mới.
  3. Nếu main đã có commit mới ở cùng vùng code kể từ lúc CI của PR chạy, workflow cập nhật nhánh PR theo main (nút "Update branch") và chờ lượt CI mới thay vì gộp (SRC-1341). Đây là phần "hàng đợi gộp" tự dựng: hai PR xanh riêng chưa chắc xanh khi gộp chung, nên PR chỉ được gộp khi đã kiểm cùng mọi thay đổi chạm vùng của nó. Vùng là thư mục cấp hai (apps/learn, workers/api...); packages/, migrations/, .github/ và gốc repo dùng chung nên chồng với mọi vùng code; docs/ chỉ chồng với docs/. main đổi ở vùng khác thì gộp luôn, nếu không với khoảng 30 commit mỗi ngày hàng đợi sẽ không bao giờ chảy.
  4. PR không xung đột. Nếu xung đột, workflow thử gộp main vào nhánh PR bằng git merge thật ngay trong runner (SRC-1343): hai PR cùng chèn dòng vào đuôi một mảnh sổ chung là xung đột với nút gộp của GitHub, nhưng git gỡ được nhờ merge=union trong .gitattributes (nút của GitHub không đọc luật đó). Gộp sạch thì đẩy lên, CI chạy lại, lượt sau tự gộp. Xung đột thật trong code thì workflow để lại bình luận kèm tên file. Xung đột thì workflow để lại bình luận và không gộp; gỡ tay rồi đẩy lại, nhãn vẫn còn.

Sau khi gộp, CI của main chạy lại toàn bộ cổng và chỉ deploy khi xanh, như với PR gộp tay.

Vì sao cần AUTOMERGE_TOKEN ​

Gộp bằng GITHUB_TOKEN mặc định thì GitHub không phát sự kiện push vào main, nên ci.yml không chạy và không deploy (deploy chỉ chạy trên push; một lượt workflow_dispatch không deploy). Vì vậy workflow gộp bằng token cá nhân của chủ dự án, cất trong secret AUTOMERGE_TOKEN. Thiếu secret thì workflow đỏ và nói rõ, không gộp.

Tạo token (chủ dự án làm, một lần): GitHub → Settings → Developer settings → Fine-grained tokens → Generate: chỉ repository dac2205/nemo12.com, quyền Contents: Read and write và Pull requests: Read and write. Rồi repo → Settings → Secrets and variables → Actions → New repository secret, tên AUTOMERGE_TOKEN. Token hết hạn thì workflow đỏ với cùng thông báo; tạo token mới và thay secret.