Belajar Node.js - CI/CD, Monitoring, dan Observability
Episode 22 of 23

Belajar Node.js - CI/CD, Monitoring, dan Observability

Episode terakhir ini mengunci siklus produksi: pipeline CI/CD dengan GitHub Actions, otomasi rilis dengan semantic-release, observability melalui log terstruktur, metrik, dan health check, serta merangkum materi untuk menyusun aplikasi Node.js yang siap produksi dan maintainable.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Setiap keterampilan yang sudah kalian pelajari — dari event loop di episode 1 sampai container di episode 21 — menemukan tujuan akhirnya di produksi. Dan produksi yang sehat bertumpu pada tiga hal: perubahan dikirim secara otomatis dan aman, aplikasi bisa diamati saat berjalan, dan kode tetap mudah dikelola seiring waktu.

Episode 22 menutup series ini dengan tiga lapis terakhir: CI/CD dengan GitHub Actions, observability lewat log, metrik, dan health check, serta rangkuman menyusun aplikasi siap produksi dan maintainable. Ini episode terakhir — kalian akan melihat seluruh seri menyatu.

CI/CD dengan GitHub Actions

Pipeline Build dan Test Otomatis

CI/CD mengotomatiskan alur dari push kode sampai deployment. Setiap perubahan di GitHub memicu workflow yang memasang dependensi, menjalankan test dari episode 18, dan membangun aplikasi:

.github/workflows/ci.yml
name: CI
on:
  push:
    branches: [main]
  pull_request:
 
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npm ci
      - run: npm test
      - run: npm run build

Workflow di atas menjalankan npm ci, npm test, dan npm run build untuk setiap push dan pull request. Jika test gagal, pipeline gagal dan perubahan tidak bisa di-deploy — inilah jaring pengaman yang membuat tim berani mengubah kode.

Rahasia di CI

Environment variable seperti JWT_SECRET dan DATABASE_URL disuntikkan ke workflow melalui secrets GitHub, bukan ditulis di file. npm test bisa memakai DATABASE_URL dari secrets saat menjalankan test integrasi, sementara NODE_ENV=test menandai mode pengujian.

Otomasi Rilis dengan Semantic-Release

Versi yang Mengikuti Commit

Semantic-release mengotomatiskan seluruh siklus rilis: menentukan versi baru, memperbarui changelog, membuat tag dan release, lalu memublikasikan paket. Versi ditentukan dari konvensi commit — feat: menaikkan minor, fix: menaikkan patch, dan breaking change menaikkan major:

Setup semantic-release
npm install --save-dev semantic-release
npx semantic-release

npx semantic-release menganalisis commit sejak rilis terakhir, menghitung versi berikutnya sesuai semver, dan menjalankan plugin untuk membuat release di GitHub. Karena konvensi commit sudah kalian pegang sejak awal series, otomasi ini bekerja tanpa campur tangan.

Rilis Prerilis untuk Staging

Tim modern memakai prerilis untuk cabang staging: versi seperti 1.2.3-rc.1 dirilis dari cabang staging, sedangkan main menghasilkan rilis stabil. Dengan cara ini, versi kandidat bisa diuji di staging sebelum dipromosikan ke produksi — seluruhnya otomatis dan terdokumentasi.

Observability: Logging, Metrik, dan Health Check

Log Terstruktur untuk Diagnosa

Observability menjawab "apa yang terjadi di aplikasi saya?". Log JSON dari episode 12 adalah fondasinya — dialirkan ke sistem seperti Loki atau OpenSearch, log bisa di-query berdasarkan field, bukan sekadar dibaca baris per baris.

Metrik dengan prom-client

Selain log, kumpulkan metrik — angka yang menampilkan kondisi aplikasi: jumlah request, latensi, penggunaan memori. prom-client mengekspos metrik dalam format Prometheus:

Install prom-client
npm install prom-client

npm install prom-client menambahkan library metrik. Gabungkan dengan collectDefaultMetrics untuk memantau event loop delay dan heap usage — dua indikator yang kita bahas di episode 19.

Health Check dan Graceful Shutdown

Endpoint /health memberi tahu orchestrator apakah aplikasi sehat dan siap menerima traffic. Saat dihentikan, aplikasi harus menutup koneksi secara elegan:

JSHealth check dan graceful shutdown
app.get("/health", (req, res) => {
  res.json({ status: "ok", uptime: process.uptime() });
});
 
const server = app.listen(3000);
 
process.on("SIGTERM", () => {
  console.log("Menerima SIGTERM, menutup server...");
  server.close(async () => {
    await pool.end();
    process.exit(0);
  });
});

app.get("/health", ...) melaporkan status kesehatan, dan handler SIGTERM menutup server lalu membersihkan koneksi database sebelum keluar. Docker mengirim SIGTERM saat container dihentikan (episode 21) — tanpa graceful shutdown, koneksi terputus paksa dan data bisa hilang.

Menyusun Aplikasi Siap Produksi dan Maintainable

Struktur Project yang Terorganisir

Aplikasi yang maintainable dimulai dari struktur folder yang jelas. Pisahkan tanggung jawab: src/routes untuk endpoint, src/services untuk logika bisnis, src/repositories untuk akses database, dan src/middleware untuk middleware bersama. Kontroler yang ramping, service yang bisa diuji, dan akses data yang terpusat adalah tanda kode yang akan disukai tim kalian satu tahun ke depan.

Kebiasaan yang Menjaga Kualitas

Maintainability bukan hasil satu keputusan besar, tapi kumpulan kebiasaan kecil:

  • Konvensi commit yang konsisten untuk riwayat yang bisa dibaca.
  • Test yang menyertai setiap fitur dan dijalankan di CI.
  • Dependensi yang di-update dan diaudit secara berkala.
  • Environment variable terdokumentasi di .env.example.
  • Dokumentasi minimal untuk endpoint dan keputusan arsitektur.

Seluruh seri ini dibangun untuk menumbuhkan kebiasaan itu. Aplikasi yang siap produksi bukan yang terlihat sempurna — melainkan yang bisa diubah dengan aman, diamati dengan jelas, dan dipelihara dalam jangka panjang.

Penutup

Inti yang harus dibawa pulang:

  • GitHub Actions menjalankan npm ci, npm test, dan build di setiap push.
  • Rahasia disuntikkan lewat secrets, tidak pernah di commit.
  • Semantic-release menentukan versi dari konvensi commit.
  • Log terstruktur, metrik, dan /health adalah tiga pilar observability.
  • Graceful shutdown menutup server dan database saat SIGTERM.
  • Struktur folder rapi dan kebiasaan berkualitas menjaga maintainability.

Series Belajar Node.js selesai! Dari pre-requisites di episode 0, arsitektur event-driven, modul, server HTTP, Express, autentikasi, database, testing, hingga produksi — kalian telah menempuh perjalanan dari nol sampai aplikasi yang siap di-deploy. Lanjutkan dengan membangun project nyata, kembangkan kebiasaan mengukur dan menguji, dan terus ikuti rilis Node.js terbaru. Fondasi yang kalian bangun sekarang akan menjadi batu loncatan untuk karier sebagai Cloud & Software Engineer. Selamat berkarya!