Build sekali, promosikan dengan digest: pipeline delivery yang bisa di-rollback
Jalur delivery acuan di mana artefak yang diuji di staging persis sama dengan yang ada di produksi, dan rollback adalah deploy ulang digest sebelumnya.
Contoh-contohnya bersifat umum dan ilustratif. Tidak diambil dari lingkungan klien mana pun: sesuaikan ambang batas dan pengaturan dengan sistem Anda sendiri.
Masalah build ulang per lingkungan
Pipeline yang membangun ulang aplikasi untuk setiap lingkungan menguji satu artefak dan merilis artefak lain. Dependensi ter-resolve berbeda, base image berubah, flag build berbeda — dan versi di produksi tidak pernah diuji di mana pun. Build sekali, beri artefak identitas yang tidak bisa diubah, lalu promosikan identitas itu.
Jalur acuan
Jalur umum dari commit ke produksi. Setiap tahap meneruskan artefak yang sama atau menghentikannya.
- 01CommitPull request dengan review dan pemeriksaan wajib.
- 02BuildSatu build per commit; image di-push dan digest-nya dicatat.
- 03VerifikasiPengujian, pemindaian dependensi dan image, tanda tangan.
- 04StagingDigest di-deploy; uji smoke dan integrasi dijalankan.
- 05ProduksiDigest yang sama, di-rollout bertahap.
- 06ObservasiError budget dan alert yang memutuskan: lanjut atau rollback.
Digest, bukan tag
Tag seperti latest atau v2 adalah label yang bisa berubah; digest (sha256:…) adalah hash dari isi image. Manifes deployment sebaiknya merujuk digest, dan pipeline mempromosikan suatu lingkungan dengan mengubah satu nilai itu saja — idealnya sebagai commit ke repositori deployment, agar setiap rilis adalah perubahan yang direview dan bisa dibatalkan.
# build once and record the digest
docker buildx build --push --metadata-file meta.json \
-t registry.example.com/api:"$GIT_SHA" .
DIGEST=$(jq -r '."containerimage.digest"' meta.json)
# promote: every environment receives the same digest
kustomize edit set image api=registry.example.com/api@"$DIGEST"
Perubahan basis data: perluas, lalu ciutkan
Rollback kode hanya mudah jika skema masih cocok dengan versi sebelumnya. Pecah migrasi yang tidak kompatibel menjadi langkah-langkah yang masing-masing kompatibel dengan kode yang sedang berjalan: tambahkan kolom atau tabel baru, deploy kode yang menulis ke keduanya, isi ulang data lama, alihkan pembacaan, dan baru di rilis berikutnya hapus struktur lama.
Delivery progresif dan rollback
- Rollout dulu ke sebagian lalu lintas atau replika, lalu bandingkan tingkat error dan latensi dengan versi saat ini.
- Kaitkan keputusan dengan SLO: burn rate yang tinggi selama rollout menghentikan promosi secara otomatis.
- Rollback adalah deploy ulang digest sebelumnya — jalur yang sama dan sudah teruji — bukan hotfix yang ditulis di bawah tekanan.
- Simpan konfigurasi dan secret di luar image, agar artefak yang sama berjalan di setiap lingkungan.