D
Setup

CI/CD & GitHub Actions

Dua workflow GitHub Actions — staging (push ke staging) dan production (push ke v3). Self-hosted runner, git reset --hard, npm install, npm run build, PM2 restart. Tidak ada test gate.

engine-whatsapp punya dua workflow GitHub Actions — satu untuk staging, satu untuk produksi. Keduanya memakai self-hosted runner dan PM2 untuk restart app.

Dua workflow

WorkflowFileTriggerRunnerTarget
Stagingdeploy_staging.ymlpush ke stagingself-hosted, stagingStaging
Productiondeploy_production.ymlpush ke v3self-hosted, productionProduksi

Alur workflow

Kedua workflow identik struktur — hanya berbeda branch, runner, project dir, dan PM2 service name:

text
1. checkout repo
2. cd $PROJECT_DIR  →  git fetch --all  →  git reset --hard origin/<branch>
3. npm install
4. NODE_OPTIONS="--max-old-space-size=4096" npm run build
5. PM2 restart app (jika sudah ada)

PM2 service name

EnvironmentAppProject dir
Stagingengine-dazo-dev/home/deployer/app/engine-whatsapp
Productionengine-dazo/var/www/engine-whatsapp

Langkah workflow detail (production)

yaml
# .github/workflows/deploy_production.yml
name: Deploy to Staging   # ← salah label, target sudah benar (production)

on:
  push:
    branches:
      - v3

jobs:
  deploy:
    runs-on: [self-hosted, production]

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

      - name: Deploy Dazo App production
        run: |
          cd /var/www/engine-whatsapp

          echo "Pulling latest code..."
          git fetch --all
          git reset --hard origin/v3

          echo "Installing Dependencies..."
          npm install

          echo "Building resources..."
          NODE_OPTIONS="--max-old-space-size=4096" npm run build

          echo "Deploy Successfully..."

      - name: Restart app
        run: |
          if sudo pm2 list | grep -q 'engine-dazo'; then
            sudo pm2 restart engine-dazo
          fi

          echo "Deploy Successfully..."

Build step

bash
# package.json scripts
"dev":   "tsx src/app.ts"
"build": "tsc && resolve-tspaths --out ./dist"
"start": "node dist/app.js"

npm run build menjalankan:

  1. tsc — compile TypeScript ke dist/
  2. resolve-tspaths --out ./dist — resolve path alias * → src/* di output

NODE_OPTIONS=--max-old-space-size=4096 menaikkan heap limit Node ke 4GB untuk mencegah OOM saat compile (TypeScript + resolve-tspaths).

Caveats

CaveatDampak
Salah label workflowdeploy_production.yml bernama “Deploy to Staging” — target deploy sudah benar, hanya nama yang keliru
First-start tidak ditanganiif grep -q hanya restart jika service sudah ada — deploy pertama ke server baru butuh SSH manual untuk pm2 start
Tidak ada npx tsc --noEmit gateSyntax/type error baru terlihat saat PM2 start crash
Tidak ada automated testTidak ada regression test di CI
.env tidak ter-deployFile gitignored — harus ada di server manual dengan kredensial produksi
session/auth/ tidak ter-deployFolder gitignored — kredensial sesi tetap di server
npm install tanpa lockfile trackedpackage-lock.json ada di repo tapi tidak di-gitignore (beda dari engine-bot)

Yang TIDAK boleh diubah tanpa koordinasi

AreaLokasi
Bentuk payload webhooksrc/utils/helper.ts — sendWebhook
WEBHOOK_URL.env — base URL backend Dazo
Event Socket.IOsrc/service/socketService.ts, src/service/notificationService.ts
Field instanceId konsistensifolder session/auth/, key Map, room Socket.IO, kolom id device

Aturan operasi git

  • Jangan commit, push, atau merge tanpa diminta eksplisit
  • Pisahkan commit pembenahan dari commit fitur
  • Sebelum push ke v3, pastikan npx tsc --noEmit lolos (exit 0)
  • Jangan ubah bentuk payload webhook tanpa koordinasi backend
  • Jangan ubah event Socket.IO tanpa koordinasi frontend
  • Jangan commit .env dengan kredensial nyata — file ini gitignored

Konvensi pesan commit (Bahasa Indonesia, prefix titik dua dengan spasi):

text
feat : deskripsi fitur baru
fix : deskripsi perbaikan
log : penambahan logging
conf: perubahan konfigurasi
style: perubahan gaya/format

Langkah berikutnya