Bitbucket Pipelines
What you'll learn​
- How to set up Bitbucket Pipelines to run Cypress tests
- How to cache dependencies and build artifacts
- How to parallelize Cypress tests with Bitbucket Pipelines
- How to use Cypress Cloud with Bitbucket Pipelines
Basic Setup​
Detailed documentation is available in the Bitbucket Pipelines Documentation.
Bitbucket runs most builds in Docker containers as described in Docker image options.
If you use the currently available default Bitbucket / Atlassian Linux images listed in the "Default build environment" of the Bitbucket Cloud documentation Use Docker images as build environments you must additionally install Cypress Linux prerequisites.
For a simpler setup, use a Cypress Docker image, as described in the following section.
Testing with Cypress Docker Images​
The Cypress team maintains the official
Docker Images for running
Cypress locally and in CI, with some images including Chrome, Firefox and Edge. For
example, this allows us to run the tests in Firefox by passing the
--browser firefox
attribute to cypress run
.
Read about Cypress Docker variants to decide which image is best for your project.
image: cypress/browsers:22.12.0
pipelines:
default:
- step:
script:
# install dependencies
- npm ci
# start the server in the background
- npm run start &
# run Cypress tests in Firefox
- npx cypress run --browser firefox
How this bitbucket-pipelines.yml
works:
- On push to this repository, this job will provision and start Bitbucket
Pipelines using the Cypress Docker image. It will run the pipelines defined in the
pipelines
section of the configuration. - The code is checked out from the Bitbucket repository.
- Finally, our scripts will:
- Install npm dependencies
- Start the project web server (
npm start
) - Run the Cypress tests within the Bitbucket repository using Firefox
Caching Dependencies and Build Artifacts​
Per the Caches documentation, Bitbucket offers options for caching dependencies and build artifacts across many different workflows.
To cache node_modules
, the npm cache across builds, the cache
attribute and
configuration has been added below.
Artifacts from a job can be defined by providing paths to the artifacts
attribute.
image: cypress/browsers:22.12.0
pipelines:
default:
- step:
caches:
- node
script:
# install dependencies
- npm ci
# start the server in the background
- npm run start &
# run Cypress tests in Firefox
- npx cypress run --browser firefox
artifacts:
# store any generates images and videos as artifacts
- cypress/screenshots/**
- cypress/videos/**
Using the definitions block we can define additional caches for npm and Cypress.
definitions:
caches:
npm: $HOME/.npm
cypress: $HOME/.cache/Cypress
Parallelization​
Cypress Cloud offers the ability to parallelize and group test runs along with additional insights and analytics for Cypress tests.
Before diving into an example of a parallelization setup, it is important to understand the two different types of jobs that we will declare:
- Install Job: A job that installs and caches dependencies that will be used by subsequent jobs later in the Bitbucket Pipelines workflow.
- Worker Job: A job that handles execution of Cypress tests and depends on the install job.
Install Job​
The separation of installation from test running is necessary when running parallel jobs. It allows for reuse of various build steps aided by caching.
First, we break the pipeline up into reusable chunks of configuration using a
YAML anchor,
&e2e
. This will be used by the worker jobs.
The following configuration using the --parallel
and --record
flags to
cypress run requires setting up
recording test results to Cypress Cloud.
image: cypress/base:22.12.0
## job definition for running E2E tests in parallel
e2e: &e2e
name: E2E tests
caches:
- node
- cypress
script:
- npm run start &
- npm run e2e:record -- --parallel --group UI-Chrome --ci-build-id $BITBUCKET_BUILD_NUMBER
artifacts:
# store any generates images and videos as artifacts
- cypress/screenshots/**
- cypress/videos/**
Worker Jobs​
Next, the worker jobs under pipelines
that will run Cypress tests with Chrome
in parallel.
We can use the e2e
YAML anchor
in our definition of the pipeline to execute parallel jobs using the parallel
attribute. This will allow us to run multiples instances of Cypress at same
time.
## job definition for running E2E tests in parallel
## ...
pipelines:
default:
- step:
name: Install dependencies
caches:
- npm
- cypress
- node
script:
- npm ci
- parallel:
# run N steps in parallel
- step:
<<: *e2e
- step:
<<: *e2e
- step:
<<: *e2e
definitions:
caches:
npm: $HOME/.npm
cypress: $HOME/.cache/Cypress
The complete bitbucket-pipelines.yml
is below:
image: cypress/base:22.12.0
## job definition for running E2E tests in parallel
e2e: &e2e
name: E2E tests
caches:
- node
- cypress
script:
- npm run start &
- npm run e2e:record -- --parallel --group UI-Chrome --ci-build-id $BITBUCKET_BUILD_NUMBER
artifacts:
# store any generates images and videos as artifacts
- cypress/screenshots/**
- cypress/videos/**
pipelines:
default:
- step:
name: Install dependencies
caches:
- npm
- cypress
- node
script:
- npm ci
- parallel:
# run N steps in parallel
- step:
<<: *e2e
- step:
<<: *e2e
- step:
<<: *e2e
definitions:
caches:
npm: $HOME/.npm
cypress: $HOME/.cache/Cypress
Using Cypress Cloud with Bitbucket Pipelines​
In the Bitbucket Pipelines configuration we have defined in the previous section, we are leveraging three useful features of Cypress Cloud:
-
Recording test results with the
--record
flag to Cypress Cloud.- In-depth and shareable test reports.
- Visibility into test failures via quick access to Test Replay, error messages, stack traces, screenshots, videos, and contextual details.
- Integrating testing with the pull-request (PR) process via commit status check guards and convenient test report comments.
- Detecting flaky tests and surfacing them via Slack alerts or GitHub PR status checks.
-
Parallelizing test runs and optimizing their execution via intelligent load-balancing of test specs across CI machines with the
--parallel
flag. -
Organizing and consolidating multiple
cypress run
calls by labeled groups into a single report within Cypress Cloud. In the example above we use the--group UI-Chrome
flag to organize all UI tests for the Chrome browser into a group labeled "UI-Chrome" inside the Cypress Cloud report.