CI/CD & GitHub Actions
Overzicht workflows
Section titled “Overzicht workflows”| Workflow | Bestand | Trigger | Doel |
|---|---|---|---|
| Deploy App | deploy-web.yml | Push naar main (apps/web) | Build + deploy Vite SPA naar CF Pages |
| Deploy API | deploy-api.yml | Push naar main (apps/api) | Deploy Hono API naar CF Workers |
| Deploy Docs | deploy-docs.yml | Push naar main (apps/docs) | Build + deploy Starlight naar CF Pages |
| CI Check | ci.yml | Pull Request | Lint, typecheck, build check |
GitHub Secrets
Section titled “GitHub Secrets”Stel deze in via GitHub → Repository → Settings → Secrets and variables → Actions:
CLOUDFLARE_API_TOKEN ← Cloudflare API token met Pages:Edit + Workers:Edit rechtenCLOUDFLARE_ACCOUNT_ID ← Cloudflare account IDSUPABASE_URL ← Supabase project URLSUPABASE_ANON_KEY ← Supabase anon key (publiek, voor app build)API_URL ← API URL (https://api.[domein].com)Workflow: CI Check
Section titled “Workflow: CI Check”name: CI
on: pull_request: branches: - main - develop
jobs: check: runs-on: ubuntu-latest name: Lint, Typecheck & Build
steps: - name: Checkout uses: actions/checkout@v4
- name: Setup pnpm uses: pnpm/action-setup@v4
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'pnpm'
- name: Install dependencies run: pnpm install --frozen-lockfile
- name: Typecheck run: pnpm typecheck
- name: Lint run: pnpm lint
- name: Build run: pnpm buildWorkflow: Deploy App
Section titled “Workflow: Deploy App”name: Deploy App
on: push: branches: - main - develop paths: - 'apps/web/**' - 'packages/shared/**'
jobs: deploy: runs-on: ubuntu-latest name: Deploy Vite SPA naar Cloudflare Pages
steps: - name: Checkout uses: actions/checkout@v4
- name: Setup pnpm uses: pnpm/action-setup@v4
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'pnpm'
- name: Install dependencies run: pnpm install --frozen-lockfile
- name: Build run: pnpm --filter @doghotel/web build env: VITE_SUPABASE_URL: ${{ secrets.SUPABASE_URL }} VITE_SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }} VITE_API_URL: ${{ secrets.API_URL }}
- name: Deploy naar Cloudflare Pages uses: cloudflare/pages-action@v1 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} projectName: doghotel-app directory: apps/web/dist gitHubToken: ${{ secrets.GITHUB_TOKEN }} branch: ${{ github.ref_name }}Workflow: Deploy API
Section titled “Workflow: Deploy API”name: Deploy API
on: push: branches: - main paths: - 'apps/api/**' - 'packages/shared/**'
jobs: deploy: runs-on: ubuntu-latest name: Deploy Hono API naar Cloudflare Workers
steps: - name: Checkout uses: actions/checkout@v4
- name: Setup pnpm uses: pnpm/action-setup@v4
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'pnpm'
- name: Install dependencies run: pnpm install --frozen-lockfile
- name: Deploy naar Cloudflare Workers run: pnpm --filter @doghotel/api deploy env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}Workflow: Deploy Docs
Section titled “Workflow: Deploy Docs”name: Deploy Docs
on: push: branches: - main paths: - 'apps/docs/**'
jobs: deploy: runs-on: ubuntu-latest name: Deploy Starlight docs
steps: - name: Checkout uses: actions/checkout@v4
- name: Setup pnpm uses: pnpm/action-setup@v4
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'pnpm'
- name: Install dependencies run: pnpm install --frozen-lockfile
- name: Build run: pnpm --filter @doghotel/docs build
- name: Deploy naar Cloudflare Pages uses: cloudflare/pages-action@v1 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} projectName: doghotel-docs directory: apps/docs/dist gitHubToken: ${{ secrets.GITHUB_TOKEN }}Deploy overzicht
Section titled “Deploy overzicht”Developer pusht naar develop → CI workflow draait (lint + typecheck + build) → Bij succes: deploy app naar preview omgeving
Pull Request naar main → CI workflow draait → Review + merge
Push naar main → Deploy app naar productie (Pages) → Deploy API naar productie (Workers) → Deploy docs naar productie (Pages) (alleen als relevante paths gewijzigd zijn)