Kenapa linting dan security scan harus cepat di pnpm workspaces
Monorepo JavaScript/TypeScript yang dikelola dengan pnpm workspaces bisa cepat tumbuh menjadi puluhan paket. Tanpa pendekatan paralel dan caching yang tepat, linting dan security scanning bisa menjadi hambatan signifikan dalam loop feedback developer. Artikel ini langsung menunjukkan bagaimana mengelola lint, formatter, dan scanner keamanan secara paralel di pipeline CI sambil memanfaatkan cache pnpm dan filter workspace agar pekerjaan hanya dilakukan terhadap paket yang berubah.
Desain pipeline CI bertumpu pada paralelisme dan cache
Arsitektur ideal di CI memisahkan job yang bisa berjalan bersamaan: lint (ESLint atau sejenis), prettier check, dan security scan (misalnya npm audit atau tool khusus). Ketiganya mengambil sumber dari workspace yang sama, sehingga menghindari duplikasi install dependency sangat penting.
1. Instalasi dependensi menggunakan pnpm filter
Job awal menjalankan pnpm install dengan cache node_modules, store pnpm, dan filter berdasarkan perubahan. Pada GitHub Actions gunakan pnpm install --filter ... agar hanya workspace yang terpengaruh diinstal.
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Restore pnpm store
uses: pnpm/action-setup@v2
with:
version: stable
- name: Install dependencies
run: pnpm install --frozen-lockfileMenggunakan action pnpm/action-setup memastikan cache store digunakan ulang, mengurangi waktu instalasi. Karena pnpm bekerja di store terpusat, cache bisa disimpan di artefak CI seperti ~/.pnpm-store.
2. Filter workspace dan job fail-fast
Gunakan kemampuan pnpm --filter untuk memproses hanya paket yang berubah. Script di package.json bisa berupa:
{
"scripts": {
"lint:changed": "pnpm --filter ... lint",
"format:check": "pnpm --filter ... prettier --check",
"scan:security": "pnpm --filter ... npm audit"
}
}Argumen --filter "{dir change}" dapat dinamis di pipeline dengan membaca daftar workspace dari pnpm m list --json dan membandingkannya dengan file yang diubah. Lakukan logika ini di step terpisah yang menghasilkan daftar workspace untuk lint/security.
Parallel execution di GitHub Actions
Untuk mempercepat feedback, buat tiga job terpisah yang berjalan parallel setelah instalasi selesai. Pastikan job lint dan prettier fail-fast agar kesalahan langsung dihentikan.
jobs:
install:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
with:
cache: true
- run: pnpm install --frozen-lockfile
- name: Upload node_modules cache
uses: actions/cache@v4
with:
path: ~/.pnpm-store
key: pnpm-store-${{ matrix.node-version }}-${{ github.sha }}
lint:
needs: install
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
with:
cache: true
- run: pnpm lint:changed
prettier:
needs: install
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
with:
cache: true
- run: pnpm format:check
security:
needs: install
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
with:
cache: true
- run: pnpm scan:securitySetiap job mengambil cache pnpm dari step instalasi. Dengan prefetch tahap install, lint dan scan fokus pada validasi. Job lint dan prettier dirancang fail-fast sehingga laporan kesalahan muncul lebih awal.
Strategi incremental dan reporting hasil scan
Incremental linting menghindari menjalankan lint terhadap seluruh monorepo. Langkahnya:
- Gunakan
git diff --name-only origin/main...untuk menentukan file yang terdampak. - Gunakan
pnpm --filterdengan argumen--filter "dir"untuk mengisolasi workspace. - Jika tumpukan berubah tidak menyertakan workspace linting, step lint bisa di-skip dengan kondisi.
Untuk reporting, tambahkan langkah yang mengarsipkan hasil lint/security ke dalam workflow run. Contoh untuk lint:
- name: Save lint report
if: failure()
uses: actions/upload-artifact@v4
with:
name: lint-report
path: lint-report.txtLebih lanjut, gunakan badge atau status GitHub untuk menunjukkan hasil security scan. Jika scanner mendeteksi issue, output JSON/HTML bisa di-upload dan kemudian dibaca oleh tim keamanan.
Trade-off dan debugging
Paralelisme meningkatkan kecepatan, tetapi berarti tahap install harus konsisten agar tidak ada job yang gagal karena cache tidak sinkron. Pastikan setiap job menginstal dependensi dari cache yang sama, dan gunakan pnpm install --frozen-lockfile untuk menjaga reproducibility.
Debugging tip: saat lint/security gagal, jalankan kembali job lokal dengan pnpm --filter berdasarkan nama workspace dari laporan. Gunakan artefak log dari CI untuk melihat pesan lengkap.
Kesimpulan
Dengan membagi linting, prettier, dan security scan ke job paralel dalam pipeline pnpm workspaces, menggunakan filter perubahan workspace, serta menyimpan cache pnpm secara konsisten, feedback loop menjadi cepat dan efisien. Strategi incremental dan reporting artefak memastikan developer tahu hasil check tanpa menunggu seluruh monorepo diverifikasi. Diterapkan dengan benar, pendekatan ini menjaga kualitas kode sekaligus menghemat waktu CI.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!