D
Setup

CI/CD & GitHub Actions

Dua workflow GitHub Actions — staging (push ke branch staging) dan production (push ke master). Self-hosted runner, PM2 restart app + worker. Install memakai --legacy-peer-deps tanpa lockfile.

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

Dua workflow

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

Alur workflow

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

text
1. checkout repo
2. cd $PROJECT_DIR  →  git fetch --all  →  git reset --hard origin/<branch>
3. npm install --legacy-peer-deps
4. PM2 restart app (jika ada) atau PM2 start (first run)
5. PM2 restart worker (jika ada) atau PM2 start (first run)

PM2 service name

EnvironmentAppWorkerProject dir var
Stagingengine-bot-devworker-followupai-devvars.PROJECT_DIR_DEVELOPMENT
Productionengine-bot-dazoworker-followupaivars.PROJECT_DIR_PRODUCTION

Langkah workflow detail (production)

yaml
# deploy_production.yml
- name: Fetch and hard reset master
  run: |
    cd ${{ vars.PROJECT_DIR_PRODUCTION }}
    git fetch --all
    git reset --hard origin/master

- name: Install dependencies
  run: npm install --legacy-peer-deps

- name: Restart app
  run: |
    if sudo pm2 list | grep -q 'engine-bot-dazo'; then
      sudo pm2 restart engine-bot-dazo
    else
      sudo pm2 start ${{ vars.PROJECT_DIR_PRODUCTION }}/app.js --name engine-bot-dazo
    fi

    if sudo pm2 list | grep -q 'worker-followupai'; then
      sudo pm2 restart worker-followupai
    else
      sudo pm2 start ${{ vars.PROJECT_DIR_PRODUCTION }}/scheduler/worker/worker.js --name worker-followupai
    fi

Caveats

CaveatDampak
npm install --legacy-peer-depspackage-lock.json di-ignore — install tidak reproducible, versi dependency bisa drift
Step install tanpa working-directoryStep npm install mungkin resolve ke path runner home, bukan project dir
Tidak ada node --check gateSyntax error baru terlihat saat PM2 start crash
npm test tidak adaTidak ada regression test di CI
First-start PM2 pathSaat PM2 first-start (service belum ada), path $PROJECT_DIR di-resolve dari GitHub vars — pastikan var ter-set
config/env.js gitignoredFile tidak ter-deploy via git — harus ada di server manual

Yang TIDAK boleh diubah tanpa koordinasi

AreaLokasi
jwtSecretconfig/env.js — wajib sync dengan dazoapp + backend-go
urlEngine, urlApi, base_urlconfig/env.js — URL service eksternal
TOKEN_SEND_MESSAGE, BASE_URL_SEND_MESSAGEconfig/env.js — messaging API contract
apiKey_RajaOngkirV2config/env.js — RajaOngkir API key

Aturan operasi git

  • Jangan commit, push, atau merge tanpa diminta eksplisit
  • Pisahkan commit pembenahan dari commit fitur
  • Sebelum push ke master, pastikan node --check lolos untuk file yang berubah
  • Jangan ubah jwtSecret tanpa koordinasi dengan dazoapp
  • Jangan commit config/env.js dengan kredensial nyata — file ini gitignored

Langkah berikutnya