wrolpi/.github/workflows/cypress.yml
lrnselfreliance bcbc42632d
Remove CircleCI (#796)
GitHub Actions runs every job CircleCI did (#789), so CircleCI only
duplicated them.  The README badge now shows the backend tests on master.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 17:19:38 -06:00

121 lines
3.3 KiB
YAML

name: Cypress Tests
on:
push:
branches: [master, feature/*]
pull_request:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
# Component specs live under `src/`, so they need `cypress run --component`; the e2e job's
# `cypress run` will not match them. Cypress starts its own dev server, so no `npm start`.
cypress-component-tests:
runs-on: ubuntu-latest
defaults:
run:
working-directory: app
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20.19'
cache: 'npm'
cache-dependency-path: app/package-lock.json
# The Cypress binary lives outside node_modules, and setup-node only caches ~/.npm. Key it
# on the lockfile so a Cypress bump fetches the matching binary.
- name: Cache Cypress binary
uses: actions/cache@v4
with:
path: ~/.cache/Cypress
key: cypress-${{ runner.os }}-${{ hashFiles('app/package-lock.json') }}
- name: Install dependencies
run: npm install
# A no-op when the cached binary matches.
- name: Install Cypress binary
run: npx cypress install
- name: Run Cypress component tests
run: npx cypress run --component
- name: Upload screenshots
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: cypress-component-screenshots
path: app/cypress/screenshots
retention-days: 14
# Waiting for `npm start` to serve the app also checks that the dev server starts.
cypress-e2e-tests:
runs-on: ubuntu-latest
defaults:
run:
working-directory: app
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20.19'
cache: 'npm'
cache-dependency-path: app/package-lock.json
- name: Cache Cypress binary
uses: actions/cache@v4
with:
path: ~/.cache/Cypress
key: cypress-${{ runner.os }}-${{ hashFiles('app/package-lock.json') }}
- name: Install dependencies
run: npm install
- name: Install Cypress binary
run: npx cypress install
# GitHub Actions sets `CI=true`, which makes cypress.config.js use http://localhost:3000 as
# the base URL.
- name: Start React app
env:
DISABLE_ESLINT_PLUGIN: 'true'
BROWSER: none
run: |
nohup npm start > react.log 2>&1 &
for i in $(seq 1 90); do
if curl -sf http://localhost:3000/manifest.json > /dev/null; then
echo "React app is ready"
exit 0
fi
sleep 2
done
echo "React app failed to start"
cat react.log
exit 1
- name: Run Cypress e2e tests
run: npx cypress run
- name: Upload videos and screenshots
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: cypress-e2e-media
path: |
app/cypress/videos
app/cypress/screenshots
retention-days: 14
if-no-files-found: ignore