doc/ci/testing/browser_performance_testing.md
{{< details >}}
{{< /details >}}
If your application offers a web interface and you're using GitLab CI/CD, you can quickly determine the rendering performance impact of pending code changes in the browser.
[!note] You can automate this feature in your applications by using Auto DevOps.
GitLab uses Sitespeed.io, a free and open source
tool, for measuring the rendering performance of web sites. The
Sitespeed plugin 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.
Consider the following workflow:
<head>, which affects loading page speed.First, define a job in your .gitlab-ci.yml file that generates the
Browser Performance report artifact.
GitLab then checks this report, compares key performance metrics for each page
between the source and target branches, and shows the information in the merge request.
For an example Browser Performance job, see Configuring Browser Performance Testing.
[!note] If the Browser Performance report has no data to compare, such as when you add the Browser Performance job in your
.gitlab-ci.ymlfor the very first time, the Browser Performance report widget doesn't display. It must have run at least once on the target branch (main, for example), before it displays in a merge request targeting that branch. Additionally, the widget only displays if the job ran in the latest pipeline for the Merge request.
{{< history >}}
SITESPEED_DOCKER_OPTIONS variable introduced in GitLab 16.6.{{< /history >}}
This example shows how to run the sitespeed.io container on your code by using GitLab CI/CD and sitespeed.io using Docker-in-Docker.
First, set up GitLab Runner with a Docker-in-Docker build.
Configure the default Browser Performance Testing CI/CD job as follows in your .gitlab-ci.yml file:
include:
template: Verify/Browser-Performance.gitlab-ci.yml
browser_performance:
variables:
URL: https://example.com
The previous example:
browser_performance job in your CI/CD pipeline and runs sitespeed.io against the webpage you
defined in URL to gather key metrics.template: Jobs/Browser-Performance-Testing.gitlab-ci.yml
instead.The template uses the GitLab plugin for sitespeed.io, and it saves the full HTML sitespeed.io report as a Browser Performance report artifact that you can later download and analyze. This implementation always takes the latest Browser Performance artifact available. If GitLab Pages is enabled, you can view the report directly in your browser.
You can also customize the jobs with CI/CD 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 14.1.0).SITESPEED_OPTIONS: Configure any additional sitespeed.io options as required (default nil). Refer to the sitespeed.io documentation for more details.SITESPEED_DOCKER_OPTIONS: Configure any additional Docker options (default nil). Refer to the Docker options documentation for more details.For example, you can override the number of runs sitespeed.io makes on the given URL, and change the version:
include:
template: Verify/Browser-Performance.gitlab-ci.yml
browser_performance:
variables:
URL: https://www.sitespeed.io/
SITESPEED_VERSION: 13.2.0
SITESPEED_OPTIONS: -n 5
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 CI/CD variable. In the following example, the alert only shows up
if the Total Score metric degrades by 5 points or more:
include:
template: Verify/Browser-Performance.gitlab-ci.yml
browser_performance:
variables:
URL: https://example.com
DEGRADATION_THRESHOLD: 5
The Total Score metric is based on sitespeed.io's coach performance score. There is more information in the coach documentation.
The previous 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:
browser_performance job should run after the dynamic environment has started.review job:
echo $CI_ENVIRONMENT_URL > environment_url.txt
in your job's script.browser_performance job.Your .gitlab-ci.yml file would look like:
stages:
- deploy
- performance
include:
template: Verify/Browser-Performance.gitlab-ci.yml
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
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
when: never
- if: $CI_COMMIT_BRANCH
browser_performance:
dependencies:
- review
variables:
URL: environment_url.txt