HOSTING CEPATDOMAIN MURAHSSL GRATISSUPPORT 24/7UPTIME 99.9%SERVER INDONESIAHOSTING CEPATDOMAIN MURAHSSL GRATISSUPPORT 24/7UPTIME 99.9%SERVER INDONESIA
Tutorial

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

Tim HostingEkspres|7 Juni 2026|15 menit baca
github actions untuk deploygithub actions ci cddeploy otomatis githubgithub actions workflowcicd pipeline githubauto deploy github actionsgithub actions tutorial indonesia
GitHub Actions untuk Deploy Otomatis: Panduan CI/CD Lengkap 2026
📚 Baca juga: Git untuk Pemula | Cara Deploy Website ke Server | Cara Membuat Website

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.

github actions untuk deploy
Ilustrasi github actions untuk deploy

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 → SettingsSecrets and variablesActionsNew 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)
Penting - Keamanan Secrets: Nilai secrets tidak akan pernah muncul di log GitHub Actions. Jika ada step yang mencoba print secrets, GitHub akan otomatis sensor nilainya dengan ***. 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)"
Apa itu rsync? rsync adalah tool sinkronisasi file yang sangat efisien - hanya mentransfer file yang berubah, bukan semua file. Cocok untuk update website yang sering dilakukan karena jauh lebih cepat dari FTP upload biasa.

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"
github actions untuk deploy
Ilustrasi github actions untuk deploy

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_keys di server
  • Cek permission file: chmod 700 ~/.ssh dan chmod 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.branches sesuai dengan branch yang Anda push (perhatikan main vs master)
  • 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_PATH sudah 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:cache dan php artisan view:clear setelah deploy
Baca Juga: Cara Setup CI/CD Pipeline: Panduan Lengkap Otomasi Deployment Website

Best Practices GitHub Actions untuk Deploy

  • Jalankan tests sebelum deploy: Selalu tambahkan job testing dengan needs: test di job deploy - cegah kode rusak masuk production
  • Gunakan versi action yang spesifik: Gunakan tag versi (actions/checkout@v4) bukan @main atau @latest untuk 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 deploy dengan permission terbatas hanya ke folder website
  • Tambahkan timeout: Gunakan timeout-minutes: 10 di level job untuk mencegah workflow berjalan selamanya
  • Cache dependencies: Gunakan actions/cache atau opsi cache bawaan (cache: 'npm') untuk mempercepat workflow
Jangan Lakukan Ini: Jangan pernah membuat file YAML yang berisi password, API key, atau private key secara langsung - meskipun repositori privat. Selalu gunakan GitHub Secrets. Repositori privat bisa saja menjadi publik secara tidak sengaja, dan riwayat Git menyimpan semua perubahan.

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 Hosting

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.