Lewati ke konten
Kembali ke blog
Tim Lancartech 1 menit baca

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.

Setup CI/CD untuk Astro / Next.js dengan GitHub Actions

Tujuan workflow

  1. Setiap push ke main → auto-deploy ke production
  2. PR → run lint + test + preview build
  3. Deploy hemat: pakai cache, jangan reinstall semua deps
  4. 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 server
  • DEPLOY_USER — biasanya root atau deploy
  • DEPLOY_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

  1. Cache ~/.npmcache: 'npm' di setup-node.
  2. Cache Astro .astro folder — pakai actions/cache@v4 dengan key dari astro.config.mjs hash.
  3. Pisah job — build dan deploy bisa pararel kalau ada lebih dari satu env.
  4. 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."

Setup CI/CD untuk team Anda.

Tim Lancartech · · 1 menit baca

Siap mulai proyek berikutnya?

Konsultasi awal gratis — kami bantu rancang strategi digital yang paling cocok untuk bisnis Anda.