CI/CD membantu proses deploy jadi konsisten karena update server bisa dijalankan otomatis dari workflow. Di artikel ini kita pakai metode SSH deploy: GitHub Actions login ke server Ubuntu, lalu menjalankan deploy script di folder aplikasi.
Target hasil: setiap ada push ke branch main, workflow akan test koneksi SSH, masuk ke server, pull kode terbaru, lalu menjalankan command deploy. Tidak perlu deploy manual dari laptop.
Alur yang Akan Dibuat
- Developer push kode ke branch
main. - GitHub Actions menjalankan workflow.
- Workflow login ke server Ubuntu menggunakan SSH key.
- Server menjalankan update repo dan command deploy.
- Aplikasi diperbarui tanpa deploy manual.
Persiapan
| Kebutuhan | Keterangan |
|---|---|
| Server | Ubuntu 22.04/24.04 atau Debian-based server |
| Akses | User sudo/root untuk setup awal |
| Repository | Project sudah tersedia di GitHub |
| Git | Server bisa pull repository dari GitHub |
| SSH | Port SSH terbuka dari GitHub Actions runner ke server |
| Folder aplikasi | Contoh: /var/www/myapp |
1. Setup User Deploy di Server Ubuntu
Gunakan user khusus untuk deploy. Hindari deploy harian memakai root.
sudo adduser deploy
sudo usermod -aG www-data deploy
sudo mkdir -p /var/www/myapp
sudo chown -R deploy:www-data /var/www/myapp
sudo chmod -R 775 /var/www/myapp
Ganti /var/www/myapp sesuai lokasi aplikasi kamu.
2. Install Git di Server
sudo apt update
sudo apt install git -y
3. Clone Repository ke Server
Login sebagai user deploy, lalu clone repository ke folder aplikasi:
sudo su - deploy
cd /var/www/myapp
git clone https://github.com/USERNAME/NAMA-REPO.git .
Catatan: untuk private repository, gunakan deploy key atau token sesuai kebijakan repository. Untuk public repository, HTTPS biasa cukup.
4. Buat SSH Key untuk GitHub Actions
Buat SSH key dari komputer lokal. Key ini dipakai GitHub Actions untuk login ke server.
ssh-keygen -t ed25519 -C "github-actions-deploy" -f github-actions-deploy -N ""
File yang terbentuk:
github-actions-deploy= private key (simpan di GitHub Secrets)github-actions-deploy.pub= public key (pasang di server)
Pasang public key ke server:
ssh-copy-id -i github-actions-deploy.pub deploy@IP_SERVER
Jika ssh-copy-id tidak tersedia, pasang manual:
cat github-actions-deploy.pub
# Di server:
sudo su - deploy
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
5. Test SSH dari Lokal
ssh -i github-actions-deploy deploy@IP_SERVER
Jika berhasil login tanpa password, SSH key sudah benar.
6. Tambahkan GitHub Secrets
Masuk ke repository GitHub, lalu buka:
Settings > Secrets and variables > Actions > New repository secret
| Secret Name | Isi |
|---|---|
SSH_HOST |
IP atau domain server |
SSH_PORT |
Port SSH, biasanya 22 |
SSH_USER |
deploy |
SSH_PRIVATE_KEY |
Isi file private key github-actions-deploy |
APP_DIR |
/var/www/myapp |
Penting: jangan commit private key ke repository. Simpan private key hanya di GitHub Secrets.
7. Buat Script Deploy di Repository
Buat file deploy.sh di root repository agar command deploy mudah dibaca dan diubah.
#!/bin/bash
set -e
echo "Masuk ke folder aplikasi..."
cd "$APP_DIR"
echo "Ambil kode terbaru..."
git fetch origin main
git reset --hard origin/main
echo "Install dependency jika dibutuhkan..."
# Untuk Node.js:
# npm ci
# npm run build
# Untuk Laravel/PHP:
# composer install --no-dev --optimize-autoloader
# php artisan migrate --force
# php artisan config:cache
# php artisan route:cache
# php artisan view:cache
echo "Reload service jika diperlukan..."
# sudo systemctl reload nginx
# sudo systemctl reload php8.3-fpm
echo "Deploy selesai."
Beri permission execute, lalu push ke GitHub:
chmod +x deploy.sh
git add deploy.sh
git commit -m "Add deploy script"
git push origin main
8. Buat Workflow GitHub Actions
Buat file berikut di repository:
.github/workflows/deploy.yml
Isi workflow:
name: Deploy to Ubuntu Server
on:
push:
branches:
- main
workflow_dispatch:
concurrency:
group: production-deploy
cancel-in-progress: true
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -p "${{ secrets.SSH_PORT }}" "${{ secrets.SSH_HOST }}" >> ~/.ssh/known_hosts
- name: Test SSH connection
run: |
ssh -i ~/.ssh/deploy_key -p "${{ secrets.SSH_PORT }}" \
"${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" \
"echo 'SSH connection OK'"
- name: Deploy application
run: |
ssh -i ~/.ssh/deploy_key -p "${{ secrets.SSH_PORT }}" \
"${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}" \
"APP_DIR='${{ secrets.APP_DIR }}' bash -s" < deploy.sh
Kenapa ada workflow_dispatch?
- Agar deploy bisa dites manual dari tab Actions tanpa membuat commit baru.
9. Cara Test CI/CD
- Push perubahan kecil ke branch
main(misal updateREADME.md). - Buka tab Actions di repository GitHub.
- Klik workflow Deploy to Ubuntu Server.
- Pastikan step Test SSH connection berhasil.
- Pastikan step Deploy application selesai tanpa error.
- Cek folder aplikasi di server dan pastikan kode sudah berubah:
# Cek di server
cd /var/www/myapp
git log --oneline -1
Troubleshooting Cepat
| Masalah | Penyebab Umum | Solusi Cepat |
|---|---|---|
Permission denied (publickey) |
Public key belum terpasang atau private key salah | Cek authorized_keys dan isi SSH_PRIVATE_KEY |
Host key verification failed |
known_hosts belum berisi host server |
Pastikan ssh-keyscan berjalan di workflow |
Could not resolve hostname |
SSH_HOST salah atau DNS gagal |
Gunakan IP server untuk testing |
| Port 22 timeout | Firewall/security group memblokir SSH | Buka port SSH atau gunakan self-hosted runner |
git pull gagal |
Folder bukan repo atau permission salah | Cek APP_DIR dan ownership folder |
npm/composer not found |
Dependency belum terinstall di server | Install Node.js/Composer sesuai stack aplikasi |
| Deploy sukses tapi web tidak berubah | Build/cache/service belum direload | Tambahkan build, cache clear, atau reload service |
Rekomendasi Security
- Gunakan user deploy, jangan root.
- Batasi permission folder aplikasi.
- Simpan SSH private key hanya di GitHub Secrets.
- Gunakan environment production jika butuh approval sebelum deploy.
- Gunakan branch
mainatau release branch khusus untuk production. - Aktifkan firewall dan hanya buka port yang dibutuhkan.
- Untuk server private/internal, pertimbangkan self-hosted runner.
FAQ
Apakah server harus membuka SSH ke publik?
GitHub-hosted runner akan datang dari internet. Kalau server kamu private/internal, pertimbangkan self-hosted runner di jaringan yang sama dengan server, atau batasi akses SSH memakai firewall/allowlist sesuai kebutuhan.
Kenapa workflow perlu ssh-keyscan?
Ini untuk mengisi known_hosts agar koneksi SSH tidak gagal karena verifikasi host key. Jika host key berubah (misal reinstall server), kamu perlu update lagi.
Bolehkah pakai git pull вместо git reset --hard?
Bisa, tapi untuk deployment biasanya lebih aman pakai state yang persis sama dengan branch production (misal origin/main) agar tidak ada perubahan lokal yang mengganggu. Kalau kamu punya file runtime di server, pastikan tidak tersimpan di repo (gunakan .env, storage terpisah, dan permission yang benar).
Kesimpulan
Dengan GitHub Actions dan SSH, proses deploy ke server Ubuntu bisa dibuat lebih konsisten. Setiap push ke branch main dapat menjalankan workflow untuk login ke server, mengambil kode terbaru, menjalankan build/dependency install, lalu reload service jika diperlukan.
Untuk tahap awal, gunakan workflow ini sebagai versi sederhana yang mudah dites. Setelah stabil, kamu bisa menambahkan test otomatis, approval production, rollback, dan notifikasi deploy.