Setup CI/CD untuk Astro / Next.js dengan GitHub Actions
Workflow lengkap: lint → test → build → deploy ke server in-house. Dengan caching dan rollback yang aman.
Tujuan workflow
- Setiap push ke
main→ auto-deploy ke production - PR → run lint + test + preview build
- Deploy hemat: pakai cache, jangan reinstall semua deps
- Rollback aman jika deploy gagal
File .github/workflows/deploy.yml
name: Build & Deploy
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'npm'
- run: npm ci
- name: Type check
run: npx astro check
- name: Build
run: npm run build
- name: Pack dist
run: tar --exclude='._*' -czf dist.tar.gz -C dist .
- uses: actions/upload-artifact@v4
with:
name: dist
path: dist.tar.gz
retention-days: 7
deploy:
needs: build
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
name: dist
- name: Deploy via SSH
uses: appleboy/[email protected]
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_SSH_KEY }}
source: dist.tar.gz
target: /tmp/
- name: Atomic swap
uses: appleboy/[email protected]
with:
host: ${{ secrets.DEPLOY_HOST }}
username: ${{ secrets.DEPLOY_USER }}
key: ${{ secrets.DEPLOY_SSH_KEY }}
script: |
set -euo pipefail
STAGE=/var/www/site/staging
mkdir -p "$STAGE"
find "$STAGE" -mindepth 1 -delete 2>/dev/null
tar -xzf /tmp/dist.tar.gz -C "$STAGE"
mv /var/www/site/dist /var/www/site/dist.old
mv "$STAGE" /var/www/site/dist
chown -R www-data:www-data /var/www/site/dist
find /var/www/site/dist.old -mindepth 1 -delete
rmdir /var/www/site/dist.old
rm /tmp/dist.tar.gz
Setup secrets
Repo Settings → Secrets and variables → Actions:
DEPLOY_HOST— IP serverDEPLOY_USER— biasanyarootataudeployDEPLOY_SSH_KEY— isi~/.ssh/id_ed25519(private key)
Generate key khusus deploy:
ssh-keygen -t ed25519 -f deploy_key -C "github-deploy"
ssh-copy-id -i deploy_key.pub root@your-server
cat deploy_key # paste ke secret DEPLOY_SSH_KEY
Tips agar build cepat
- Cache
~/.npm—cache: 'npm'di setup-node. - Cache Astro
.astrofolder — pakaiactions/cache@v4dengan key dariastro.config.mjshash. - Pisah job — build dan deploy bisa pararel kalau ada lebih dari satu env.
- Skip CI untuk doc-only commit dengan
[skip ci]di message.
Rollback strategy
dist.old di server adalah versi sebelumnya. Kalau deploy baru bermasalah:
ssh server
mv /var/www/site/dist /var/www/site/dist.broken
mv /var/www/site/dist.old /var/www/site/dist
Setup script rollback.sh untuk one-liner:
#!/bin/bash
set -e
mv /var/www/site/dist /var/www/site/dist.broken
mv /var/www/site/dist.old /var/www/site/dist
echo "Rolled back."