Skip to content
Apothem
Runbook

Seremoni Merge PR untuk Pemelihara Tunggal

Kapan pemelihara dapat men-merge pull request miliknya sendiri secara langsung, dan seremoni untuk proteksi branch yang mensyaratkan persetujuan dan memberlakukannya bagi admin.

Rujukan kanonik untuk men-merge sendiri PR di bawah proteksi branch proyek. Proteksi aktif pada main mensyaratkan 0 tinjauan yang menyetujui dan membiarkan enforce_admins nonaktif, sebagaimana tercatat di halaman Proteksi branch. Karena itu, pemelihara men-merge pull request miliknya sendiri secara langsung. Seremoni alih-sementara di halaman ini hanya berlaku ketika proteksi mensyaratkan persetujuan dan memberlakukannya bagi admin.


1. Kebuntuan

Proteksi main yang aktif membawa:

  • required_pull_request_reviews.required_approving_review_count: 0
  • enforce_admins: false

Di bawah pengaturan ini tidak ada kebuntuan. Pull request pemelihara di-merge dengan gh pr merge <pr-number> --squash --delete-branch setelah pemeriksaan status wajibnya hijau dan percakapan tinjauannya diselesaikan.

Kebuntuan hanya ada ketika proteksi membawa kedua pengaturan yang lebih ketat ini:

  • required_pull_request_reviews.required_approving_review_count: 1
  • enforce_admins: true

Aturan ini benar untuk skenario multi-pemelihara (setiap perubahan mencapai main melalui PR yang ditinjau rekan; admin tidak dikecualikan). Aturan ini menghasilkan kebuntuan bagi pemelihara tunggal: kebijakan GitHub melarang persetujuan-mandiri atas PR yang Anda buat sendiri, dan enforce_admins=true memblokir penimpaan gh pr merge --admin terhadap persyaratan persetujuan tinjauan. Dengan enforce_admins: false, --admin melewati persyaratan persetujuan dan tidak ada alih yang diperlukan, tetapi opsi itu juga melewati pemeriksaan wajib yang merah, jadi pastikan pemeriksaan tersebut hijau sebelum menggunakannya.

Ada tiga jalur resolusi:

JalurKapan digunakan
Setel required_approving_review_count: 0 secara permanen (pengaturan aktif)Pakai hanya jika repositori akan tetap dengan pemelihara tunggal tanpa batas waktu; membalik maksud tinjauan dari proteksi
Seremoni alih-sementaraPemelihara tunggal men-merge sendiri selama proteksi mensyaratkan persetujuan dengan enforce_admins=true; menjaga invarian proteksi di luar jendela merge
Sediakan identitas bot CI dengan akses tulisPakai hanya jika onboarding multi-pemelihara sudah dekat; persetujuan oleh bot melemahkan maksud tinjauan manusia dari proteksi

Repositori ini saat ini menggunakan jalur nol-persetujuan permanen. Seremoni alih-sementara adalah jalur kanonik setiap kali proteksi mensyaratkan persetujuan dan memberlakukannya bagi admin.

2. Seremoni Alih-Sementara

Invarian seremoni: keadaan proteksi di awal seremoni sama dengan keadaan proteksi di akhir. Pelonggaran hanya hidup di dalam jendela merge.

Bentuk manual:

# 1. Open the PR, push branch, wait for CI green.
gh pr create --base main --head <feature-branch> --title "..." --body "..."
gh pr checks <pr-number>            # poll until all green

# 2. Relax approver-count to 0.
gh api repos/<owner>/<repo>/branches/main/protection/required_pull_request_reviews \
    -X PATCH -F required_approving_review_count=0

# 3. Squash-merge with admin override (admin override now succeeds because the
#    review-approval requirement is the only block enforce_admins refuses).
gh pr merge <pr-number> --squash --delete-branch --admin

# 4. Restore approver-count to 1.
gh api repos/<owner>/<repo>/branches/main/protection/required_pull_request_reviews \
    -X PATCH -F required_approving_review_count=1

Bentuk terbungkus: lihat scripts/dev/admin_merge.py untuk pembungkus Python atomik yang menjalankan langkah 2 → 3 → 4 dalam satu urutan non-interaktif dengan keamanan rollback try / finally saat langkah 3 gagal.

python scripts/dev/admin_merge.py <pr-number>

3. Invarian

  • Jendela alih diminimalkan. Langkah 2 → 3 → 4 dieksekusi dalam satu urutan non-interaktif. Proteksi berada dalam keadaan longgar hanya selama durasi panggilan API merge — di bawah satu detik pada setiap eksekusi yang teramati.
  • Pemulihan bersifat tanpa syarat. Langkah 4 berjalan bahkan ketika langkah 3 gagal (klausa try / finally pembungkus memastikan pemulihan pada jalur keluar mana pun). Upaya merge yang gagal tidak meninggalkan proteksi dalam keadaan longgar.
  • Gerbang CI dipertahankan sepanjang proses, selama enforce_admins aktif. required_status_checks tidak terpengaruh oleh alih; dengan enforce_admins: true merge tetap mensyaratkan konteks pemeriksaan status yang dikonfigurasi berstatus hijau. Dengan enforce_admins: false, merge --admin pada langkah 3 juga melewati pemeriksaan wajib yang merah, jadi jangan jalankan seremoni dalam keadaan tersebut.
  • Jejak audit terlihat. Anotasi gh pr merge --admin muncul dalam metadata merge PR; alih API proteksi muncul dalam log audit repositori di bawah identitas pemelihara.

4. Kapan TIDAK Menggunakan Seremoni

Selama proteksi mensyaratkan 0 tinjauan yang menyetujui atau membiarkan enforce_admins nonaktif, seremoni tidak diperlukan: lakukan merge secara langsung seperti yang dijelaskan bagian 1.

Seremoni ini untuk merge-mandiri atas PR milik pemelihara sendiri. Ketika peninjau rekan tersedia (kontributor dengan akses tulis), jalur standar gh pr review --approve + gh pr merge --squash --delete-branch adalah yang benar dan seremoni tidak diperlukan.

Jika repositori meng-onboard pemelihara kedua, pensiunkan seremoni: alur tinjauan PR standar memulihkan maksud tinjauan manusia dari proteksi tanpa alih apa pun.

5. Mengaudit Eksekusi Lampau

Setiap pemanggilan seremoni mendarat pada tiga permukaan tahan lama yang dapat diperiksa operator setelahnya:

  • Metadata merge pada PR. gh pr view <pr-number> --json mergedBy,mergedAt,mergeCommit mengembalikan aktor merge, cap waktu merge, dan SHA commit squash. Aktor mergedBy cocok dengan identitas pemelihara yang menjalankan langkah 3.
  • Log audit repositori. gh api /repos/<owner>/<repo>/actions/runs --jq '.workflow_runs[] | select(.event=="push")' mengaitkan eksekusi CI pasca-merge dengan commit merge; log audit aturan proteksi repositori (riwayat gh api /repos/<owner>/<repo>/branches/main/protection melalui antarmuka Settings → Branches) menampilkan alih langkah 2 dan langkah 4 yang mengapit jendela merge.
  • Riwayat git pemelihara. git log main --first-parent --oneline mendaftar setiap commit squash-merge pada main dengan nomor PR terkait pada subjek commit (sufiks (#<pr-number>) sesuai bawaan gh pr merge --squash), memungkinkan operator menelusuri setiap pendaratan lampau kembali ke PR dan pemanggilan seremoninya.

Ketika scripts/dev/admin_merge.py adalah titik masuk, log non-interaktifnya (stderr) menyebutkan tiga panggilan API proteksi dan panggilan API merge secara berurutan; menyalurkan stderr-nya ke tee (2>&1 | tee) menangkap fragmen audit per-eksekusi tanpa bergantung pada retensi log sisi GitHub.

On this page