name: Test on: push: branches: [main] pull_request: branches: [main] jobs: vitest: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm - run: npm ci - run: npm run test:run playwright: runs-on: ubuntu-latest needs: vitest env: MONGODB_URI: mongodb://mongo-ci:27017/ghostguild-test JWT_SECRET: ci-test-jwt-secret RESEND_API_KEY: re_ci_dummy_not_used HELCIM_API_TOKEN: helcim_ci_dummy_not_used OIDC_COOKIE_SECRET: ci-oidc-cookie-secret-not-secret NUXT_PUBLIC_COMING_SOON: 'false' NODE_ENV: development ALLOW_DEV_TEST_ENDPOINTS: 'true' steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm - run: npm ci - run: npx playwright install --with-deps chromium - name: Start MongoDB run: | docker rm -f mongo-ci 2>/dev/null || true docker run -d --name mongo-ci mongo:7 # Forgejo runs each job inside its own container; attach Mongo to # that container's network so MONGODB_URI=mongodb://mongo-ci:27017 # resolves from inside the runner. RUNNER_NET=$(docker inspect "$HOSTNAME" --format '{{range $k,$v := .NetworkSettings.Networks}}{{$k}} {{end}}' | awk '{print $1}') docker network connect "$RUNNER_NET" mongo-ci docker ps - name: Wait for MongoDB run: timeout 30 sh -c 'until docker exec mongo-ci mongosh --quiet --eval "1" >/dev/null 2>&1; do sleep 1; done' - name: MongoDB log on failure if: failure() run: docker logs mongo-ci || true - run: npm run build - name: Start server run: node .output/server/index.mjs > /tmp/server.log 2>&1 & env: PORT: 3000 - name: Wait for server run: timeout 30 sh -c 'until curl -sf http://localhost:3000; do sleep 1; done' - name: Server log on failure if: failure() run: cat /tmp/server.log || true - run: npx playwright test --ignore-snapshots - uses: actions/upload-artifact@v3 if: failure() with: name: playwright-report path: | playwright-report/ e2e/test-results/ retention-days: 7 notify: name: Notify on failure runs-on: ubuntu-latest needs: [vitest, playwright] if: failure() steps: - name: Post to Slack run: | curl -s -X POST "${{ secrets.SLACK_WEBHOOK_URL }}" \ -H 'Content-type: application/json' \ --data "{\"text\":\":x: *Ghost Guild CI failed* on \`${{ github.ref_name }}\`\nCommit: ${{ github.sha }}\n${{ github.server_url }}/${{ github.repository }}/actions\"}" visual: runs-on: ubuntu-latest needs: vitest continue-on-error: true env: MONGODB_URI: mongodb://mongo-ci:27017/ghostguild-test JWT_SECRET: ci-test-jwt-secret RESEND_API_KEY: re_ci_dummy_not_used HELCIM_API_TOKEN: helcim_ci_dummy_not_used OIDC_COOKIE_SECRET: ci-oidc-cookie-secret-not-secret NUXT_PUBLIC_COMING_SOON: 'false' NODE_ENV: development ALLOW_DEV_TEST_ENDPOINTS: 'true' steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm - run: npm ci - run: npx playwright install --with-deps chromium - name: Start MongoDB run: | docker rm -f mongo-ci 2>/dev/null || true docker run -d --name mongo-ci mongo:7 # Forgejo runs each job inside its own container; attach Mongo to # that container's network so MONGODB_URI=mongodb://mongo-ci:27017 # resolves from inside the runner. RUNNER_NET=$(docker inspect "$HOSTNAME" --format '{{range $k,$v := .NetworkSettings.Networks}}{{$k}} {{end}}' | awk '{print $1}') docker network connect "$RUNNER_NET" mongo-ci docker ps - name: Wait for MongoDB run: timeout 30 sh -c 'until docker exec mongo-ci mongosh --quiet --eval "1" >/dev/null 2>&1; do sleep 1; done' - name: MongoDB log on failure if: failure() run: docker logs mongo-ci || true - run: npm run build - name: Start server run: node .output/server/index.mjs > /tmp/server.log 2>&1 & env: PORT: 3000 - name: Wait for server run: timeout 30 sh -c 'until curl -sf http://localhost:3000; do sleep 1; done' - name: Server log on failure if: failure() run: cat /tmp/server.log || true - run: npx playwright test e2e/visual/ - uses: actions/upload-artifact@v3 if: failure() with: name: visual-diffs path: e2e/test-results/ retention-days: 7