Automated Deployment
Mengotomasi deployment dari pipeline ke server: SSH, Compose, migrasi, health check, dan rollback yang terkontrol.
Deployment otomatis mengurangi kesalahan manual dan mempercepat rilis. Kuncinya adalah langkah yang idempotent, artefak yang jelas, dan rollback yang teruji.
Prinsip deployment otomatis
- Satu perintah atau pipeline untuk deploy.
- Artefak immutable (image/tag).
- Konfigurasi dipisahkan dari kode.
- Health check setelah deploy.
- Rollback tersedia.
- Semua langkah tercatat.
Pola deployment
| Pola | Cara | Cocok untuk |
|---|---|---|
| SSH + Compose | Pipeline SSH ke server lalu docker compose up -d | Server tunggal |
| Pull-based agent | Server menarik image/konfigurasi | Jaringan tertutup |
| Orchestrator | Kubernetes/Argo CD | Skala besar |
| Platform PaaS | Deploy via API | Tim kecil |
Contoh deploy via SSH
#!/usr/bin/env bash
set -euo pipefail
APP_DIR=/srv/app
IMAGE_TAG="${1:?IMAGE_TAG wajib}"
cd "$APP_DIR"
export IMAGE_TAG
docker compose pull
docker compose up -d --remove-orphans
for i in $(seq 1 30); do
if curl -fsS http://127.0.0.1:3000/health >/dev/null; then
echo "Health check OK"
exit 0
fi
sleep 2
done
echo "Health check gagal, rollback"
export IMAGE_TAG="${PREVIOUS_TAG:?}"
docker compose up -d
exit 1Simpan PREVIOUS_TAG sebelum deploy agar rollback otomatis mungkin.
Deploy dengan Docker Compose
services:
app:
image: ghcr.io/org/app:${IMAGE_TAG}
restart: unless-stopped
env_file: .env
ports:
- "127.0.0.1:3000:3000"
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3000/health"]
interval: 10s
timeout: 3s
retries: 5Pipeline hanya perlu mengubah IMAGE_TAG.
Migrasi database
Migrasi adalah bagian paling berisiko. Aturan aman:
- Backup sebelum migrasi.
- Migrasi backward compatible.
- Jalankan migrasi sebelum aplikasi baru aktif.
- Jangan hapus kolom langsung; lakukan bertahap.
- Uji migrasi di staging dengan data mirip produksi.
npm run migrateMigrasi yang tidak kompatibel menyebabkan downtime
Jika kode lama masih berjalan saat kolom dihapus, aplikasi bisa error. Gunakan pola expand-contract: tambah dulu, migrasikan data, baru hapus setelah semua instance baru.
Konfigurasi dan rahasia
- Simpan
.envdi server dengan permission600. - Gunakan secret CI untuk kredensial deploy.
- Jangan menaruh secret di image atau repository.
- Bedakan konfigurasi staging dan production.
Health check
| Jenis | Contoh |
|---|---|
| Liveness | Proses masih hidup |
| Readiness | Siap menerima trafik |
| Deep check | Database/cache terhubung |
Endpoint sederhana:
app.get('/health', (req, res) => {
res.status(200).json({ status: 'ok' });
});Rollback
export IMAGE_TAG=git-<sha-sebelumnya>
docker compose pull
docker compose up -d
curl -f http://127.0.0.1:3000/healthRollback database lebih rumit. Karena itu, migrasi harus kompatibel dan backup harus tersedia.
Notifikasi
Kirim hasil deploy ke Slack/Telegram:
curl -X POST "$WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d "{\"text\":\"Deploy $IMAGE_TAG selesai\"}"Sertakan status, versi, dan tautan pipeline.
Praktik: pipeline deploy minimal
- CI membangun dan push image bertag SHA.
- Pipeline memanggil skrip deploy di server.
- Skrip menyimpan tag aktif sebelumnya.
- Pull image baru dan jalankan Compose.
- Tunggu health check.
- Jika gagal, rollback ke tag sebelumnya.
- Kirim notifikasi dan catat log.
Ringkasan
- Deployment otomatis harus idempotent dan memakai artefak immutable.
- Health check menentukan berhasil/gagal.
- Migrasi database harus backward compatible.
- Rollback harus disiapkan sebelum dibutuhkan.
Selanjutnya
Pilih cara rilis di Deployment Strategy.