2019-09-04 21:01:54 +05:30
---
2020-07-28 23:09:34 +05:30
stage: Verify
group: Testing
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers
2019-09-04 21:01:54 +05:30
type: reference, howto
---
2019-09-30 21:07:59 +05:30
# Browser Performance Testing **(PREMIUM)**
2019-07-31 22:56:46 +05:30
2020-03-13 15:44:24 +05:30
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/3507) in [GitLab Premium](https://about.gitlab.com/pricing/) 10.3.
2019-07-31 22:56:46 +05:30
2020-05-24 23:13:21 +05:30
If your application offers a web interface and you're using
2020-07-28 23:09:34 +05:30
[GitLab CI/CD ](../../../ci/README.md ), you can quickly determine the rendering performance
impact of pending code changes in the browser.
2019-07-31 22:56:46 +05:30
2019-09-04 21:01:54 +05:30
## Overview
2019-07-31 22:56:46 +05:30
GitLab uses [Sitespeed.io ](https://www.sitespeed.io ), a free and open source
2020-07-28 23:09:34 +05:30
tool, for measuring the rendering performance of web sites. The
[Sitespeed plugin ](https://gitlab.com/gitlab-org/gl-performance ) that GitLab built outputs
the performance score for each page analyzed in a file called `browser-performance.json`
this data can be shown on Merge Requests.
2019-07-31 22:56:46 +05:30
## Use cases
2020-05-24 23:13:21 +05:30
Consider the following workflow:
2019-07-31 22:56:46 +05:30
2019-12-04 20:38:33 +05:30
1. A member of the marketing team is attempting to track engagement by adding a new tool.
1. With browser performance metrics, they see how their changes are impacting the usability
of the page for end users.
2020-05-24 23:13:21 +05:30
1. The metrics show that after their changes, the performance score of the page has gone down.
1. When looking at the detailed report, they see the new JavaScript library was
included in `<head>` , which affects loading page speed.
1. They ask for help from a front end developer, who sets the library to load asynchronously.
1. The frontend developer approves the merge request, and authorizes its deployment to production.
2019-07-31 22:56:46 +05:30
2020-05-24 23:13:21 +05:30
## How browser performance testing works
2019-07-31 22:56:46 +05:30
2020-05-24 23:13:21 +05:30
First, define a job in your `.gitlab-ci.yml` file that generates the
2020-07-28 23:09:34 +05:30
[Browser Performance report artifact ](../../../ci/pipelines/job_artifacts.md#artifactsreportsperformance-premium ).
2019-07-31 22:56:46 +05:30
GitLab then checks this report, compares key performance metrics for each page
2020-05-24 23:13:21 +05:30
between the source and target branches, and shows the information in the merge request.
For an example Performance job, see
[Configuring Browser Performance Testing ](#configuring-browser-performance-testing ).
2019-07-31 22:56:46 +05:30
2019-12-04 20:38:33 +05:30
NOTE: **Note:**
2020-07-28 23:09:34 +05:30
If the Browser Performance report has no data to compare, such as when you add the
Browser Performance job in your `.gitlab-ci.yml` for the very first time,
the Browser Performance report widget won't show. It must have run at least
once on the target branch (`master`, for example), before it will display in a
merge request targeting that branch.
2019-07-31 22:56:46 +05:30
2020-07-28 23:09:34 +05:30
![Browser Performance Widget ](img/browser_performance_testing.png )
2019-09-04 21:01:54 +05:30
2019-12-04 20:38:33 +05:30
## Configuring Browser Performance Testing
This example shows how to run the [sitespeed.io container ](https://hub.docker.com/r/sitespeedio/sitespeed.io/ )
on your code by using GitLab CI/CD and [sitespeed.io ](https://www.sitespeed.io )
using Docker-in-Docker.
2020-05-24 23:13:21 +05:30
1. First, set up GitLab Runner with a
2020-06-23 00:09:42 +05:30
[Docker-in-Docker build ](../../../ci/docker/using_docker_build.md#use-docker-in-docker-workflow-with-docker-executor ).
2020-07-28 23:09:34 +05:30
1. Configure the default Browser Performance Testing CI job as follows in your `.gitlab-ci.yml` file:
2019-12-21 20:55:43 +05:30
2020-05-24 23:13:21 +05:30
```yaml
include:
template: Verify/Browser-Performance.gitlab-ci.yml
2019-12-04 20:38:33 +05:30
2020-05-24 23:13:21 +05:30
performance:
variables:
URL: https://example.com
```
2019-12-21 20:55:43 +05:30
2020-07-28 23:09:34 +05:30
NOTE: **Note:**
For versions before 12.4, see the information for [older GitLab versions ](#gitlab-versions-123-and-older ).
If you are using a Kubernetes cluster, use [`template: Jobs/Browser-Performance-Testing.gitlab-ci.yml` ](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/Browser-Performance-Testing.gitlab-ci.yml )
instead.
2019-12-21 20:55:43 +05:30
2020-05-24 23:13:21 +05:30
The above example creates a `performance` job in your CI/CD pipeline and runs
2019-12-04 20:38:33 +05:30
sitespeed.io against the webpage you defined in `URL` to gather key metrics.
2020-07-28 23:09:34 +05:30
The example uses a CI/CD template that is included in all GitLab installations since
12.4, but it will not work with Kubernetes clusters. If you are using GitLab 12.3
or older, you must [add the configuration manually ](#gitlab-versions-123-and-older )
The template uses the [GitLab plugin for sitespeed.io ](https://gitlab.com/gitlab-org/gl-performance ),
and it saves the full HTML sitespeed.io report as a [Browser Performance report artifact ](../../../ci/pipelines/job_artifacts.md#artifactsreportsperformance-premium )
that you can later download and analyze. This implementation always takes the latest
Browser Performance artifact available. If [GitLab Pages ](../pages/index.md ) is enabled,
you can view the report directly in your browser.
You can also customize the jobs with environment variables:
- `SITESPEED_IMAGE` : Configure the Docker image to use for the job (default `sitespeedio/sitespeed.io` ), but not the image version.
- `SITESPEED_VERSION` : Configure the version of the Docker image to use for the job (default `13.3.0` ).
- `SITESPEED_OPTIONS` : Configure any additional sitespeed.io options as required (default `nil` ). Refer to the [sitespeed.io documentation ](https://www.sitespeed.io/documentation/sitespeed.io/configuration/ ) for more details.
2019-12-04 20:38:33 +05:30
2020-05-24 23:13:21 +05:30
For example, you can override the number of runs sitespeed.io
2020-07-28 23:09:34 +05:30
makes on the given URL, and change the version:
2019-12-21 20:55:43 +05:30
```yaml
include:
template: Verify/Browser-Performance.gitlab-ci.yml
performance:
variables:
2020-07-28 23:09:34 +05:30
URL: https://www.sitespeed.io/
SITESPEED_VERSION: 13.2.0
2019-12-21 20:55:43 +05:30
SITESPEED_OPTIONS: -n 5
```
2020-05-24 23:13:21 +05:30
### Configuring degradation threshold
2020-06-23 00:09:42 +05:30
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/27599) in GitLab 13.0.
2020-05-24 23:13:21 +05:30
You can configure the sensitivity of degradation alerts to avoid getting alerts for minor drops in metrics.
This is done by setting the `DEGRADATION_THRESHOLD` variable. In the example below, the alert will only show up
if the `Total Score` metric degrades by 5 points or more:
```yaml
include:
template: Verify/Browser-Performance.gitlab-ci.yml
performance:
variables:
URL: https://example.com
DEGRADATION_THRESHOLD: 5
```
The `Total Score` metric is based on sitespeed.io's [coach performance score ](https://www.sitespeed.io/documentation/sitespeed.io/metrics/#performance-score ). There is more information in [the coach documentation ](https://www.sitespeed.io/documentation/coach/how-to/#what-do-the-coach-do ).
2019-12-04 20:38:33 +05:30
### Performance testing on Review Apps
2020-05-24 23:13:21 +05:30
The above CI YAML configuration is great for testing against static environments, and it can
be extended for dynamic environments, but a few extra steps are required:
2019-12-04 20:38:33 +05:30
1. The `performance` job should run after the dynamic environment has started.
2020-07-28 23:09:34 +05:30
1. In the `review` job:
1. Generate a URL list file with the dynamic URL.
1. Save the file as an artifact, for example with `echo $CI_ENVIRONMENT_URL > environment_url.txt`
in your job's `script` .
1. Pass the list as the URL environment variable (which can be a URL or a file containing URLs)
to the `performance` job.
2019-12-04 20:38:33 +05:30
1. You can now run the sitespeed.io container against the desired hostname and
paths.
Your `.gitlab-ci.yml` file would look like:
```yaml
stages:
- deploy
- performance
2019-12-21 20:55:43 +05:30
include:
template: Verify/Browser-Performance.gitlab-ci.yml
2019-12-04 20:38:33 +05:30
review:
stage: deploy
environment:
name: review/$CI_COMMIT_REF_SLUG
url: http://$CI_COMMIT_REF_SLUG.$APPS_DOMAIN
script:
- run_deploy_script
- echo $CI_ENVIRONMENT_URL > environment_url.txt
artifacts:
paths:
- environment_url.txt
only:
- branches
except:
- master
performance:
dependencies:
- review
2020-07-28 23:09:34 +05:30
variables:
URL: environment_url.txt
2019-12-04 20:38:33 +05:30
```
2020-07-28 23:09:34 +05:30
### GitLab versions 12.3 and older
2019-12-04 20:38:33 +05:30
2020-07-28 23:09:34 +05:30
Browser Performance Testing has gone through several changes since it's introduction.
In this section we'll detail these changes and how you can run the test based on your
GitLab version:
2019-12-04 20:38:33 +05:30
2020-07-28 23:09:34 +05:30
- In GitLab 12.4 [a job template was made available ](https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml ).
- In 13.2 the feature was renamed from `Performance` to `Browser Performance` with
additional template variables. The job name in the template is still `performance`
for compatibility reasons, but may be renamed to match in a future iteration.
- For 11.5 to 12.3 no template is available and the job has to be defined manually as follows:
2019-12-04 20:38:33 +05:30
```yaml
performance:
stage: performance
image: docker:git
variables:
URL: https://example.com
2020-07-28 23:09:34 +05:30
SITESPEED_VERSION: 13.3.0
SITESPEED_OPTIONS: ''
2019-12-04 20:38:33 +05:30
services:
- docker:stable-dind
script:
- mkdir gitlab-exporter
- wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/master/index.js
- mkdir sitespeed-results
2020-07-28 23:09:34 +05:30
- docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:$SITESPEED_VERSION --plugins.add ./gitlab-exporter --outputFolder sitespeed-results $URL $SITESPEED_OPTIONS
2019-12-04 20:38:33 +05:30
- mv sitespeed-results/data/performance.json performance.json
artifacts:
paths:
- performance.json
- sitespeed-results/
2020-07-28 23:09:34 +05:30
reports:
performance: performance.json
2019-12-04 20:38:33 +05:30
```
2020-07-28 23:09:34 +05:30
- For 11.4 and earlier the job should be defined as follows:
2019-09-04 21:01:54 +05:30
2020-07-28 23:09:34 +05:30
```yaml
performance:
stage: performance
image: docker:git
variables:
URL: https://example.com
services:
- docker:stable-dind
script:
- mkdir gitlab-exporter
- wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/master/index.js
- mkdir sitespeed-results
- docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io sitespeedio/sitespeed.io:6.3.1 --plugins.add ./gitlab-exporter --outputFolder sitespeed-results $URL
- mv sitespeed-results/data/performance.json performance.json
artifacts:
paths:
- performance.json
- sitespeed-results/
```
2019-09-04 21:01:54 +05:30
2020-07-28 23:09:34 +05:30
Upgrading to the latest version and using the templates is recommended, to ensure
you receive the latest updates, including updates to the sitespeed.io versions.