GitHub Action
Cypress.io
GitHub Action for running Cypress end-to-end tests
name: End-to-end tests
on: [push]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
# Install NPM dependencies, cache them correctly
# and run all Cypress tests
- name: Cypress run
uses: cypress-io/github-action@v1
Specify the browser name or path with browser
parameter
name: E2E on Chrome
on: [push]
jobs:
cypress-run:
runs-on: ubuntu-latest
# let's make sure our tests pass on Chrome browser
name: E2E on Chrome
steps:
- uses: actions/checkout@v1
- uses: cypress-io/github-action@v1
with:
browser: chrome
name: Cypress tests
on: [push]
jobs:
cypress-run:
name: Cypress run
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Cypress run
uses: cypress-io/github-action@v1
with:
record: true
env:
# pass the Dashboard record key as an environment variable
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
You can spin multiple containers running in parallel using strategy: matrix
argument. Just add more dummy items to the containers: [1, 2, ...]
array to spin more free or paid containers. Then use record
and parallel
parameters to load balance tests
name: Parallel Cypress Tests
on: [push]
jobs:
test:
name: Cypress run
runs-on: ubuntu-latest
strategy:
matrix:
# run 3 copies of the current job in parallel
containers: [1, 2, 3]
steps:
- name: Checkout
uses: actions/checkout@v1
# because of "record" and "parallel" parameters
# these containers will load balance all found tests among themselves
- name: Cypress run
uses: cypress-io/github-action@v1
with:
record: true
parallel: true
group: 'Actions example'
env:
# pass the Dashboard record key as an environment variable
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
You can run a build step before starting tests
name: Build
on: [push]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Cypress run
uses: cypress-io/github-action@v1
with:
build: npm run build
If your tests run against a local server, use start
parameter, the server will run in the background and will shut down after tests complete
name: With server
on: [push]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Cypress run
uses: cypress-io/github-action@v1
with:
start: npm start
Note: sometimes on Windows you need to run a different start command. You can use start-windows
parameter for this
name: With server
on: [push]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Cypress run
uses: cypress-io/github-action@v1
with:
# Linux and MacOS
start: npm start
# Takes precedences on Windows
start-windows: npm run start:windows:server
If you are starting a local server and it takes a while to start, you can add a parameter wait-on
and pass url to wait for the server to respond. Uses wait-on under the hood.
name: After server responds
on: [push]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Cypress run
uses: cypress-io/github-action@v1
with:
start: npm start
wait-on: http://localhost:8080
In a monorepo, the end-to-end test might be placed in a different sub-folder from the application itself, like this
repo/
app/
e2e/
cypress
cypress.json
package.json
You can specify the e2e
working directory when running Cypress tests using working-directory
parameter
on: [push]
jobs:
cypress-run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: cypress-io/github-action@v1
with:
start: npm start
working-directory: e2e
See cypress-gh-action-monorepo for a running example
Sometimes the default cache key does not work. For example, if you cannot share the Node modules across Node versions due to native extensions. In that case pass your own cache-key
parameter.
name: End-to-end tests
on: [push]
jobs:
cypress-run:
runs-on: ubuntu-latest
# let's make sure our "app" works on several versions of Node
strategy:
matrix:
node: [10, 12]
name: E2E on Node v${{ matrix.node }}
steps:
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node }}
- name: Checkout
uses: actions/checkout@v1
# run Cypress tests and record them under the same run
# associated with commit SHA and just give a different group name
- name: Cypress run
uses: cypress-io/github-action@v1
with:
record: true
group: Tests on Node v${{ matrix.node }}
cache-key: node-v${{ matrix.node }}-on-${{ runner.os }}-hash-${{ hashFiles('yarn.lock') }}
env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
Sometimes you may want to run additional commands between installation and tests. To enable this use the install
and runTests
parameters.
name: E2E
on: push
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Install dependencies
uses: cypress-io/github-action@v1
with:
# just perform install
runTests: false
- run: yarn lint
- name: Run e2e tests
uses: cypress-io/github-action@v1
with:
# we have already installed all dependencies above
install: false
# Cypress tests and config file are in "e2e" folder
working-directory: e2e
See cypress-gh-action-monorepo for working example.
Name | Description |
---|---|
cypress-gh-action-example | Uses Yarn, and runs in parallel on several versions of Node, also different browsers |
cypress-gh-action-monorepo | splits install and running tests commands, runs Cypress from sub-folder |
This action installs local dependencies using lock files. If yarn.lock
file is found, the install uses yarn --frozen-lockfile
command. Otherwise it expects to find package-lock.json
and install using npm ci
command.
You can see verbose messages from GitHub Actions by setting the following secrets (from Debugging Actions Guide)
ACTIONS_RUNNER_DEBUG: true
ACTIONS_STEP_DEBUG: true
- Building actions docs