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:
- Efisiensi Waktu: Otomatisasi menghilangkan langkah-langkah manual, menghemat waktu berharga yang dapat Anda gunakan untuk tugas-tugas yang lebih penting.
- Mengurangi Kesalahan: Deploy manual rentan terhadap kesalahan manusia. Otomatisasi meminimalkan risiko kesalahan dan memastikan konsistensi.
- Deployment Lebih Cepat: Perubahan kode Anda di-deploy lebih cepat, memungkinkan Anda untuk memberikan fitur dan perbaikan bug kepada pengguna Anda lebih cepat.
- 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.
- Skalabilitas: Saat tim Anda tumbuh, otomatisasi menjadi semakin penting untuk mengelola kompleksitas deploy.
Prasyarat
Sebelum kita mulai, pastikan Anda memiliki prasyarat berikut:
- Akun GitHub atau penyedia Git lainnya: Kita akan menggunakan GitHub sebagai contoh, tetapi prinsip-prinsipnya berlaku untuk penyedia Git lainnya seperti GitLab atau Bitbucket.
- Server dengan akses SSH: Anda memerlukan server yang dapat Anda akses melalui SSH untuk men-deploy aplikasi Anda.
- Pengetahuan dasar Git: Pemahaman tentang konsep Git seperti commit, branch, dan push diperlukan.
- 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:
- Konfigurasi kunci SSH: Buat dan konfigurasi kunci SSH untuk memungkinkan server Anda berkomunikasi dengan repositori Git Anda tanpa memerlukan kata sandi.
- Webhook: Konfigurasikan webhook di repositori Git Anda untuk memicu deploy setiap kali ada push baru.
- Skrip Deploy: Buat skrip deploy yang akan dijalankan di server Anda untuk memperbarui aplikasi Anda dengan kode terbaru.
- Manajemen Dependensi: Pastikan dependensi aplikasi Anda diinstal dengan benar di server Anda.
- 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 headerX-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!
“`