GitHub Actions untuk Deploy Otomatis: Panduan CI/CD Lengkap 2026

GitHub Actions untuk Deploy Otomatis: Hentikan Deploy Manual Selamanya
GitHub Actions untuk deploy otomatis adalah salah satu perubahan terbesar yang bisa Anda lakukan dalam alur kerja pengembangan website. Bayangkan: Anda selesai menulis kode, push ke GitHub, lalu dalam hitungan menit website Anda sudah terupdate secara otomatis di server - tanpa perlu buka FileZilla, tanpa perlu SSH manual, tanpa risiko lupa menjalankan perintah migrasi database.
Inilah yang dimaksud dengan CI/CD (Continuous Integration / Continuous Deployment) menggunakan GitHub Actions. Bagi developer Indonesia yang bekerja sendiri maupun dalam tim kecil, GitHub Actions memberikan kemampuan otomasi level enterprise - sepenuhnya gratis untuk repositori publik, dan gratis 2.000 menit per bulan untuk repositori privat.
Artikel ini akan membawa Anda dari nol hingga memiliki pipeline deploy otomatis yang berjalan sungguhan. Anda akan melihat contoh nyata untuk deploy ke shared hosting (via SSH/rsync), deploy aplikasi Laravel, dan deploy website Next.js ke VPS.
Apa Itu GitHub Actions?
GitHub Actions adalah platform otomasi bawaan GitHub yang memungkinkan Anda menjalankan serangkaian perintah secara otomatis sebagai respons terhadap event tertentu di repositori - misalnya setiap kali ada push ke branch main, atau setiap kali ada pull request yang dibuat.

Konsep Dasar GitHub Actions
- Workflow: File YAML di folder
.github/workflows/yang mendefinisikan seluruh alur otomasi - Event (Trigger): Kejadian yang memicu workflow berjalan, misalnya
push,pull_request, atau jadwal cron - Job: Sekumpulan steps yang berjalan di satu runner (mesin virtual)
- Step: Satu perintah atau action individual di dalam sebuah job
- Runner: Mesin virtual yang menjalankan job - GitHub menyediakan runner Ubuntu, Windows, dan macOS gratis
- Secrets: Variabel terenkripsi untuk menyimpan kredensial sensitif (password, SSH key, API token) - tidak pernah terekspos di log
Mengapa Menggunakan GitHub Actions untuk Deploy?
- Gratis dan sudah terintegrasi langsung di GitHub tanpa instalasi server CI terpisah
- Ratusan action siap pakai di GitHub Marketplace (SSH deploy, Docker, Slack notifikasi, dll)
- Workflow sebagai kode - disimpan di repositori, bisa di-review, di-version, dan diduplikasi
- Mengeliminasi human error akibat lupa langkah deploy manual
- Memungkinkan deploy dari mana saja - cukup push kode dari laptop atau ponsel
Persiapan Sebelum Membuat Workflow GitHub Actions
Sebelum menulis file YAML pertama, pastikan prasyarat berikut sudah terpenuhi:
1. Repositori GitHub Sudah Ada
Kode proyek Anda harus sudah berada di repositori GitHub. Jika belum, buat repositori baru di github.com dan push kode lokal Anda ke sana.
2. Server Mendukung SSH Access
Untuk deploy ke hosting atau VPS, server harus bisa diakses via SSH. Hampir semua VPS dan banyak shared hosting modern (termasuk paket-paket di HostingEkspres) sudah mendukung SSH access.
3. Buat SSH Key Pair untuk GitHub Actions
Jangan gunakan SSH key personal Anda. Buat key pair khusus untuk GitHub Actions:
# Di terminal lokal, buat SSH key pair baru
ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_actions_deploy
# Ini akan membuat dua file:
# ~/.ssh/github_actions_deploy ← Private key (untuk GitHub Secrets)
# ~/.ssh/github_actions_deploy.pub ← Public key (untuk server)
4. Daftarkan Public Key ke Server
# Salin isi public key ke server
# Cara 1: Gunakan ssh-copy-id
ssh-copy-id -i ~/.ssh/github_actions_deploy.pub username@server-ip
# Cara 2: Manual - tambahkan ke ~/.ssh/authorized_keys di server
cat ~/.ssh/github_actions_deploy.pub
# Salin outputnya, lalu di server:
# echo "PASTE_PUBLIC_KEY_HERE" >> ~/.ssh/authorized_keys
5. Tambahkan Secrets ke Repositori GitHub
Di GitHub, masuk ke repositori Anda → Settings → Secrets and variables → Actions → New repository secret. Tambahkan secret-secret berikut:
- SSH_PRIVATE_KEY: Isi seluruh konten file private key (
~/.ssh/github_actions_deploy), termasuk baris-----BEGIN...dan-----END... - SERVER_HOST: Alamat IP atau hostname server Anda
- SERVER_USER: Username SSH di server (misal:
ubuntu,deploy, atau username cPanel) - SERVER_PATH: Path folder di server tempat website berada (misal:
/home/username/public_html)
***. Secrets juga tidak diteruskan ke workflow dari fork repositori.
Membuat Workflow GitHub Actions Pertama Anda
Buat folder .github/workflows/ di root repositori, lalu buat file deploy.yml di dalamnya.
Contoh 1: Deploy Website Statis/PHP ke Shared Hosting via rsync
# .github/workflows/deploy.yml
name: Deploy ke Hosting
on:
push:
branches:
- main # Workflow berjalan hanya saat push ke branch main
jobs:
deploy:
name: Deploy via SSH
runs-on: ubuntu-latest # Gunakan runner Ubuntu gratis dari GitHub
steps:
# Step 1: Checkout kode dari repositori
- name: Checkout kode
uses: actions/checkout@v4
# Step 2: Setup SSH key dari secrets
- name: Setup SSH Key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
# Step 3: Upload file ke server menggunakan rsync via SSH
- name: Deploy via rsync
run: |
rsync -avz --delete -e "ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no" ./ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ secrets.SERVER_PATH }}/ --exclude='.git' --exclude='.github' --exclude='node_modules' --exclude='.env'
# Step 4: Notifikasi selesai
- name: Deploy selesai
run: echo "Deploy berhasil ke ${{ secrets.SERVER_HOST }} pada $(date)"
Contoh 2: Deploy Aplikasi Laravel ke VPS
Laravel membutuhkan langkah-langkah tambahan setelah file di-upload: install/update dependencies Composer, jalankan migrasi, dan bersihkan cache.
# .github/workflows/deploy-laravel.yml
name: Deploy Laravel ke Produksi
on:
push:
branches: [main]
jobs:
test:
name: Jalankan Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: mbstring, pdo, pdo_mysql
- name: Install dependencies
run: composer install --prefer-dist --no-progress
- name: Copy .env untuk testing
run: cp .env.example .env && php artisan key:generate
- name: Jalankan PHPUnit tests
run: php artisan test
deploy:
name: Deploy ke Server
runs-on: ubuntu-latest
needs: test # Hanya deploy jika semua tests lulus!
steps:
- uses: actions/checkout@v4
- name: Deploy via SSH Action
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd ${{ secrets.SERVER_PATH }}
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan queue:restart
echo "Deploy Laravel selesai: $(date)"
Contoh 3: Build dan Deploy Next.js ke VPS
# .github/workflows/deploy-nextjs.yml
name: Build dan Deploy Next.js
on:
push:
branches: [main]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build Next.js
run: npm run build
env:
NEXT_PUBLIC_API_URL: ${{ secrets.NEXT_PUBLIC_API_URL }}
- name: Setup SSH Key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
- name: Upload build ke server
run: |
rsync -avz --delete -e "ssh -i ~/.ssh/deploy_key" .next/ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ secrets.SERVER_PATH }}/.next/
rsync -avz -e "ssh -i ~/.ssh/deploy_key" package.json package-lock.json ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ secrets.SERVER_PATH }}/
- name: Restart aplikasi di server
run: |
ssh -i ~/.ssh/deploy_key ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "cd ${{ secrets.SERVER_PATH }} && npm ci --production && pm2 restart nextjs-app"

Struktur Workflow yang Lebih Canggih
Deploy ke Staging dan Production Secara Terpisah
Best practice CI/CD adalah deploy ke environment staging terlebih dahulu sebelum production. Ini memungkinkan pengujian akhir sebelum kode sampai ke pengguna nyata:
on:
push:
branches:
- develop # Deploy ke staging
- main # Deploy ke production
jobs:
deploy-staging:
if: github.ref == 'refs/heads/develop'
runs-on: ubuntu-latest
environment: staging
steps:
- uses: actions/checkout@v4
- name: Deploy ke Staging
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.STAGING_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: cd ~/staging && git pull origin develop
deploy-production:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: production # Bisa dikonfigurasi butuh approval manual
steps:
- uses: actions/checkout@v4
- name: Deploy ke Production
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.PROD_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: cd ~/public_html && git pull origin main
Menambahkan Notifikasi ke Slack atau Email
Agar tim mendapat notifikasi setiap deploy berhasil atau gagal, tambahkan step notifikasi di akhir workflow:
# Tambahkan di akhir job deploy
- name: Notifikasi Slack jika Berhasil
if: success()
uses: rtCamp/action-slack-notify@v2
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_MESSAGE: "Deploy ke production berhasil oleh ${{ github.actor }}"
SLACK_COLOR: good
- name: Notifikasi Slack jika Gagal
if: failure()
uses: rtCamp/action-slack-notify@v2
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_MESSAGE: "Deploy GAGAL! Cek log di ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
SLACK_COLOR: danger
Troubleshooting GitHub Actions yang Sering Terjadi
Error: Permission denied (publickey)
Ini adalah error SSH paling umum. Penyebab dan solusinya:
- Pastikan public key sudah ditambahkan ke
~/.ssh/authorized_keysdi server - Cek permission file:
chmod 700 ~/.sshdanchmod 600 ~/.ssh/authorized_keys - Pastikan isi secrets SSH_PRIVATE_KEY sudah benar, termasuk newline di akhir
- Coba test koneksi SSH manual dari komputer lokal menggunakan key yang sama
Error: Host key verification failed
# Solusi: Tambahkan ssh-keyscan di step sebelum deploy
- name: Tambahkan host ke known_hosts
run: ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts
Workflow Tidak Terpicu Setelah Push
- Pastikan branch name di
on.push.branchessesuai dengan branch yang Anda push (perhatikanmainvsmaster) - Cek tab Actions di repositori GitHub - mungkin workflow sedang antri atau ada error sintaks YAML
- Validasi sintaks YAML file workflow menggunakan actionlint atau editor dengan ekstensi YAML
Deploy Sukses tapi Website Tidak Berubah
- Pastikan path di
SERVER_PATHsudah benar dan sesuai dengan folder yang diakses web server - Cek apakah ada masalah cache di browser (tekan Ctrl+Shift+R untuk hard refresh)
- Untuk Laravel: jalankan
php artisan config:cachedanphp artisan view:clearsetelah deploy
Best Practices GitHub Actions untuk Deploy
- Jalankan tests sebelum deploy: Selalu tambahkan job testing dengan
needs: testdi job deploy - cegah kode rusak masuk production - Gunakan versi action yang spesifik: Gunakan tag versi (
actions/checkout@v4) bukan@mainatau@latestuntuk menghindari breaking changes - Simpan semua kredensial di Secrets: Tidak ada password, token, atau SSH key yang boleh ditulis langsung di file YAML
- Buat deploy user khusus di server: Jangan gunakan user root. Buat user
deploydengan permission terbatas hanya ke folder website - Tambahkan timeout: Gunakan
timeout-minutes: 10di level job untuk mencegah workflow berjalan selamanya - Cache dependencies: Gunakan
actions/cacheatau opsi cache bawaan (cache: 'npm') untuk mempercepat workflow
FAQ: GitHub Actions untuk Deploy Otomatis
Kesimpulan: Otomasi Deploy Dimulai dari Satu File YAML
GitHub Actions untuk deploy otomatis bukan teknologi yang eksklusif untuk perusahaan besar. Dengan satu file YAML di folder .github/workflows/, Anda sudah bisa mengotomasi seluruh proses deploy - dari push kode hingga website terupdate di server - dalam hitungan menit.
Mulailah dengan workflow sederhana seperti contoh pertama di artikel ini, lalu tambahkan kompleksitas seiring kebutuhan: testing otomatis, notifikasi, multi-environment, dan approval manual untuk production. Setiap langkah kecil dalam otomasi ini menghemat waktu Anda dan mengurangi risiko kesalahan deploy yang bisa membuat website down.
Untuk memaksimalkan GitHub Actions, Anda membutuhkan server yang mendukung SSH access dengan koneksi yang andal. HostingEkspres menyediakan hosting dengan SSH access, Git ready, dan uptime 99.9% - fondasi ideal untuk pipeline CI/CD yang Anda bangun.
Hosting dengan SSH & Git - Siap untuk CI/CD!
SSH Access, Git deploy, SSL Gratis, cPanel. Support penuh untuk GitHub Actions workflow - mulai Rp 15.000/bulan.
Lihat Paket HostingArtikel Terkait
Cara Setup CI/CD Pipeline: Panduan Otomasi Deployment Website 2026
Panduan lengkap cara setup CI/CD pipeline untuk otomasi deployment website. Dari konsep dasar Continuous Integration dan Continuous Deployment, hingga implementasi nyata dengan GitHub Actions, GitLab CI, dan berbagai stack populer di Indonesia.
Baca Selengkapnya →Git untuk Pemula: Panduan Lengkap Version Control 2026
Panduan lengkap Git untuk pemula dalam Bahasa Indonesia. Pelajari apa itu Git, cara install, perintah dasar, branching, merge, dan cara menggunakan GitHub - semua yang dibutuhkan developer Indonesia untuk mulai menguasai version control.
Baca Selengkapnya →Cara Deploy Website ke Server: Panduan Lengkap 3 Metode 2026
Panduan lengkap cara deploy website ke server dengan 3 metode: FTP, Git, dan cPanel File Manager. Cocok untuk website statis, PHP, WordPress, hingga aplikasi Node.js dan Laravel di hosting maupun VPS.
Baca Selengkapnya →Butuh Hosting untuk Website Anda?
Dapatkan hosting cepat, aman, dan terpercaya dengan harga terjangkau. Gratis domain, SSL, dan support 24/7.
Jangan Ketinggalan Promo!
Subscribe newsletter kami dan dapatkan diskon hingga 50% untuk pembelian pertama kamu.
Gratis, tanpa spam. Bisa unsubscribe kapan saja.