name: CI/CD — Build & Deploy on: push: branches: [main] pull_request: branches: [main] jobs: build-and-deploy: name: Build & Deploy runs-on: vps-runner steps: - uses: actions/checkout@v4 # ── Backend ────────────────────────────────────────────────────────────── - name: Install & build backend working-directory: backend run: | npm ci npm run build - name: Deploy backend if: github.event_name == 'push' && github.ref == 'refs/heads/main' run: | mkdir -p /var/www/sakuin/backend rsync -a --delete backend/dist/ /var/www/sakuin/backend/dist/ rsync -a backend/package.json backend/package-lock.json /var/www/sakuin/backend/ cd /var/www/sakuin/backend && npm ci --omit=dev - name: Restart pm2 if: github.event_name == 'push' && github.ref == 'refs/heads/main' run: | su - tetardtek-brain -c 'pm2 reload sakuin-backend --update-env' # ── Frontend ───────────────────────────────────────────────────────────── - name: Install & build frontend working-directory: frontend env: VITE_API_URL: https://sakuin.tetardtek.com/api VITE_OAUTH_URL: https://superoauth.tetardtek.com VITE_OAUTH_CLIENT_ID: sakuin run: | npm ci npm run build - name: Deploy frontend if: github.event_name == 'push' && github.ref == 'refs/heads/main' run: | mkdir -p /var/www/sakuin/frontend/build rsync -a --delete frontend/build/ /var/www/sakuin/frontend/build/ # ── Smoke test ─────────────────────────────────────────────────────────── - name: Smoke test API if: github.event_name == 'push' && github.ref == 'refs/heads/main' run: | sleep 3 curl -sf http://localhost:4002/api/health | grep -q '"ok"' echo "✅ API health OK"