Monday

18-08-2025 Vol 19

How to Set Up Auto Deployments After Every Git Push (No Jenkins)

Cara Mengatur Deploy Otomatis Setelah Setiap Git Push (Tanpa Jenkins)

Deploy otomatis adalah mimpi setiap pengembang. Bayangkan, setiap kali Anda melakukan push ke repositori Git Anda, perubahan Anda secara otomatis di-deploy ke server produksi atau staging Anda. Tidak perlu lagi deploy manual yang membosankan dan rawan kesalahan. Dan yang terbaik? Anda tidak memerlukan alat yang berat seperti Jenkins untuk melakukannya. Dalam posting blog ini, kita akan menjelajahi cara mengatur deploy otomatis setelah setiap Git push tanpa Jenkins.

Mengapa Deploy Otomatis Penting?

Sebelum kita masuk ke detail teknis, mari kita bahas mengapa deploy otomatis sangat penting:

  1. Efisiensi Waktu: Otomatisasi menghilangkan langkah-langkah manual, menghemat waktu berharga yang dapat Anda gunakan untuk tugas-tugas yang lebih penting.
  2. Mengurangi Kesalahan: Deploy manual rentan terhadap kesalahan manusia. Otomatisasi meminimalkan risiko kesalahan dan memastikan konsistensi.
  3. Deployment Lebih Cepat: Perubahan kode Anda di-deploy lebih cepat, memungkinkan Anda untuk memberikan fitur dan perbaikan bug kepada pengguna Anda lebih cepat.
  4. Umpan Balik Lebih Cepat: Deployment otomatis memungkinkan Anda untuk mendapatkan umpan balik tentang perubahan Anda lebih cepat, membantu Anda untuk mengidentifikasi dan memperbaiki masalah lebih awal.
  5. Skalabilitas: Saat tim Anda tumbuh, otomatisasi menjadi semakin penting untuk mengelola kompleksitas deploy.

Prasyarat

Sebelum kita mulai, pastikan Anda memiliki prasyarat berikut:

  1. Akun GitHub atau penyedia Git lainnya: Kita akan menggunakan GitHub sebagai contoh, tetapi prinsip-prinsipnya berlaku untuk penyedia Git lainnya seperti GitLab atau Bitbucket.
  2. Server dengan akses SSH: Anda memerlukan server yang dapat Anda akses melalui SSH untuk men-deploy aplikasi Anda.
  3. Pengetahuan dasar Git: Pemahaman tentang konsep Git seperti commit, branch, dan push diperlukan.
  4. Pengetahuan dasar Linux (opsional): Meskipun tidak wajib, pemahaman tentang perintah Linux akan sangat membantu.

Kerangka Deploy Otomatis

Berikut adalah kerangka dasar untuk mengatur deploy otomatis:

  1. Konfigurasi kunci SSH: Buat dan konfigurasi kunci SSH untuk memungkinkan server Anda berkomunikasi dengan repositori Git Anda tanpa memerlukan kata sandi.
  2. Webhook: Konfigurasikan webhook di repositori Git Anda untuk memicu deploy setiap kali ada push baru.
  3. Skrip Deploy: Buat skrip deploy yang akan dijalankan di server Anda untuk memperbarui aplikasi Anda dengan kode terbaru.
  4. Manajemen Dependensi: Pastikan dependensi aplikasi Anda diinstal dengan benar di server Anda.
  5. Manajemen Basis Data (opsional): Jika aplikasi Anda menggunakan basis data, Anda mungkin perlu mengotomatiskan migrasi basis data.

Langkah 1: Konfigurasi Kunci SSH

Kunci SSH memungkinkan server Anda untuk mengautentikasi ke repositori Git Anda tanpa memerlukan kata sandi. Ini adalah langkah penting untuk keamanan.

Membuat Kunci SSH

Gunakan perintah berikut untuk membuat kunci SSH di server Anda:

ssh-keygen -t rsa -b 4096 -C "email@example.com"

Ganti “email@example.com” dengan alamat email Anda.

Anda akan diminta untuk menentukan lokasi untuk menyimpan kunci. Tekan Enter untuk menerima lokasi default (~/.ssh/id_rsa).

Anda juga akan diminta untuk memasukkan passphrase. Anda dapat membiarkannya kosong dengan menekan Enter dua kali, tetapi direkomendasikan untuk menggunakan passphrase untuk keamanan tambahan.

Menambahkan Kunci Publik ke GitHub

Setelah kunci SSH dibuat, Anda perlu menambahkan kunci publik ke GitHub.

Pertama, salin kunci publik ke clipboard Anda menggunakan perintah berikut:

cat ~/.ssh/id_rsa.pub

Kemudian, masuk ke GitHub dan navigasikan ke Settings > SSH and GPG keys.

Klik New SSH key.

Berikan judul ke kunci Anda dan tempelkan kunci publik dari clipboard Anda ke dalam bidang Key.

Klik Add SSH key.

Menambahkan Kunci Pribadi ke Server

Sekarang Anda perlu menambahkan kunci pribadi ke server Anda sehingga dapat mengautentikasi ke GitHub.

Pertama, pastikan direktori .ssh memiliki izin yang benar:

chmod 700 ~/.ssh

Kemudian, tambahkan kunci pribadi ke agen SSH:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

Jika Anda menggunakan passphrase, Anda akan diminta untuk memasukkannya.

Menguji Koneksi SSH

Untuk menguji koneksi SSH, gunakan perintah berikut:

ssh -T git@github.com

Anda akan melihat pesan yang mengatakan:

Hi [username]! You've successfully authenticated, but GitHub does not provide shell access.

Ini berarti kunci SSH Anda dikonfigurasi dengan benar.

Langkah 2: Mengatur Webhook GitHub

Webhook adalah cara bagi GitHub untuk memberi tahu server Anda setiap kali ada push baru ke repositori Anda. Kita akan menggunakan webhook untuk memicu skrip deploy kita.

Menavigasi ke Pengaturan Webhook

Masuk ke GitHub dan navigasikan ke repositori Anda.

Klik Settings > Webhooks.

Klik Add webhook.

Konfigurasi Webhook

Anda akan melihat formulir untuk mengkonfigurasi webhook Anda. Berikut adalah bidang yang perlu Anda isi:

  • Payload URL: Ini adalah URL server Anda yang akan menerima payload webhook. Ini biasanya merupakan endpoint yang Anda buat di server Anda untuk menangani webhook. Contoh: http://your-server.com/webhook
  • Content type: Pilih application/json.
  • Secret: Ini adalah kunci rahasia yang akan digunakan untuk memverifikasi bahwa permintaan webhook berasal dari GitHub. Pilih string acak yang aman dan simpan di tempat yang aman. Kita akan menggunakan ini nanti di skrip deploy kita.
  • Which events would you like to trigger this webhook?: Pilih Just the push event.
  • Active: Pastikan kotak centang ini dicentang.

Klik Add webhook.

Langkah 3: Membuat Skrip Deploy

Skrip deploy adalah skrip yang akan dijalankan di server Anda setiap kali ada push baru. Skrip ini akan memperbarui aplikasi Anda dengan kode terbaru.

Buat file baru bernama deploy.sh di direktori home server Anda.

Berikut adalah contoh skrip deploy:

#!/bin/bash

# Konfigurasi
REPO="/path/to/your/repository"
WEB_ROOT="/path/to/your/web/root"
SECRET="your_secret_key"

# Fungsi untuk memvalidasi payload webhook
validate_payload() {
  local payload=$(cat)
  local hash=$(echo -n "$payload" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')
  local signature="sha256="$hash
  local header="$HTTP_X_HUB_SIGNATURE_256"

  if [ "$signature" != "$header" ]; then
    echo "Error: Invalid signature"
    exit 1
  fi
}

# Fungsi untuk men-deploy kode
deploy() {
  echo "Mulai deploy..."

  # Masuk ke direktori repositori
  cd "$REPO"

  # Pull kode terbaru
  git pull origin main

  # Instal dependensi (contoh menggunakan npm)
  npm install

  # Bangun aplikasi (contoh menggunakan npm)
  npm run build

  # Pindahkan file yang dibangun ke direktori web root
  rm -rf "$WEB_ROOT/*"
  cp -r "$REPO/dist/*" "$WEB_ROOT/"

  echo "Deploy selesai."
}

# Memeriksa metode permintaan
if [ "$REQUEST_METHOD" != "POST" ]; then
  echo "Error: Only POST requests are allowed"
  exit 1
fi

# Memvalidasi payload webhook
validate_payload

# Men-deploy kode
deploy

Ganti nilai berikut:

  • /path/to/your/repository: Jalur ke repositori Git Anda di server Anda.
  • /path/to/your/web/root: Jalur ke direktori web root Anda di server Anda.
  • your_secret_key: Kunci rahasia yang Anda konfigurasi di webhook GitHub Anda.

Pastikan skrip deploy dapat dieksekusi:

chmod +x deploy.sh

Penjelasan Skrip:

  • Konfigurasi: Bagian ini mendefinisikan variabel untuk jalur repositori, direktori web root, dan kunci rahasia.
  • validate_payload(): Fungsi ini memvalidasi payload webhook untuk memastikan bahwa itu berasal dari GitHub. Ini menggunakan kunci rahasia untuk menghitung HMAC SHA256 dari payload dan membandingkannya dengan header X-Hub-Signature-256 yang dikirim oleh GitHub.
  • deploy(): Fungsi ini melakukan langkah-langkah berikut:
    • Masuk ke direktori repositori.
    • Pull kode terbaru dari repositori Git.
    • Menginstal dependensi menggunakan npm install.
    • Membangun aplikasi menggunakan npm run build.
    • Menghapus semua file di direktori web root.
    • Menyalin file yang dibangun dari direktori repositori ke direktori web root.
  • Memeriksa Metode Permintaan: Skrip ini hanya menerima permintaan POST.
  • Memvalidasi Payload Webhook: Skrip ini memanggil fungsi validate_payload() untuk memvalidasi payload webhook.
  • Men-deploy Kode: Skrip ini memanggil fungsi deploy() untuk men-deploy kode.

Langkah 4: Membuat Endpoint Webhook di Server Anda

Sekarang kita perlu membuat endpoint di server kita yang akan menerima payload webhook dan menjalankan skrip deploy kita.

Ada banyak cara untuk melakukan ini. Kita akan menggunakan server web sederhana yang ditulis dalam Python sebagai contoh.

Buat file baru bernama webhook.py di direktori home server Anda.

from http.server import BaseHTTPRequestHandler, HTTPServer
import subprocess
import os

class WebhookHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)

        # Jalankan skrip deploy
        try:
            # Mengeset variabel lingkungan
            env = os.environ.copy()
            env['HTTP_X_HUB_SIGNATURE_256'] = self.headers.get('X-Hub-Signature-256', '')
            env['REQUEST_METHOD'] = self.command

            process = subprocess.Popen(['/path/to/your/deploy.sh'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
            stdout, stderr = process.communicate(post_data)

            self.send_response(200)
            self.send_header('Content-type', 'text/plain')
            self.end_headers()
            self.wfile.write(b'Deploy berhasil!\n')
            self.wfile.write(stdout)
            self.wfile.write(stderr)

        except Exception as e:
            self.send_response(500)
            self.send_header('Content-type', 'text/plain')
            self.end_headers()
            self.wfile.write(b'Error saat menjalankan deploy.\n')
            self.wfile.write(str(e).encode('utf-8'))

def run():
    port = 8000
    server_address = ('', port)
    httpd = HTTPServer(server_address, WebhookHandler)
    print(f'Menjalankan server di port {port}')
    httpd.serve_forever()

if __name__ == '__main__':
    run()

Ganti /path/to/your/deploy.sh dengan jalur ke skrip deploy Anda.

Jalankan server web:

python3 webhook.py

Server web akan berjalan di port 8000. Anda dapat mengubah port dengan memodifikasi variabel port dalam skrip.

Penjelasan Skrip:

  • WebhookHandler: Kelas ini menangani permintaan POST ke endpoint webhook.
  • do_POST(): Metode ini dipanggil setiap kali ada permintaan POST ke endpoint webhook. Ini melakukan langkah-langkah berikut:
    • Membaca payload permintaan.
    • Menjalankan skrip deploy.
    • Mengirim respons HTTP.
  • run(): Fungsi ini memulai server web.

Menggunakan Nginx sebagai Proxy (Direkomendasikan)

Direkomendasikan untuk menggunakan Nginx sebagai proxy untuk server web Python Anda. Ini akan memungkinkan Anda untuk melayani server web Anda di port 80 atau 443 dan akan memberikan keamanan dan kinerja tambahan.

Instal Nginx:

sudo apt update
sudo apt install nginx

Buat file konfigurasi Nginx baru:

sudo nano /etc/nginx/sites-available/webhook

Tambahkan konfigurasi berikut:

server {
    listen 80;
    server_name your-server.com;

    location /webhook {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Ganti your-server.com dengan nama domain atau alamat IP server Anda.

Aktifkan konfigurasi Nginx:

sudo ln -s /etc/nginx/sites-available/webhook /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx

Sekarang Anda dapat mengakses endpoint webhook Anda di http://your-server.com/webhook.

Langkah 5: Menguji Deploy Otomatis

Sekarang kita telah mengkonfigurasi semuanya, mari kita uji deploy otomatis.

Lakukan perubahan pada kode Anda dan dorong ke repositori Git Anda.

git add .
git commit -m "Test deploy otomatis"
git push origin main

Anda akan melihat bahwa skrip deploy dijalankan di server Anda dan aplikasi Anda diperbarui dengan kode terbaru.

Anda juga dapat memeriksa log server web Anda untuk melihat apakah webhook diterima dan diproses dengan benar.

Manajemen Dependensi

Manajemen dependensi adalah bagian penting dari deploy otomatis. Anda perlu memastikan bahwa semua dependensi aplikasi Anda diinstal dengan benar di server Anda.

Ada banyak cara untuk mengelola dependensi. Beberapa opsi populer termasuk:

  • npm (Node.js): Gunakan npm install untuk menginstal dependensi Node.js.
  • pip (Python): Gunakan pip install -r requirements.txt untuk menginstal dependensi Python.
  • Composer (PHP): Gunakan composer install untuk menginstal dependensi PHP.
  • Bundler (Ruby): Gunakan bundle install untuk menginstal dependensi Ruby.

Pastikan untuk menyertakan langkah-langkah untuk menginstal dependensi Anda di skrip deploy Anda.

Manajemen Basis Data (Opsional)

Jika aplikasi Anda menggunakan basis data, Anda mungkin perlu mengotomatiskan migrasi basis data.

Ada banyak cara untuk mengotomatiskan migrasi basis data. Beberapa opsi populer termasuk:

  • Flyway: Flyway adalah alat migrasi basis data open-source.
  • Liquibase: Liquibase adalah alat migrasi basis data open-source lainnya.
  • Django Migrations (Python): Django memiliki sistem migrasi basis data bawaan.
  • Laravel Migrations (PHP): Laravel memiliki sistem migrasi basis data bawaan.
  • Rails Migrations (Ruby): Rails memiliki sistem migrasi basis data bawaan.

Pastikan untuk menyertakan langkah-langkah untuk menjalankan migrasi basis data Anda di skrip deploy Anda.

Keamanan

Keamanan sangat penting saat mengatur deploy otomatis.

Berikut adalah beberapa tips untuk meningkatkan keamanan sistem deploy otomatis Anda:

  • Gunakan kunci SSH: Kunci SSH menyediakan cara yang aman untuk mengautentikasi ke repositori Git Anda.
  • Gunakan kunci rahasia: Kunci rahasia memverifikasi bahwa permintaan webhook berasal dari GitHub.
  • Batasi akses server: Hanya izinkan akses ke server Anda kepada orang-orang yang membutuhkannya.
  • Gunakan firewall: Firewall dapat membantu melindungi server Anda dari serangan yang tidak sah.
  • Perbarui perangkat lunak Anda secara teratur: Pastikan untuk memperbarui perangkat lunak Anda secara teratur untuk memperbaiki kerentanan keamanan.
  • Monitor log Anda: Monitor log Anda secara teratur untuk mencari aktivitas yang mencurigakan.
  • Gunakan server web yang aman: Gunakan server web yang aman seperti Nginx dengan konfigurasi SSL/TLS yang tepat.
  • Validasi input: Validasi semua input untuk mencegah serangan injeksi.
  • Enkripsi data sensitif: Enkripsi semua data sensitif, baik saat transit maupun saat istirahat.
  • Terapkan prinsip hak istimewa terendah: Berikan pengguna hanya hak istimewa yang mereka butuhkan untuk melakukan tugas mereka.

Alternatif Selain Python dan Bash

Meskipun contoh di atas menggunakan Python dan Bash, Anda dapat menggunakan berbagai bahasa dan alat lain untuk membuat skrip deploy dan menangani webhook. Berikut adalah beberapa alternatif:

  • Node.js: Gunakan Node.js dan Express untuk membuat endpoint webhook dan menjalankan skrip deploy JavaScript.
  • PHP: Gunakan PHP dan framework seperti Laravel atau Symfony untuk menangani webhook dan menjalankan skrip deploy PHP.
  • Go: Gunakan Go untuk membuat endpoint webhook yang efisien dan menjalankan skrip deploy.
  • Docker: Gunakan Docker untuk mengemas aplikasi Anda dan dependensinya ke dalam wadah, dan gunakan Docker Compose untuk men-deploy aplikasi Anda. Ini memungkinkan konsistensi yang lebih besar di seluruh lingkungan.
  • Serverless Functions (AWS Lambda, Google Cloud Functions, Azure Functions): Gunakan fungsi serverless untuk menangani webhook dan menjalankan skrip deploy. Ini menghilangkan kebutuhan untuk mengelola server.

Kesimpulan

Deploy otomatis dapat meningkatkan efisiensi, mengurangi kesalahan, dan mempercepat siklus pengembangan Anda. Dengan mengikuti langkah-langkah yang diuraikan dalam posting blog ini, Anda dapat mengatur deploy otomatis setelah setiap Git push tanpa memerlukan Jenkins. Ingatlah untuk memprioritaskan keamanan dan menguji sistem Anda secara menyeluruh sebelum menggunakannya di lingkungan produksi.

Selamat mengotomatiskan!

“`

omcoding

Leave a Reply

Your email address will not be published. Required fields are marked *