# 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'"