Quality Gate GitHub Actions: Periksa Sebelum Deploy
Belajar quality gate CI dari workflow nyata: typecheck, lint, test, dan build, dependensi job dengan needs, urutan fail-fast, dan branch protection.
Oleh Matthews WongDitinjau pada
Poin utama
Quality gate CI adalah pemeriksaan yang kegagalannya menghentikan pipeline sebelum tahap berikutnya. Di GitHub Actions, step berjalan berurutan dan berhenti di kegagalan pertama, job dengan needs dilewati ketika job yang dibutuhkannya gagal, dan branch protection bisa mewajibkan pemeriksaan sebelum merge. Pemeriksaan murah ditaruh di depan agar commit buruk gagal cepat.
Setelah pelajaran ini, Anda bisa
- Mengurutkan typecheck, lint, test, dan build menjadi pipeline di mana setiap gate melindungi tahap berikutnya.
- Memakai needs agar job yang gagal membuat semua tahap setelahnya dilewati, dan menjelaskan arti job yang dilewati.
- Menyebut apa yang dicakup gate situs ini, apa yang tidak, dan di mana branch protection berperan.
Ikuti diagramnya langkah demi langkah
Tekan Putar, atau melangkah dengan panah. Setiap langkah juga ditulis di bawah diagram.
Bagaimana pemeriksaan yang gagal menghentikan deploy
Sebuah push menjalankan typecheck, lalu lint, lalu build, lalu deploy. Kegagalan di gate pertama membuat semua job berikutnya dilewati, dan pemeriksaan yang tidak pernah dijalankan CI tidak melindungi apa pun.
Tombol: ← → langkah · Home / End · K putar atau jeda
Satu rantai: push, typecheck, lint, build, deploy. Setiap job menunggu job sebelumnya. Dua kotak pudar di bawah adalah celah yang akan kita bahas.
Push memicu workflow. Typecheck dan lint adalah step di job verify, jadi berjalan berurutan: lint hanya mulai jika typecheck lolos.
Tebak langkah berikutnya Typecheck melaporkan error. Apa yang terjadi pada job build dan deploy? (Tetap berjalan · Dilewati · Hanya deploy yang dilewati)Error tipe menggagalkan step, sehingga job verify gagal. Job yang membutuhkannya dilewati, begitu pula setiap job yang membutuhkan job itu. Tidak ada yang di-build atau di-deploy.
Perbaiki error lalu push lagi. Typecheck lolos, lint lolos, dan baru setelah itu job build dimulai. Deploy menunggu build dengan cara yang sama.
needs: verifyRepo ini punya script npm test, tetapi workflow tidak pernah memanggilnya. Test yang gagal tidak akan menghentikan deploy. Gate punya celah tepat di tempat tidak ada job yang berjalan.
Tebak langkah berikutnya Aturan branch mewajibkan sebuah check, tetapi check itu akhirnya dilewati. Bisakah pull request di-merge? (Tidak, dilewati dianggap gagal · Bisa, dilewati dianggap terpenuhi)Required status checks adalah pengaturan GitHub, bukan kode workflow. Jika diaktifkan, pull request tidak bisa di-merge sampai check lolos. Check yang dilewati dianggap terpenuhi.
Apa itu quality gate?
Quality gate adalah pemeriksaan yang harus lolos sebelum pipeline berlanjut. Idenya sederhana: tentukan apa yang harus benar pada setiap commit, jalankan pemeriksaan itu secara otomatis, dan buat kegagalan menghentikan jalur. Kandidat yang umum adalah typecheck, linter, test otomatis, dan build.
Baca selengkapnya (1)Tutup
Intinya bukan seremoni. Pemeriksaan yang dijalankan dari ingatan akan terlewat di hari ketika Anda terburu-buru, yaitu hari ketika Anda paling membutuhkannya. Gate tidak lupa.
Bagaimana step dan needs mengubah pemeriksaan menjadi gate?
Di dalam satu job, step berjalan berurutan. Kecuali ada kondisi lain, sebuah step hanya berjalan jika step sebelumnya berhasil, karena kondisi defaultnya adalah success(). Runner menentukan lolos atau gagal dari kode exit perintah, jadi typecheck atau linter yang gagal sudah cukup menghentikan job.
Baca selengkapnya (1)Tutup
Antar job, needs menyebut job yang harus selesai lebih dulu. Jika sebuah job gagal atau dilewati, semua job yang membutuhkannya ikut dilewati, kecuali ada kondisi seperti always() yang menimpanya. Itulah yang membuat rantai job menjadi gate: build needs verify, deploy needs build.
Pemeriksaan mana yang didahulukan, dan kenapa fail fast?
Taruh pemeriksaan yang paling murah dan paling informatif di depan. Typecheck atau linter melaporkan kesalahan jauh sebelum build penuh selesai, sehingga commit buruk ditolak lebih awal dan job yang lambat dan mahal tidak pernah dimulai. Fail fast menghemat waktu runner dan, yang lebih berguna, membuat sinyalnya sampai ke Anda lebih cepat.
Baca selengkapnya (1)Tutup
Matrix menambahkan saklar yang berkaitan. Dengan fail-fast aktif, kegagalan pada job matrix yang tidak boleh gagal membatalkan job matrix yang masih berjalan atau mengantre. Situs ini tidak memakai matrix, tetapi aturannya sama: berhenti membuang waktu pada run yang tidak mungkin berhasil.
Di mana gate situs ini berhenti?
Job verify menjalankan npm ci, lalu typecheck, lalu linter. Job build needs verify dan job deploy needs build, sehingga tidak ada image yang dibuat dari commit yang typecheck atau lint-nya gagal. Build Next sendiri sengaja melewati typecheck dan lint karena keduanya sudah berjalan sekali, dan konfigurasinya meminta skip itu dihapus jika verify tidak lagi menjadi gerbang build.
Baca selengkapnya (1)Tutup
Satu celah yang jujur dan satu gate tambahan. Celahnya: repo punya script npm test, tetapi tidak ada workflow yang memanggilnya, jadi test bukan gate. Tambahannya: build juga memicu script prebuild, yang menjalankan pemeriksaan paritas, penempatan, import, dan kunci pesan situs, sehingga pemeriksaan itu memang menjadi gate bagi image. Workflow smoke terpisah mem-build situs dan menjalankan tes browser pada pull request, tetapi deploy tidak menunggunya.
Apa yang ditambahkan branch protection?
Workflow melaporkan hasil; branch protection yang membuat hasil itu mengikat. Dengan required status checks aktif, semua check wajib harus lolos sebelum perubahan bisa di-merge ke branch yang dilindungi. Check berstatus berhasil, dilewati, atau netral dianggap terpenuhi, jadi gate yang tidak sengaja dilewati adalah gate yang terbuka.
Baca selengkapnya (1)Tutup
Dua detail yang sering menjebak. Nama job sebaiknya unik di semua workflow, karena nama yang dipakai ulang bisa memberi hasil ambigu dan memblokir merge. Dan workflow deploy ini berjalan pada push ke main, bukan pada pull request, jadi untuk menggerbangi pull request Anda perlu workflow yang berjalan pada event pull_request. File repo tidak bisa menunjukkan apakah branch protection aktif; itu ada di pengaturan repositori.
Konfigurasi nyata di balik pelajaran ini
Kutipan dari repositori yang membangun dan men-deploy situs ini, apa adanya.
- run: npm ci
- run: npx tsc --noEmit
- run: npm run lint
build-and-push:
name: Build & push image
needs: verifySeluruh gate-nya. Tiga step berjalan berurutan, dan kegagalan di salah satunya menggagalkan job verify. Job build menyebutnya di needs, sehingga verify yang gagal membuat build dilewati dan, lewat build, deploy juga.
// Run `npx tsc --noEmit` yourself before pushing, as CLAUDE.md already says.
// If the `verify` job is ever removed or stops gating the build, these two
// lines must come out in the same change.
typescript: { ignoreBuildErrors: true },
eslint: { ignoreDuringBuilds: true },Sebuah pertukaran yang disengaja: build Docker tidak melakukan typecheck atau lint lagi karena gate sudah melakukannya. Komentarnya adalah katup pengaman yang menyebut syarat persis kapan dua baris ini harus dihapus. Gate yang Anda andalkan sebaiknya selalu ditulis seperti ini.
"prebuild": "node scripts/generate-blog-sources.mjs --check && node scripts/game/check-placements.mjs && node scripts/game/check-imports.mjs && node scripts/check-message-keys.mjs",npm menjalankan script bernama prebuild secara otomatis sebelum build. Setiap pemeriksaan digabung dengan &&, jadi yang pertama keluar dengan kode bukan nol menghentikan rantai dan menggagalkan build. Itu menjadikannya gate di dalam step build, tanpa mengubah workflow.
pull_request:Satu baris yang menjadikan workflow ini pemeriksaan pull request. Workflow deploy tidak punya pemicu seperti itu, karena itu gate untuk pull request membutuhkan workflow atau pemicunya sendiri.
Kesalahan yang benar-benar membuang waktu
Job pemeriksaan yang tidak ditunggu siapa pun
needs yang mengurutkan job. Jika job build tidak menyebut verify, tidak ada yang membuatnya menunggu verify, dan pemeriksaan yang gagal tidak lagi menghentikannya. Setiap kali Anda menambah gate, tambahkan juga ke needs job yang harus dilindunginya.
Mematikan pemeriksaan di hilir tanpa gate di hulu
Build situs ini melewati typecheck dan lint karena verify menjalankannya. Hapus verify, atau biarkan ia tidak lagi menggerbangi build, dan error tipe akan terkirim diam-diam. Komentar konfigurasi menyebut keterkaitan ini; tiru kebiasaan itu setiap kali satu pemeriksaan menggantikan yang lain.
Test ada tetapi CI tidak pernah menjalankannya
Script di package.json tidak melindungi apa pun sampai ada job yang memanggilnya. Di sini npm test tidak ada di job verify, jadi test yang gagal tidak menghentikan deploy. Daftarkan apa yang benar-benar dijalankan pipeline Anda, lalu bandingkan dengan isi package.json.
Check wajib yang dilewati
Branch protection menganggap check yang dilewati sebagai terpenuhi. Jika filter path atau kegagalan di hulu membuat job wajib dilewati, tombol merge menjadi hijau. Pastikan check wajib berjalan pada setiap pull request, atau terima bahwa dilewati berarti lolos.
| Yang ditangkapnya | Di gate deploy situs ini | |
|---|---|---|
| Typecheck | Tipe yang salah dan kontrak yang rusak | Ya, job verify |
| Lint | Kode mencurigakan dan aturan gaya | Ya, job verify |
| Build | Kode yang tidak bisa dikompilasi atau di-bundle | Ya, job build (pemeriksaan prebuild lebih dulu) |
| Test | Perilaku yang berubah tanpa sengaja | Tidak, npm test tidak dipanggil |
Lakukan di komputer Anda sendiri
Repo kecil apa pun dengan GitHub Actions bisa dipakai. Anda akan membuat gate dua job, merusaknya dengan sengaja, dan melihat job kedua dilewati.
Jalankan pemeriksaan di lokal lebih dulu, dengan urutan yang Anda inginkan di CI. Perbaiki apa pun yang gagal sebelum push.
npx tsc --noEmit && npm run lintBuat .github/workflows/gate.yml dengan job verify dan job build yang membutuhkannya.
name: gate on: push: branches: [main] pull_request: jobs: verify: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 cache: npm - run: npm ci - run: npx tsc --noEmit - run: npm run lint build: needs: verify runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 cache: npm - run: npm ci - run: npm run buildPush dan pastikan kedua job lolos. Lalu tambahkan error tipe dengan sengaja, misalnya mengisi angka dengan string, dan push lagi.
const count: number = 'three';Buka run-nya. Job verify seharusnya merah dan job build ditandai dilewati, bukan berjalan. Perbaiki error lalu push agar kembali hijau.
Opsional: di pengaturan repositori, tambahkan aturan branch protection untuk main yang mewajibkan check verify, lalu buka pull request dan lihat merge diblokir selagi check gagal.
Tiga pertanyaan sebelum lanjut
Pilih jawaban untuk melihat kenapa benar atau salah. Tidak ada yang disimpan atau dinilai, jadi tebak saja dengan bebas.
Jawab dalam hati, lalu cek
1.Job mana yang harus lolos sebelum job deploy situs ini bisa mulai?Lihat jawabannya
Jawaban:Build and push, yang sendiri membutuhkan verify (typecheck dan lint). Deploy membutuhkan job build, jadi verify yang gagal melewati keduanya.
2.Kenapa build Docker mengatur ignoreBuildErrors dan ignoreDuringBuilds?Lihat jawabannya
Jawaban:Typecheck dan lint sudah berjalan sekali di job verify, jadi mengulanginya di build image hanya membuang waktu. Komentarnya menyebut syarat keluar: jika verify tidak lagi menggerbangi build, hapus kedua baris itu.
3.Apa yang ditambahkan branch protection yang tidak dimiliki workflow saja?Lihat jawabannya
Jawaban:Ia membuat check mengikat: dengan required status checks aktif, pull request tidak bisa di-merge sampai check lolos. Tanpanya, check merah hanyalah peringatan.
Bahasan mendalam terkait di situs ini
Sumber
Sumber primer yang diperiksa pada tanggal riset. Ikuti tautannya untuk versi terbaru.