Rilis ke production adalah momen ketika kesalahan kecil berubah menjadi insiden nyata: konfigurasi dev terbawa, timeout tak terpasang, atau shutdown yang memutus koneksi pengguna di tengah transaksi. Daftar periksa berikut menghimpun empat puluh butir kesiapan dalam sepuluh kategori, masing-masing dengan rujukan chapter yang membahasnya tuntas. Gunakan daftar ini sebagai gerbang akhir sebelum tag rilis dibuat, bukan sebagai pengganti review dan test yang seharusnya sudah berjalan sejak awal.

Build dan Rilis #

Binary yang dihasilkan CI harus bersih dari jejak mesin pembangun dan terverifikasi ulang. Setiap butir di tabel ini berdampak pada reproduktibilitas saat insiden — tim harus yakin binary yang dianalisis identik dengan yang dirilis:

Butir pemeriksaanRujukan
Binary dibangun dengan -trimpath agar path mesin CI tidak terbocorkanBuild Flags
Versi aplikasi di-inject lewat -ldflags "-X main.version=..."Release Versioning
CGO_ENABLED=0 untuk binary statis bila tidak membutuhkan cgoBuild Binary
Target GOOS/GOARCH eksplisit di pipeline untuk tiap platform rilisCross Compilation
Binary bisa dibangun ulang dari commit tag yang samaRelease Versioning

Test #

Gerbang kualitas otomatis menjadi bukti bahwa perilaku aplikasi masih sesuai. Test suite yang hanya lulus di laptop penulis bukan bukti:

Butir pemeriksaanRujukan
Seluruh unit test lulus di lingkungan CI yang bersihUnit Test
go test -race lulus tanpa laporan data raceRace Detector
Integration test berjalan melawan dependency nyata atau kontainer ujiTesting Database
Coverage bertambah atau stabil — angka wajar tanpa memaksa 100%Coverage
Benchmark jalur kritis dibandingkan bila ada perubahan performaBenchmark

Konfigurasi #

Konfigurasi produksi harus aman sejak nilai default. Kesalahan paling umum: default yang enak untuk development jalan tanpa sengaja di production:

Butir pemeriksaanRujukan
Semua konfigurasi dibaca dari environment variable, bukan hardcodeEnvironment Production
Nilai default aman untuk production, bukan default mode developmentEnvironment Production
Secret berasal dari secret manager atau environment yang terlindungiSecure Configuration
Validasi konfigurasi berjalan saat startup dengan pesan galat yang jelasEnvironment Production
Konfigurasi dimuat sekali saat startup, bukan pada setiap requestEnvironment Production

Logging #

Log adalah mata tim saat insiden. Log terstruktur membuat pertanyaan “apa yang terjadi” bisa dijawab dengan query, bukan membaca ribuan baris:

Butir pemeriksaanRujukan
Log terstruktur key-value memakai log/sloglog/slog
Level log dapat diubah tanpa restart saat dibutuhkanLog Level
Setiap baris log request membawa request IDRequest ID
Tidak ada data sensitif (password, token) yang masuk logSecure Logging

Observability #

Kesehatan layanan harus terlihat dari luar tanpa masuk ke mesin. Empat pilar — health, metrik, tracing, dan diagnostik — menutup kebutuhan itu:

Butir pemeriksaanRujukan
Endpoint /healthz (liveness) dan /readyz (readiness) tersediaHealth, Readiness, Liveness
healthz tetap ringan — tidak memeriksa dependency beratHealth, Readiness, Liveness
Metrik inti terekspos: latensi, tingkat error, throughputMetrics
Format eksposur metrik mengikuti standar PrometheusPrometheus
Distributed tracing aktif untuk lintas layananDistributed Tracing

Graceful Shutdown #

Proses yang dimatikan harus pergi dengan sopan: menyelesaikan request berjalan, menutup koneksi, dan menghentikan worker secara bersih:

Butir pemeriksaanRujukan
Sinyal SIGTERM ditangani dan server berhenti menerima koneksi baruGraceful Shutdown
Pemanggilan server.Shutdown dibungkus context ber-timeoutGraceful Shutdown
Worker latar menyelesaikan tugas berjalan sebelum proses keluarGraceful Shutdown Production

Timeout #

Operasi tanpa batas waktu adalah insiden yang menunggu jadwal. Setiap panggilan lintas proses — jaringan, database, layanan lain — harus punya deadline:

Butir pemeriksaanRujukan
HTTP client mengatur timeout, bukan memakai default tanpa batasnet/http Client
HTTP server mengatur ReadTimeout dan WriteTimeoutnet/http Server
Query database dibungkus context dengan timeoutContext dan Query Timeout
Deadline context diteruskan ke panggilan layanan lainContext pada HTTP

Koneksi #

Koneksi adalah sumber daya terbatas yang diam-diam habis. Pool yang tak dibatasi membuat gangguan satu dependency menjalar ke seluruh aplikasi:

Butir pemeriksaanRujukan
Connection pool database dibatasi (MaxOpenConns, MaxIdleConns)Connection Pool
Umur koneksi dibersihkan (ConnMaxLifetime, ConnMaxIdleTime)Database Connection Management
Koneksi HTTP client di-reuse dengan batas per hostTimeout dan Connection

Deployment #

Artefak rilis harus kecil, minim permukaan serangan, dan berjalan dengan hak paling rendah. Prinsipnya: image berisi aplikasi, bukan lingkungan pengembangan:

Butir pemeriksaanRujukan
Image dibangun multi-stage sehingga layer akhir kecil tanpa toolchainDocker Multi-Stage Build
Proses berjalan sebagai user non-rootContainerization
Image dasar minimal (distroless atau alpine) dengan binary statisContainerization
Resource limit CPU dan memori diatur di orchestratorContainerization

Rollback dan Dokumentasi #

Rencana rilis yang matang selalu punya pintu keluar. Kemampuan kembali cepat ke versi sehat sering lebih berharga daripada kecepatan rilis itu sendiri:

Butir pemeriksaanRujukan
Strategi rollback teruji: versi sebelumnya dapat ditarik dalam hitungan menitRollback dan Recovery
Runbook insiden dan README operasional tersedia serta mutakhirRollback dan Recovery

Daftar ini paling berguna saat dicetak sebagai bagian checklist rilis internal tim — centang per kategori, catat pengecualian beserta alasannya, dan simpan bersama tag rilis sebagai catatan keputusan. Kapan pun kita butuh memperdalam satu butir, empat puluh tautan di atas mengarah ke chapter yang membahasnya lengkap. Setelah aplikasi berjalan stabil, sumber belajar berikutnya adalah dokumentasi dan komunitas resmi — dirangkum di chapter Sumber Belajar Resmi .

Referensi #