Auto-Upgrade All NPM Packages — Workflow GitHub Actions
Ringkasan cepat
Workflow ini menjalankan upgrade dependency NPM secara dapat setiap bulan dan bisa dipicu manual. Ia memakai npm-check-updates untuk menaikkan versi di package.json, lalu meng-install agar package-lock.json diperbarui. Di akhir, kalau ada perubahan, workflow melakukan commit dan push ke repo.
main.Analisis bagian per bagian Workflow asli
Mari kita bedah workflow GitHub Actions ini secara detail. Ini adalah pipeline otomatis untuk upgrade semua dependency NPM setiap bulan, plus bisa dijalankan manual.
1) Trigger
Workflow berjalan manual lewat workflow_dispatch, dan terjadwal per bulan, pada tanggal 1, setiap jam 02:00 UTC melalui cron. 0 2 1 * *. Ini bagus untuk maintenance rutin sekaligus fleksibilitas eksekusi manual.
name: Auto-Upgrade All NPM Packages
on:
workflow_dispatch:
schedule:
- cron: '0 2 1 * *'
2) Lingkungan
Runner menggunakan ubuntu-latest dan Node.js versi 20. Versi Node terbaru memberi kecepatan dan kompatibilitas yang baik, tapi tetap perlu memastikan project kamu kompatibel (misalnya engine constraints di package.json).
jobs:
upgrade-dependencies:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
persist-credentials: true # Diperlukan untuk push
3) Upgrade dependency
Menggunakan npm-check-updates (ncu) untuk menaikkan semua versi di package.json. Perintah ncu -u akan mengambil versi terbaru termasuk rilis mayor—yang berpotensi breaking change. Setelah itu npm install menghasilkan lockfile baru, memastikan lingkungan build deterministik.
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Upgrade all packages
run: |
npm install -g npm-check-updates
ncu -u
npm install
4) Commit & push
Workflow melakukan stage terhadap package.json dan package-lock.json, lalu commit dan push jika ada perubahan. Mekanisme ini efektif, namun langsung push ke main bisa berisiko bila ada upgrade mayor yang merusak build.
- name: Commit and push if changes detected
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add package.json package-lock.json
# Cek apakah ada perubahan yang di-stage
if ! git diff --cached --quiet; then
git commit -m "chore: upgrade all npm packages to latest versions"
git push
else
echo "No dependency upgrades detected."
fiKelebihan
- Sederhana: setup minimal, mudah dipahami.
- Otomatis: upgrade rutin tanpa intervensi manual.
- Idempotent: commit hanya saat ada perubahan nyata.
- Fleksibel: bisa dijalankan manual kapan pun.
Risiko dan titik lemah
- Upgrade mayor:
ncu -udapat menaikkan ke rilis mayor yang berpotensi breaking. - Tidak ada pengujian: workflow tidak menjalankan
npm testatau build sebelum push. - Langsung ke main: perubahan masuk ke branch utama tanpa review, meningkatkan risiko downtime.
- Lockfile vs manifest: kadang cukup memperbarui
package-lock.jsonuntuk patch keamanan minor.
Versi yang lebih aman (template siap pakai)
Berikut template yang meng-upgrade minor/patch saja, menjalankan test, dan membuat Pull Request otomatis agar tetap ada review.
name: Safe Auto-Upgrade (Minor/Patch) for NPM
on:
workflow_dispatch:
schedule:
- cron: '0 2 1 * *' # Setiap awal bulan jam 2 UTC
jobs:
upgrade-dependencies:
runs-on: ubuntu-latest
permissions:
contents: write # Izin untuk commit/push ke branch
pull-requests: write # Izin untuk membuat PR
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm' # Mengaktifkan caching npm
- name: Install dependencies
run: npm ci # Gunakan ci untuk install dari lockfile
- name: Upgrade dependencies (minor & patch only)
id: upgrade # Beri ID untuk cek output
run: |
npm install -g npm-check-updates
# Jalankan ncu, simpan outputnya
UPGRADES=$(ncu -u --target minor)
echo "Output ncu: $UPGRADES"
# Cek apakah ada perubahan di package.json setelah ncu
if [[ $(git status --porcelain package.json) ]]; then
echo "changes_detected=true" >> $GITHUB_OUTPUT
npm install # Install ulang untuk update lockfile
else
echo "changes_detected=false" >> $GITHUB_OUTPUT
echo "Tidak ada upgrade minor/patch yang ditemukan."
fi
# Hanya jalankan test jika ada perubahan
- name: Run tests (if changes detected)
if: steps.upgrade.outputs.changes_detected == 'true'
run: |
npm run build --if-present
npm test --if-present
# Tambahkan '|| true' jika test boleh gagal tapi PR tetap dibuat
# run: (npm run build --if-present && npm test --if-present) || true
- name: Create Pull Request (if changes detected)
if: steps.upgrade.outputs.changes_detected == 'true'
uses: peter-evans/create-pull-request@v6
with:
# Token default GITHUB_TOKEN punya izin karena 'permissions' di atas
# token: ${{ secrets.PAT_FOR_PR }} # Opsional: Gunakan PAT jika butuh trigger workflow lain
branch: chore/upgrade-deps-${{ github.run_id }}
title: 'chore: upgrade npm dependencies (minor/patch)'
commit-message: 'chore: upgrade npm dependencies (minor/patch)'
body: |
Upgrade otomatis dependencies menggunakan npm-check-updates (target: minor/patch).
- Build dan test dijalankan di CI.
- Perubahan dapat dilihat pada file `package.json` dan `package-lock.json`.
- Mohon review sebelum di-merge.
labels: dependencies, chore, automated pr
reviewers: frijal # Ganti dengan username GitHub Anda/tim
# assignees: user1,user2
draft: false # Set true jika ingin PR dibuat sebagai draftNama workflow mudah dikenali di tab Actions. Triggernya workflow_dispatch (tombol manual Run workflow) dan schedule dengan cron 0 2 1 * * yang berarti jalan otomatis tiap tanggal 1 jam 02:00 UTC (sekitar jam 9 atau 10 pagi WIB tergantung DST). Job utama (upgrade-dependencies) berjalan di runner ubuntu-latest. Langkah-langkahnya: checkout kode, setup Node.js versi 20, lalu upgrade semua paket memakai npm-check-updates dengan flag -u (update package.json), baru npm install untuk memperbarui package-lock.json. Di akhir, kalau ada perubahan pada kedua file tersebut, ia akan melakukan commit dan push langsung ke branch tempat workflow berjalan (biasanya main atau master).
Kelebihannya jelas: sederhana banget setup-nya, otomatis berjalan rutin, aman karena hanya commit jika benar-benar ada perubahan (git diff --cached --quiet), dan fleksibel karena bisa dipicu manual kapan saja perlu. Namun, ada potensi masalah serius: ncu -u tanpa filter akan menaikkan versi ke major release terbaru yang hampir pasti mengandung breaking changes*. Workflow ini juga tidak punya langkah *testing (npm test) atau build (npm run build) setelah upgrade, jadi bisa saja kode yang di-push itu rusak. Ditambah lagi, commit langsung ke branch utama tanpa Pull Request (PR) itu berisiko mengganggu tim atau bahkan menyebabkan downtime jika branch itu langsung ter-deploy. Terakhir, kadang kita hanya perlu update minor/patch di lockfile untuk keamanan tanpa mengubah range versi di package.json.
Rekomendasi versi yang jauh lebih aman adalah: gunakan ncu -u --target minor untuk membatasi upgrade hanya ke versi minor dan patch terbaru dalam range yang diizinkan semver. Setelah upgrade, wajib jalankan langkah npm install, npm run build --if-present (jika ada script build), dan npm test --if-present (jika ada script test). Terakhir, gunakan action seperti peter-evans/create-pull-request untuk membuat PR otomatis ke branch utama. Dengan begini, perubahan tetap diisolasi di branch baru, diuji oleh CI, dan bisa direview oleh tim sebelum di-merge. Kamu bisa menambahkan label (dependencies, chore), mengatur reviewer otomatis, dan bahkan menautkan changelog jika perlu di body PR. Untuk monorepo, pertimbangkan menjalankan workflow ini per paket/workspace menggunakan matrix strategy agar lebih terkelola.
Kalau kamu ingin hanya lockfile saja tanpa mengubah versi di package.json, gantilah langkah upgrade menjadi:
# Opsi hanya update lockfile sesuai range di package.json
npm update --package-lock-onlyTips tambahan biar mulus
- Pin engine: set
enginesdipackage.jsonjika project butuh Node versi tertentu untuk mencegah error saat GitHub Actions pakai versi berbeda. - Monorepo: Jika pakai Lerna/Nx/workspaces, jalankan upgrade per paket atau gunakan matrix build agar lebih terisolasi.
- Security alerts: Integrasi Dependabot dari GitHub atau tambahkan step
npm audit --productiondi workflow untuk menangkap vulnerability dan patch lebih cepat. - Changelog-aware: Jika perlu info detail perubahan, tambahkan step kecil yang bisa mencoba mengekstrak bagian relevan dari
CHANGELOG.mdpaket yang diupgrade atau link ke rilis GitHub-nya (agak kompleks, biasanya manual review lebih mudah). - Fail-fast: Pastikan script
npm testAnda punya coverage yang baik dan akan exit dengan error code jika ada kegagalan, sehingga PR otomatis menandai status check failure.
Bagaimana cara pakai cepat
- Salin template: Ambil workflow “Safe Auto-Upgrade” di atas dan simpan sebagai file
.github/workflows/upgrade-npm.ymldi repo Anda. - Sesuaikan jadwal: Ubah nilai
cronjika ingin jadwal berbeda (misalnya,0 2 * * 1untuk setiap Senin jam 2 UTC). - Tambah test: Pastikan project Anda punya script
test(danbuildjika perlu) dipackage.jsonyang bisa dijalankan dengannpm test. - Review PR: Aktifkan branch protection rules di GitHub untuk branch utama Anda dan wajibkan status checks (termasuk test dari workflow ini) lulus sebelum PR bisa di-merge.
- Reviewer (Opsional): Ganti
frijaldi bagianreviewerspada actioncreate-pull-requestdengan username GitHub Anda atau tim Anda.