--- title: CI/CD Deployment description: "Otomatisasi build, tes, dan rilis. Mempercepat deploy, tapi migrasi database dan rollback harus direncanakan." canonical: https://penasihathosting.com/wikihosting/ci-cd-deployment type: wiki locale: id updated: 2026-10-29 author: Willya Randika --- # CI/CD Deployment ## Overview - **Summary:** Otomatisasi build, tes, dan rilis. Mempercepat deploy, tapi migrasi database dan rollback harus direncanakan. - **Author:** Willya Randika ([profile](/penulis/willya-randika)) ## Article CI/CD adalah praktik mengotomatiskan build, pengujian, dan rilis. Setiap perubahan di repository memicu pipeline: kode diperiksa, dependensi dipasang, tes dijalankan, artefak dibangun, lalu dikirim ke server. Tujuannya mengurangi langkah manual dan membuat rilis lebih konsisten. ## Tahapan pipeline Pipeline yang sehat dimulai dari checkout branch yang benar, install dependensi dari lockfile, lint dan test, lalu build artefak atau image Docker. Setelah itu deploy ke staging dan jalankan smoke test. Kalau lolos, promote ke produksi dengan persetujuan atau jadwal. Terakhir, health check dan rollback kalau gagal. Tes yang cepat lebih berguna daripada pipeline panjang yang jarang dijalankan. Mulai dari lint, unit test, dan build. Tambahkan staging dan rollback setelah alur dasar stabil. ## Contoh GitHub Actions ```yaml name: deploy on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm - run: npm ci - run: npm test -- --run - run: npm run build - name: Deploy env: SSH_KEY: ${{ secrets.SSH_KEY }} SSH_KNOWN_HOSTS: ${{ secrets.SSH_KNOWN_HOSTS }} run: | install -m 600 /dev/stdin ~/.ssh/id_ed25519 <<< "$SSH_KEY" printf '%s\n' "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts rsync -az --delete .next/ ${{ secrets.USER }}@${{ secrets.HOST }}:/var/www/app/.next-new/ ssh ${{ secrets.USER }}@${{ secrets.HOST }} 'cd /var/www/app && mv .next .next-old && mv .next-new .next && pm2 restart app' ``` Contoh ini sederhana. Produksi nyata sebaiknya memakai artefak yang tidak berubah, health check, dan rollback otomatis. Jangan menyimpan private key di repository. Gunakan secret manager. Simpan host key di secret `SSH_KNOWN_HOSTS` dan verifikasi fingerprint-nya. Jangan hanya menjalankan `ssh-keyscan` saat deploy karena itu mempercayai host key apa pun yang menjawab. ## Deploy atomik dan rollback Alih-alih menimpa folder aplikasi, deploy ke direktori baru lalu ganti symlink dengan `ln -sfn /var/www/releases/2026-10-30 /var/www/current`. Kalau health check gagal, kembalikan symlink ke rilis sebelumnya. Untuk Docker, jalankan image dengan tag versi dan simpan image lama sampai rilis baru stabil. Untuk database, siapkan migrasi yang kompatibel mundur dan backup sebelum perubahan besar. ## Rahasia dan akses Gunakan secret terenkripsi, bukan variabel yang tercetak di log. Batasi kunci SSH ke perintah dan host yang diperlukan. Gunakan user deploy khusus, bukan root. Pisahkan akses staging dan produksi, dan putar kredensial kalau log atau artefak bocor. ## Yang sering salah Deploy otomatis tanpa tes hanya menyebarkan bug lebih cepat. Migrasi database tanpa rencana rollback bisa tidak kompatibel dengan versi lama. Tidak ada health check membuat deploy dianggap sukses meskipun aplikasi error. Menyimpan `.env` di artefak juga menyebar rahasia ke banyak tempat. Uji dari staging karena lingkungan produksi berbeda. CI/CD berkaitan dengan [staging](/wikihosting/staging), [SSH](/wikihosting/ssh), [Docker](/wikihosting/docker), dan [Snapshot VPS](/wikihosting/vps-snapshot). ## FAQ Tidak. Proyek kecil juga mendapat manfaat dari tes otomatis dan deploy yang konsisten. Mulai dari pipeline sederhana, lalu tambahkan staging dan rollback. Aman kalau ada tes, health check, izin, dan rollback. Untuk perubahan berisiko, gunakan persetujuan manual atau jadwal deploy. Buat migrasi yang kompatibel mundur, backup sebelum eksekusi, uji di staging, dan siapkan rencana rollback. Jangan menjalankan migrasi destruktif bersamaan dengan deploy kode.