Timed jobs move from in-process timers to a job registry run by pg-boss: once per schedule across processes, retries, run history, cron schedules in the church timezone, and an admin Background jobs page with Run now. Playwright end-to-end tests run against their own seeded database. A Gitea Actions workflow runs backend tests, frontend checks and the e2e tests, and deploys v* tags with scripts/deploy.sh once secrets are set. Also fixes the at-the-door check-in count for multi-day tickets. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
130 lines
4.1 KiB
YAML
130 lines
4.1 KiB
YAML
# Checks every push and pull request: backend tests, frontend lint/typecheck/build, and
|
|
# the Playwright end-to-end tests. Pushing a version tag (v1.2.3) also deploys, once the
|
|
# DEPLOY_* secrets are set (Repository → Settings → Actions → Secrets).
|
|
#
|
|
# Needs a Gitea Actions runner with the "ubuntu-latest" label (Docker), e.g. act_runner:
|
|
# https://docs.gitea.com/usage/actions/act-runner
|
|
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches: ["**"]
|
|
tags: ["v*"]
|
|
pull_request:
|
|
|
|
env:
|
|
NODE_VERSION: "20"
|
|
# Throwaway values for the test database and tokens — never production secrets.
|
|
JWT_SECRET: ci-only-jwt-secret-not-for-production
|
|
DATABASE_URL: postgresql://postgres:postgres@postgres:5432/events_ci
|
|
E2E_DATABASE_URL: postgresql://postgres:postgres@postgres:5432/events_ci_e2e
|
|
|
|
jobs:
|
|
backend:
|
|
name: Backend tests
|
|
runs-on: ubuntu-latest
|
|
services:
|
|
postgres:
|
|
image: postgres:16
|
|
env:
|
|
POSTGRES_PASSWORD: postgres
|
|
POSTGRES_DB: events_ci
|
|
options: >-
|
|
--health-cmd "pg_isready -U postgres" --health-interval 5s --health-timeout 5s --health-retries 10
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
cache: npm
|
|
cache-dependency-path: backend/package-lock.json
|
|
- run: npm ci
|
|
working-directory: backend
|
|
- name: Migrations apply cleanly
|
|
run: npx prisma migrate deploy
|
|
working-directory: backend
|
|
- run: npm test
|
|
working-directory: backend
|
|
|
|
frontend:
|
|
name: Frontend lint, typecheck, build
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
cache: npm
|
|
cache-dependency-path: frontend/package-lock.json
|
|
- run: npm ci
|
|
working-directory: frontend
|
|
- run: npx eslint src
|
|
working-directory: frontend
|
|
- run: npx tsc --noEmit -p .
|
|
working-directory: frontend
|
|
- run: npm run build
|
|
working-directory: frontend
|
|
env:
|
|
NEXT_PUBLIC_API_URL: http://localhost:5000
|
|
NEXT_TELEMETRY_DISABLED: "1"
|
|
|
|
e2e:
|
|
name: End-to-end tests
|
|
runs-on: ubuntu-latest
|
|
needs: [backend, frontend]
|
|
services:
|
|
postgres:
|
|
image: postgres:16
|
|
env:
|
|
POSTGRES_PASSWORD: postgres
|
|
POSTGRES_DB: events_ci
|
|
options: >-
|
|
--health-cmd "pg_isready -U postgres" --health-interval 5s --health-timeout 5s --health-retries 10
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ env.NODE_VERSION }}
|
|
- run: npm ci
|
|
- run: npm ci
|
|
working-directory: backend
|
|
- run: npm ci
|
|
working-directory: frontend
|
|
- run: npx playwright install --with-deps chromium
|
|
- run: npx playwright test
|
|
env:
|
|
CI: "true"
|
|
- name: Keep the report when tests fail
|
|
if: failure()
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: playwright-report
|
|
path: |
|
|
e2e/report
|
|
e2e/test-results
|
|
retention-days: 7
|
|
|
|
deploy:
|
|
name: Deploy tagged release
|
|
runs-on: ubuntu-latest
|
|
needs: [backend, frontend, e2e]
|
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
steps:
|
|
- name: Deploy over SSH (skipped until DEPLOY_HOST is set)
|
|
env:
|
|
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
|
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
|
|
DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
|
|
DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }}
|
|
TAG: ${{ github.ref_name }}
|
|
run: |
|
|
if [ -z "$DEPLOY_HOST" ]; then
|
|
echo "DEPLOY_HOST isn't set — skipping the deploy."
|
|
exit 0
|
|
fi
|
|
mkdir -p ~/.ssh
|
|
echo "$DEPLOY_SSH_KEY" > ~/.ssh/deploy_key
|
|
chmod 600 ~/.ssh/deploy_key
|
|
ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=accept-new "$DEPLOY_USER@$DEPLOY_HOST" \
|
|
"cd '${DEPLOY_PATH:-~/hope-events}' && bash scripts/deploy.sh '$TAG'"
|