Wednesday

18-06-2025 Vol 19

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

Cara Mengatur Auto Deployments Setelah Setiap Git Push (Tanpa Jenkins)

Ingin menyederhanakan alur kerja deployment Anda dan menghilangkan langkah-langkah manual? Pernahkah Anda membayangkan dunia di mana setiap kali Anda melakukan push ke repositori Git Anda, perubahan Anda secara otomatis diterapkan ke server Anda? Ini bukan mimpi pipa. Dengan alat dan strategi yang tepat, Anda dapat mengatur alur kerja auto deployment yang efisien tanpa memerlukan Jenkins, sebuah alat otomasi yang populer tetapi seringkali berlebihan.

Artikel ini akan memandu Anda melalui proses pengaturan auto deployment setelah setiap Git push. Kami akan menjelajahi berbagai opsi, mempertimbangkan pro dan kontra dari setiap pendekatan, dan memberikan panduan langkah demi langkah untuk mengimplementasikan solusi yang sesuai dengan kebutuhan Anda. Baik Anda seorang pengembang solo, bagian dari tim kecil, atau mengelola proyek yang lebih besar, Anda akan menemukan wawasan berharga dalam panduan ini.

Mengapa Auto Deployments Penting?

Sebelum kita menyelami detail teknis, mari kita pahami mengapa auto deployments sangat bermanfaat:

  1. Efisiensi Waktu: Otomatisasi deployment menghemat waktu yang berharga. Anda tidak perlu lagi secara manual menyalin file, menjalankan skrip, atau menunggu proses deployment yang memakan waktu.
  2. Pengurangan Kesalahan: Proses deployment manual rentan terhadap kesalahan manusia. Otomatisasi mengurangi risiko kesalahan dan memastikan deployment yang konsisten dan dapat diandalkan.
  3. Umpan Balik Lebih Cepat: Dengan auto deployments, perubahan Anda langsung diterapkan, memungkinkan Anda untuk menerima umpan balik lebih cepat dan melakukan iterasi dengan lebih efisien.
  4. Peningkatan Morale Tim: Otomatisasi tugas-tugas yang membosankan dan berulang meningkatkan morale tim dan memungkinkan pengembang untuk fokus pada tugas-tugas yang lebih penting.
  5. Continuous Integration/Continuous Deployment (CI/CD): Auto deployments adalah komponen penting dari alur kerja CI/CD, yang memungkinkan Anda untuk mengotomatiskan seluruh proses rilis perangkat lunak Anda.

Opsi untuk Auto Deployments (Tanpa Jenkins)

Ada beberapa opsi yang tersedia untuk mengatur auto deployments tanpa menggunakan Jenkins. Masing-masing opsi memiliki kelebihan dan kekurangan, jadi penting untuk mempertimbangkan kebutuhan spesifik Anda sebelum memilih pendekatan:

1. Git Hooks

Git hooks adalah skrip yang dijalankan secara otomatis sebelum atau sesudah peristiwa Git tertentu, seperti commit, push, dan receive. Anda dapat menggunakan Git hooks untuk memicu deployment otomatis setelah push ke repositori Anda.

Pro:

  • Sederhana: Git hooks relatif mudah diatur dan dikonfigurasi.
  • Kontrol Penuh: Anda memiliki kontrol penuh atas skrip deployment dan dapat menyesuaikannya dengan kebutuhan spesifik Anda.
  • Tidak Memerlukan Alat Tambahan: Git hooks adalah fitur bawaan dari Git, sehingga Anda tidak perlu menginstal atau mengonfigurasi alat tambahan.

Kontra:

  • Manajemen: Mengelola Git hooks untuk proyek yang lebih besar bisa menjadi rumit.
  • Keamanan: Git hooks dijalankan di server Anda, jadi penting untuk memastikan bahwa skrip Anda aman dan tidak rentan terhadap serangan.
  • Konsistensi: Git hooks disimpan secara lokal di repositori Anda, jadi Anda perlu memastikan bahwa semua anggota tim memiliki hook yang sama terinstal.

Cara Kerjanya:

  1. Buat skrip (misalnya, dalam bash atau Python) yang menangani deployment Anda. Skrip ini biasanya akan melakukan hal-hal seperti:
    • Menarik (pull) perubahan terbaru dari repositori Git.
    • Menjalankan build atau kompilasi (jika diperlukan).
    • Memindahkan file yang dibangun ke direktori yang benar di server Anda.
    • Memulai ulang server web atau layanan Anda.
  2. Simpan skrip ini di direktori `.git/hooks` di repositori Anda. Namai skrip `post-receive`.
    • Penting: Pastikan skrip dapat dieksekusi dengan menggunakan perintah `chmod +x .git/hooks/post-receive`.
  3. Ketika seseorang melakukan push ke repositori Anda, Git akan secara otomatis menjalankan skrip `post-receive` di server.

Contoh Skrip `post-receive` (Bash):

#!/bin/bash
while read oldrev newrev ref
do
  branch=$(git rev-parse --symbolic --abbrev-ref $ref)

  # Hanya lakukan deployment jika perubahan di-push ke branch 'main'
  if [ "$branch" == "main" ]; then
    echo "Menerapkan perubahan ke branch main..."

    # Masuk ke direktori proyek
    cd /path/to/your/project

    # Tarik perubahan terbaru
    git pull origin main

    # (Opsional) Jalankan build atau kompilasi
    # npm install
    # npm run build

    # (Opsional) Restart server web
    # systemctl restart your-web-server

    echo "Deployment selesai."
  fi
done
  

2. Webhooks (GitHub, GitLab, Bitbucket)

Webhooks adalah mekanisme di mana aplikasi dapat mengirim notifikasi real-time ke aplikasi lain ketika suatu peristiwa terjadi. Platform seperti GitHub, GitLab, dan Bitbucket menyediakan webhooks yang dapat Anda gunakan untuk memicu deployment otomatis setelah push ke repositori Anda.

Pro:

  • Mudah Dikonfigurasi: Webhooks relatif mudah dikonfigurasi melalui antarmuka web platform hosting kode Anda.
  • Terukur: Webhooks dapat menangani sejumlah besar peristiwa dan permintaan.
  • Keamanan: Webhooks menyediakan mekanisme keamanan untuk memverifikasi bahwa permintaan berasal dari platform hosting kode yang sah.

Kontra:

  • Membutuhkan Server: Anda membutuhkan server yang dapat menerima dan memproses permintaan webhook.
  • Konfigurasi Tambahan: Anda perlu mengonfigurasi server Anda untuk menerima dan memproses permintaan webhook.
  • Ketergantungan: Anda bergantung pada platform hosting kode untuk mengirimkan permintaan webhook dengan andal.

Cara Kerjanya:

  1. Anda mengonfigurasi webhook di platform hosting kode Anda (misalnya, GitHub). Anda menentukan URL yang akan dipanggil oleh platform hosting kode ketika suatu peristiwa terjadi (misalnya, push ke repositori).
  2. Anda membuat server yang mendengarkan permintaan webhook. Server ini akan menerima permintaan webhook dan memprosesnya.
  3. Ketika seseorang melakukan push ke repositori Anda, platform hosting kode akan mengirimkan permintaan webhook ke server Anda.
  4. Server Anda akan menjalankan skrip deployment, sama seperti dalam pendekatan Git hooks.

Contoh Implementasi Webhook (menggunakan Express.js dan Node.js):

Langkah 1: Inisialisasi proyek Node.js

mkdir webhook-server
cd webhook-server
npm init -y
npm install express body-parser child_process --save

Langkah 2: Buat file `server.js`

const express = require('express');
const bodyParser = require('body-parser');
const { exec } = require('child_process');

const app = express();
const port = 3000;

app.use(bodyParser.json());

app.post('/webhook', (req, res) => {
  console.log('Webhook diterima!');

  // Verifikasi tanda tangan webhook (penting untuk keamanan!)
  const signature = req.headers['x-hub-signature-256'];
  const expectedSignature = 'sha256=' + calculateSignature(JSON.stringify(req.body), 'your-webhook-secret'); // Ganti 'your-webhook-secret' dengan secret yang Anda konfigurasi di GitHub

  if (signature !== expectedSignature) {
    console.error('Tanda tangan webhook tidak valid!');
    return res.status(401).send('Tanda tangan tidak valid.');
  }

  // Jalankan skrip deployment
  exec('./deploy.sh', (error, stdout, stderr) => {
    if (error) {
      console.error(`Error: ${error.message}`);
      return res.status(500).send(`Error: ${error.message}`);
    }
    if (stderr) {
      console.error(`stderr: ${stderr}`);
      return res.status(500).send(`stderr: ${stderr}`);
    }
    console.log(`stdout: ${stdout}`);
    res.status(200).send('Deployment berhasil dipicu!');
  });
});

// Fungsi untuk menghitung tanda tangan webhook (gunakan modul crypto untuk keamanan yang lebih baik)
function calculateSignature(body, secret) {
  const crypto = require('crypto');
  const hmac = crypto.createHmac('sha256', secret);
  hmac.update(body);
  return hmac.digest('hex');
}

app.listen(port, () => {
  console.log(`Server webhook mendengarkan di port ${port}`);
});
  

Langkah 3: Buat file `deploy.sh`

#!/bin/bash

# Masuk ke direktori proyek
cd /path/to/your/project

# Tarik perubahan terbaru
git pull origin main

# (Opsional) Jalankan build atau kompilasi
# npm install
# npm run build

# (Opsional) Restart server web
# systemctl restart your-web-server

Langkah 4: Pastikan `deploy.sh` dapat dieksekusi

chmod +x deploy.sh

Langkah 5: Konfigurasi webhook di GitHub/GitLab/Bitbucket

  • Buka pengaturan repositori Anda.
  • Cari opsi “Webhooks” (biasanya di bagian “Settings” atau “Integrations”).
  • Tambahkan webhook baru.
  • Payload URL: Masukkan URL server webhook Anda (misalnya, `http://your-server-ip:3000/webhook`).
  • Content type: Pilih `application/json`.
  • Secret: Masukkan secret yang akan digunakan untuk memverifikasi tanda tangan webhook. Pilih secret yang kuat dan simpan dengan aman. Ini harus sama dengan secret yang Anda gunakan dalam fungsi `calculateSignature` di `server.js`.
  • Which events would you like to trigger this webhook?: Pilih “Just the push event.” Anda dapat memilih event lain jika diperlukan, tetapi untuk contoh ini, kita hanya peduli dengan event push.
  • Klik “Add webhook”.

Penting:

  • Keamanan Webhook: Sangat penting untuk memverifikasi tanda tangan webhook. Tanpa verifikasi tanda tangan, siapa pun dapat mengirim permintaan palsu ke server Anda dan memicu deployment yang tidak diinginkan. Contoh di atas menyertakan kode dasar untuk memverifikasi tanda tangan, tetapi Anda harus menggunakan modul `crypto` Node.js untuk implementasi yang lebih aman.
  • Kerahasiaan Secret Webhook: Simpan secret webhook Anda dengan aman. Jangan pernah menyimpannya di kode Anda atau mengirimkannya melalui saluran yang tidak aman. Gunakan variabel lingkungan atau solusi manajemen rahasia lainnya.
  • Penanganan Kesalahan: Pastikan untuk menangani kesalahan dengan benar di server webhook dan skrip deployment Anda. Catat kesalahan ke file log atau sistem pemantauan sehingga Anda dapat mendiagnosis masalah dengan cepat.
  • Uptime Server Webhook: Pastikan server webhook Anda selalu aktif dan berjalan. Jika server webhook Anda mati, deployment Anda tidak akan dipicu.

3. Layanan CI/CD Minimalis (Selain Jenkins)

Ada beberapa layanan CI/CD yang lebih ringan dan mudah dikonfigurasi daripada Jenkins. Layanan ini seringkali menyediakan integrasi bawaan dengan platform hosting kode dan menyederhanakan proses deployment.

Contoh:

  • GitHub Actions: Terintegrasi langsung dengan GitHub dan memungkinkan Anda untuk mengotomatiskan alur kerja pengembangan Anda, termasuk deployment.
  • GitLab CI/CD: Bagian dari GitLab dan menyediakan fitur CI/CD yang lengkap.
  • Netlify: Platform yang sangat populer untuk deployment front-end (misalnya, React, Vue, Angular) yang menyederhanakan proses deployment.
  • Vercel: Mirip dengan Netlify dan juga berfokus pada deployment front-end.
  • Render: Platform untuk deployment aplikasi web, API, dan layanan backend.

Pro:

  • Kemudahan Penggunaan: Layanan ini seringkali menyediakan antarmuka pengguna yang intuitif dan mudah digunakan.
  • Integrasi Bawaan: Layanan ini biasanya terintegrasi langsung dengan platform hosting kode Anda.
  • Fitur Tambahan: Layanan ini seringkali menyediakan fitur tambahan seperti pengujian otomatis, build, dan monitoring.

Kontra:

  • Biaya: Beberapa layanan mungkin memiliki biaya, terutama untuk proyek yang lebih besar atau fitur yang lebih canggih.
  • Ketergantungan: Anda bergantung pada layanan pihak ketiga untuk deployment Anda.
  • Keterbatasan: Layanan ini mungkin memiliki keterbatasan tertentu yang tidak memungkinkan Anda untuk menyesuaikan alur kerja deployment Anda sepenuhnya.

Contoh Penggunaan GitHub Actions:

  1. Buat file `.github/workflows/deploy.yml` di repositori Anda.
  2. Tambahkan konfigurasi alur kerja berikut:
name: Deploy to Server

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: SSH and Deploy
        uses: appleboy/ssh-action@v0.1.10
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /path/to/your/project
            git pull origin main
            # (Opsional) Jalankan build atau kompilasi
            # npm install
            # npm run build
            # (Opsional) Restart server web
            # systemctl restart your-web-server
  

Penjelasan:

  • `name: Deploy to Server`**: Menentukan nama alur kerja.
  • `on: push: branches: – main`**: Menentukan bahwa alur kerja akan dipicu ketika ada push ke branch `main`.
  • `jobs: deploy`**: Menentukan job yang akan dijalankan.
  • `runs-on: ubuntu-latest`**: Menentukan bahwa job akan dijalankan pada runner Ubuntu terbaru.
  • `steps:`**: Menentukan langkah-langkah yang akan dijalankan.
  • `actions/checkout@v3`**: Menggunakan action untuk checkout kode dari repositori.
  • `appleboy/ssh-action@v0.1.10`**: Menggunakan action untuk terhubung ke server melalui SSH dan menjalankan skrip deployment.
  • `secrets.SSH_HOST`, `secrets.SSH_USERNAME`, `secrets.SSH_PRIVATE_KEY`**: Menggunakan secrets untuk menyimpan informasi koneksi SSH dengan aman. Anda perlu mengonfigurasi secrets ini di pengaturan repositori GitHub Anda.
  • `script:`**: Menentukan skrip deployment yang akan dijalankan di server.

Langkah-langkah Konfigurasi Secrets di GitHub:

  • Buka pengaturan repositori Anda.
  • Cari opsi “Secrets” (biasanya di bagian “Settings” atau “Security”).
  • Tambahkan secrets berikut:
    • `SSH_HOST`**: Alamat IP atau nama domain server Anda.
    • `SSH_USERNAME`**: Nama pengguna untuk terhubung ke server Anda melalui SSH.
    • `SSH_PRIVATE_KEY`**: Kunci privat SSH yang akan digunakan untuk otentikasi. Pastikan untuk menggunakan kunci privat yang aman dan tidak dibagikan dengan orang lain.

Penting:

  • Keamanan Kunci Privat SSH: Pastikan untuk menyimpan kunci privat SSH Anda dengan aman. Jangan pernah menyimpannya di kode Anda atau mengirimkannya melalui saluran yang tidak aman. Gunakan variabel lingkungan atau solusi manajemen rahasia lainnya.
  • Firewall: Pastikan firewall server Anda mengizinkan koneksi SSH dari alamat IP runner GitHub Actions.
  • Hak Akses: Pastikan pengguna SSH yang Anda gunakan memiliki hak akses yang diperlukan untuk menjalankan skrip deployment dan memodifikasi file di server Anda.

4. Kombinasi Webhooks dan Skrip Deployment Sederhana

Pendekatan ini melibatkan penggunaan webhooks dari platform seperti GitHub untuk memicu skrip deployment sederhana di server Anda. Skrip ini dapat ditulis dalam bahasa apa pun yang didukung oleh server Anda, seperti bash, Python, atau Node.js.

Pro:

  • Fleksibel: Anda memiliki kendali penuh atas skrip deployment dan dapat menyesuaikannya dengan kebutuhan Anda.
  • Sederhana: Alur kerja relatif mudah diatur dan dikelola.
  • Tidak Memerlukan Alat Kompleks: Anda tidak memerlukan alat CI/CD yang kompleks seperti Jenkins.

Kontra:

  • Membutuhkan Pemeliharaan: Anda bertanggung jawab untuk memelihara skrip deployment dan memastikan bahwa mereka bekerja dengan benar.
  • Potensi Masalah Keamanan: Penting untuk memastikan bahwa skrip deployment Anda aman dan tidak rentan terhadap serangan.
  • Skalabilitas: Pendekatan ini mungkin tidak cocok untuk proyek yang sangat besar atau kompleks.

Praktik Terbaik untuk Auto Deployments

Berikut adalah beberapa praktik terbaik yang perlu diingat ketika mengatur auto deployments:

  • Keamanan: Prioritaskan keamanan. Gunakan kunci SSH untuk otentikasi, verifikasi tanda tangan webhook, dan pastikan bahwa skrip deployment Anda aman.
  • Pengujian: Uji perubahan Anda secara menyeluruh sebelum melakukan deployment. Gunakan lingkungan staging untuk menguji perubahan Anda sebelum menerapkan ke produksi.
  • Pencadangan: Buat cadangan data Anda secara teratur untuk melindungi diri dari kehilangan data jika terjadi kegagalan deployment.
  • Monitoring: Pantau deployment Anda untuk memastikan bahwa mereka berhasil dan bahwa aplikasi Anda berfungsi dengan benar.
  • Rollback: Siapkan rencana rollback jika terjadi kesalahan selama deployment.
  • Logging: Catat semua aktivitas deployment untuk membantu Anda memecahkan masalah dan memahami apa yang terjadi.
  • Variabel Lingkungan: Gunakan variabel lingkungan untuk menyimpan konfigurasi yang sensitif dan yang bervariasi antar lingkungan (misalnya, staging dan produksi).
  • Deployment Bertahap (Canary Deployments): Pertimbangkan untuk menggunakan deployment bertahap, di mana Anda hanya menerapkan perubahan ke sebagian kecil pengguna terlebih dahulu, untuk mengurangi risiko masalah yang mempengaruhi semua pengguna.

Memilih Pendekatan yang Tepat

Memilih pendekatan auto deployment yang tepat tergantung pada kebutuhan dan kompleksitas proyek Anda. Berikut adalah beberapa panduan:

  • Proyek Kecil dan Sederhana: Git Hooks atau Webhooks dengan skrip sederhana mungkin cukup.
  • Proyek dengan Kompleksitas Sedang: Layanan CI/CD minimalis seperti GitHub Actions atau GitLab CI/CD adalah pilihan yang baik.
  • Proyek Besar dan Kompleks: Pertimbangkan layanan CI/CD yang lebih lengkap atau kombinasi Webhooks dengan sistem orkestrasi yang lebih kuat (meskipun artikel ini bertujuan untuk menghindari pendekatan kompleks seperti itu).

Kesimpulan

Auto deployments adalah cara yang ampuh untuk menyederhanakan alur kerja deployment Anda, mengurangi kesalahan, dan meningkatkan efisiensi tim Anda. Dengan mengikuti panduan dalam artikel ini, Anda dapat mengatur alur kerja auto deployment yang efisien tanpa memerlukan Jenkins. Ingatlah untuk memprioritaskan keamanan, pengujian, dan pemantauan untuk memastikan bahwa deployment Anda berhasil dan andal.

Dengan memilih pendekatan yang tepat dan menerapkan praktik terbaik, Anda dapat memanfaatkan kekuatan auto deployments dan meningkatkan kecepatan dan kualitas rilis perangkat lunak Anda.

“`

omcoding

Leave a Reply

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