Automasi linting pre-merge dan rilis terukur di pipeline CI/CD bukan sekadar menjalankan perintah saat commit. Fokus artikel ini menjawab bagaimana linting dijalankan sebelum merge, QA preview terbentuk dari build yang sama, dan release bertahap diterapkan dengan metrik kesehatan yang dapat ditindaklanjuti.
Dengan panduan ini pembaca akan mendapatkan detail pemilihan tooling, konfigurasi workflow, strategi caching, serta langkah deteksi dan recovery error yang menjaga DX tetap baik.
Pemilihan tooling lint, test, dan preview QA
Linting pre-merge idealnya dilakukan dengan tooling statis yang bisa dijalankan di lingkungan pipeline tanpa intervensi. Pilih tool yang sudah dipakai tim, misalnya ESLint untuk JavaScript atau golangci-lint untuk Go, karena rule set sudah teruji dan lintasan konfigurasi tidak terlalu rumit.
Untuk QA preview, gunakan runner yang sama dengan linting maupun unit test agar artefak build konsisten. Preview QA dapat diwujudkan dengan deploy ke namespace staging singkat atau memanfaatkan preview environment yang dibangun dari branch/PR. Prinsipnya: jalankan test suite lengkap (unit + integrasi ringan) setelah lint lulus, lalu deploy ke preview yang bisa diakses tim QA.
Rilis terukur (staged release) bisa digarap dengan feature flag atau deployment canary yang dikelola lewat CD platform. Implementasi yang paling sederhana adalah mengirimkan build ke environment "canary" terlebih dahulu, baru menjadikannya "production" setelah kesehatan memadai.
Konfigurasi workflow GitHub Actions contoh
Berikut contoh workflow GitHub Actions minimal yang mencakup linting pre-merge, preview QA, dan langkah release awal. Kunci utamanya: jobs dijalankan berurutan, caching digunakan untuk node_modules/temp build, dan artefak preview disimpan untuk dipakai jobs berikutnya.
name: CI/CD terukur
on:
pull_request:
branches: [main]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Cache dependencies
uses: actions/cache@v3
with:
path: |
node_modules
.next/cache
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
- run: npm ci
- run: npm run lint
build-and-preview:
needs: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Restore cache
uses: actions/cache@v3
with:
path: |
node_modules
.next/cache
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
- run: npm ci
- run: npm run build
- name: Upload preview artifact
uses: actions/upload-artifact@v4
with:
name: preview-package
path: .next
release:
needs: build-and-preview
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true
steps:
- uses: actions/download-artifact@v4
with:
name: preview-package
path: release-output
- name: Deploy canary
run: ./scripts/deploy.sh release-output
Workflow ini memastikan linting gagal akan mencegah build/preview berjalan. Caching artifact mempersingkat waktu instalasi dependency, dan job release hanya berjalan ketika PR sudah merge.
Caching artifact dan pemanfaatannya
Caching terbaik adalah fokus pada dependency yang tidak cepat berubah. Untuk npm/Node, node_modules dan cache build (.next/cache, target) bisa disimpan kembali. Pastikan kunci cache berbasis hash file lock yang mencerminkan dependency sehingga cache invalid ketika versi berubah.
Selain cache, artefak build yang digunakan di preview dan release sebaiknya diunggah/diunduh antar job. GitHub Actions upload-artifact/download-artifact cukup sederhana; platform lain punya konsep serupa (GitLab artifacts). Ini menghindari build ulang dari nol dan memastikan preview QA menggunakan output yang sama dengan rilis.
Pengukuran kesehatan build dan metrik rilis
Sesudah pipeline berjalan, pantau metrik berikut:
- Waktu linting: pastikan lint tidak melebihi 4-6 menit. Jika lebih, evaluasi rule yang terlalu berat atau pertimbangkan parallel linting terbagi.
- Proporsi failure pre-merge: ukur berapa PR gagal lint/test agar bisa perbaiki pola commit.
- Waktu deploy preview: time-to-preview cepat memberi feedback QA lebih awal.
- Rollback rate release bertahap: catat berapa kali canary digulung kembali sebagai indikator risiko.
Gunakan dashboard simple seperti Grafana (ekspos metrics dari runner atau sistem monitoring) atau cukup log ke file. Yang penting: metrik mudah diakses dan menunjukkan apakah pipeline sehat.
Deteksi error dan recovery
Penanganan error harus menginformasikan tim secara cepat. Implementasi praktis:
- Lint failure: kirim komentar otomatis di PR dengan ringkasan rule yang dilanggar. Jangan hanya catat di log.
- Gagal build/preview: sediakan log link di notifikasi (email/Slack). Pastikan log jelas menunjukkan langkah terakhir (npm run build, deploy preview).
- Release stuck: buat timeouts dan fallback (misalnya batasi job release 15 menit). Jika deploy canary gagal, rollback otomatis dengan skrip yang memeriksa kesehatan layanan.
Tambahkan skrip diagnosa di pipeline (misalnya menjalankan npm run check-health) sebelum release untuk mendeteksi masalah awal.
Checklist developer experience (DX)
- PR template menjelaskan lint/test mana yang dijalankan dan bagaimana membaca hasilnya.
- Lint rule disertai dokumentasi per rule yang mudah dicari.
- Pipeline memberikan notifikasi (Slack/email) dengan tautan log, bukan hanya “failed”.
- Preview QA berisi URL atau informasi bagaimana mengakses environment result.
- Release stage memiliki guard (misalnya approval atau toggle canary) sehingga developer tahu bagaimana menghentikan jika triger health check gagal.
Dengan checklist ini, pengembang mendapat feedback cepat dan tahu bagaimana menanggapi kegagalan pipeline tanpa harus menebak.
Kesimpulan: Automasi linting pre-merge dan rilis terukur di pipeline CI/CD dicapai dengan memastikan lint dijalankan pertama, preview QA pakai output build yang sama, caching meminimalkan waktu, metrik memantau kesehatan, dan proses deteksi/recovery siap dipakai. Pendekatan ini menjaga kualitas kode tanpa mengorbankan kecepatan pengiriman.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!