Automasi Proses Deploy Static Web

Sebelumnya saya pernah menulis tentang membuat website CMS (Ghost, Wordpress) menjadi static web https://benidiktus.web.id/load-website-lebih-cepat-dengan-headless-cms/

Pada post tersebut caranya cukup rumit dimana perlu build static websitenya dengan gatsby dan push ke github. Saya mencoba membuat API yang berisi perintah untuk menjalankan proses build dan git push yang dijalankan setiap kali ada perubahan di website. Di sini saya menggunakan ghost blog sebagai CMS. Memanfaatkan fitur integrasi dengan Webhook.

Requirement

  1. Server yang digunakan untuk build dan push terinstall python
  2. Script Python untuk build & push ke github repository
  3. Webhook API

Saya asumsikan server sudah terhubung dengan git dengan SSH Credentials supaya tidak muncul prompt untuk input username dan password

Script python untuk build

buat script berikut, saya namankan ghost-build.py

#!/bin/bash

# --- KONFIGURASI ---
PROJECT_DIR="/path/to/your/gatsby-project"
LOG_FILE="/home/user/ghost-deploy/deploy.log"
GATSBY_BIN="/usr/local/bin/gatsby" # Cek lokasi asli dengan `which gatsby`
GIT_BRANCH="main"

# Fungsi logging sederhana
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

log "--- Menerima Trigger Webhook ---"

# Pindah ke direktori project
cd $PROJECT_DIR || { log "Gagal masuk direktori project"; exit 1; }

# 1. Build Gatsby
log "Mulai Gatsby Build..."
$GATSBY_BIN build >> $LOG_FILE 2>&1

if [ $? -ne 0 ]; then
    log "ERROR: Gatsby Build GAGAL. Cek log detail di atas."
    exit 1
fi

# 2. Git Push
log "Build sukses. Melakukan Push ke Github..."
git add . >> $LOG_FILE 2>&1
git commit -m "Auto-update from Ghost: $(date)" >> $LOG_FILE 2>&1
git push origin $GIT_BRANCH >> $LOG_FILE 2>&1

log "--- Deployment Selesai ---"

Script API

saya simpan sebagai webhook.py

from flask import Flask, request, jsonify
import subprocess
import threading

app = Flask(__name__)

# --- KONFIGURASI ---
SCRIPT_PATH = "/home/user/ghost-deploy/deploy.sh"
SECRET_KEY = "rahasia-dapur-ghost"  # Ganti dengan password pilihan Anda

# Flag untuk mencegah build tumpang tindih
is_building = False

def run_build_process():
    global is_building
    try:
        # Jalankan script bash
        subprocess.run([SCRIPT_PATH], shell=True)
    except Exception as e:
        print(f"Error executing script: {e}")
    finally:
        # Lepaskan lock setelah selesai (sukses atau gagal)
        is_building = False

@app.route('/webhook', methods=['POST'])
def handle_webhook():
    global is_building

    # 1. Validasi Security (Cek Secret Key di URL)
    key = request.args.get('key')
    if key != SECRET_KEY:
        return jsonify({"status": "error", "message": "Invalid Key"}), 403

    # 2. Cek apakah sedang ada proses build berjalan
    if is_building:
        return jsonify({"status": "ignored", "message": "Build sedang berjalan, harap tunggu."}), 429

    # 3. Jalankan Build di Background (Thread)
    # Kita harus merespon Ghost dengan cepat, jadi build dilakukan di thread terpisah
    is_building = True
    thread = threading.Thread(target=run_build_process)
    thread.start()

    return jsonify({"status": "success", "message": "Build process started in background."}), 200

if __name__ == '__main__':
    # Jalankan di localhost port 5000
    app.run(host='0.0.0.0', port=5000)

Pembuatan services

selanjutnya kita buat webhook.py sebagai services supaya bisa berjalan di background.

url API menjadi = "http://serverip:5000/webhook?key=rahasia-dapur-ghost"

Integrasi di Ghost

  1. Masuk ke menu setting – Advance – integrations – Add integration
  2. Buat nama integrationya misalnya gatsby
  3. Scroll ke bawah lalu klik Add webhook

Beri nama webhook lalu pilih Sites Changed (rebuild). Tambahkan URL script webhook.py sebagai di Target URL. Secret bisa dikosongkan

Dengan script ini maka ketika ada perubahan post, penambahan post akan otomatis menjalankan gatsby build dan git push

Log Script

Untuk cek apakah script webhook.py dijalankan saat ada perubahan di Ghost, bisa dicek di file log script tersebut, pada baris script berikut

LOG_FILE="/home/user/ghost-deploy/deploy.log"

Silahkan dicoba semoga bermanfaat