# Documentation

![](/files/YDfPgTR5qkl72SyAPsll)

Sorry-cypress is an open-source, on-premise, self-hosted alternative to Cypress Cloud 🌲

{% hint style="warning" %}
This project is not affiliated with Cypress.io, Inc., and is not an official Cypress product. “Cypress” is a registered trademark of Cypress.io, Inc. This project is an open-source alternative to Cypress.&#x20;

For the official Cypress Cloud offering, visit <https://cypress.io>.
{% endhint %}

## ⭐️ Features

* Run cypress tests in parallel without dashboard, no limitations
* Upload screenshots and videos to your own storage
* Self-hosted - use your own infrastructure, own your data
* Integrate with GitHub, Slack, MS Teams and other 3rd party tools via web hooks
* Browse test results, failures, screenshots and video recordings
* Deploy on any popular cloud platform:
  * Docker images
  * Docker Compose files
  * Kubernetes Helm Charts
  * AWS
  * Heroku
  * Google Cloud
  * Azure

## ⚡️ Sorry Cypress on Cloud - Currents

Sorry Cypress is 100% open source project, if you're happy to manage your own infrastructure, please continue reading our [guides](/guide/get-started) and installation instructions.

[https://currents.dev](https://currents.dev/cypress-to-playwright?utm_source=docs-sc) is a cloud-based, production-grade, affordable alternative to Cypress Dashboard. It is based on sorry-cypress and provides many of the original dashboard features - without the overhead of managing your own infrastructure.

Check out the [Cypress Dashboard vs. Currents Guide.](https://currents.dev/posts/currents-vs-cypress)

## 💎 Support

Looking for help with installation and / or features? Check out our [Support](/support) options

## ❤️ Contribute

* ⭐️ the project on [GitHub](https://github.com/sorry-cypress/sorry-cypress.dev)
* Donate via [GitHub Sponsors](https://github.com/sponsors/agoldis) or [Open Collective](https://opencollective.com/sorry-cypress)
* Check out our [Contribution Guide](/contributions)

## 🤙 Stay in touch

* Follow [@sorrycypress](https://twitter.com/sorrycypress) to get the latest updates
* Join our public [Slack](https://join.slack.com/t/sorry-cypress/shared_invite/zt-eis1h6jl-tJELaD7q9UGEhMP8WHJOaw) channel


# Get Started

Get started with a free parallelization using sorry-cypress

Let's start by running a basic sorry-cypress configuration:

```
docker run -p 1234:1234 agoldis/sorry-cypress-director
```

We've just launched `director` service on [`http://localhost:1234`](http://localhost:1234) - this service coordinates cypress agents and enables free parallelization.

### Install and configure cypress-cloud and cypress

[`cypress-cloud`](https://github.com/currents-dev/cypress-cloud) is an open-source tool for integrating Cypress with alternative cloud services like Currents or Sorry Cypress.

```bash
npm install cypress-cloud cypress
```

Create a new configuration file: `currents.config.js` in the project’s root, set `cloudServiceUrl` to self-hosted director service of Sorry Cypress

```javascript
// currents.config.js
module.exports = {
  projectId: "yyy", // the projectId, can be any values for sorry-cypress users
  recordKey: "xxx", // the record key, can be any value for sorry-cypress users
  cloudServiceUrl: "http://localhost:1234",   // Sorry Cypress users - set the director service URL
};
```

Add `cypress-cloud/plugin` to `cypress.config.{js|ts|mjs}`

```javascript
// cypress.config.js
const { defineConfig } = require("cypress");
const { cloudPlugin } = require("cypress-cloud/plugin");
module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      return cloudPlugin(on, config);
    },
  },
});
```

### Running cypress tests in parallel <a href="#running-cypress-tests-in-parallel" id="running-cypress-tests-in-parallel"></a>

Let's open several terminal windows and run `cypress-cloud` in each. Make sure you have cypress tests defined in advance.

```bash
# run in each terminal
npx cypress-cloud run --parallel --record --key somekey --ci-build-id hello-cypress
```

You'll notice that different instances of cypress agents are running different tests.

🎉 We've just finished the basic setup of sorry-cypress and ran our tests in parallel!

{% hint style="info" %}

* Use the same `--ci-build-id` to associate different cypress agents with the same run
* You can run as many [cypress agents](/concepts/parallelization-guide) as you want - each will run a different test suite
* This basic `director` configuration keeps all the test results in memory. Restarting it wipes all the data
* `--key` and `projectId` do not have any effect on the basic setup
  {% endhint %}


# Dashboard and API

Running the full sorry-cypress kit - setting up web dashboard to store and browse test results

The [basic](/guide/get-started) setup of sorry-cypress is already quite useful - we can run cypress tests in parallel without any limitations.

However, we want to store and see the test results and explore errors, screenshots and videos.

### Running sorry-cypress kit <a href="#persisting-test-results" id="persisting-test-results"></a>

We are going to run the full sorry-cypress kit:

1. `director` service will use MongoDB to store the test runs and the results
2. `API` service (a GraphQL interface to MongoDB) to let us issue queries and retrieve tests results
3. `Dashboard` service - a web dashboard for browsing the results
4. [`minio`](https://min.io/product/overview) will let us store files - videos and screenshots generated by cypress agent

We are going to run all the services locally using `docker-compose`

```bash
# get docker-compose file
curl --output docker-compose.minio.yml https://raw.githubusercontent.com/sorry-cypress/sorry-cypress/master/docker-compose.minio.yml

# start the services
docker-compose -f ./docker-compose.minio.yml up
```

{% hint style="info" %}

* Make sure to install a modern version of [docker-compose](https://docs.docker.com/compose/install/)
* Shut down any stale sorry-cypress services with `docker kill`
  {% endhint %}

After successfully running docker-compose, we have:

* `director` service on <http://localhost:1234>
* `API` service on <http://localhost:4000>
* `Dashboard` running on <http://localhost:8080>

Open the dashboard at <http://localhost:8080>

Create a project with the id you wrote as value for `projectId` in your `currents.config.js` file (e.g., "yyy").

![Empty sorry-cypress dashboard](/files/-MS6mUQJ6fChfKaoZ5IG)

### Setup Screenshots Upload

We are using `minio` service to store files generated by cypress agents - video recordings and failed test screenshots. Each agent uploads the files directly to `minio` .

Edit your `/etc/hosts` file to allow cypress agents to discover the local instance of `minio`

```bash
127.0.0.1 storage
```

### Running cypress tests in parallel. <a href="#running-cypress-tests-in-parallel" id="running-cypress-tests-in-parallel"></a>

`director` is running in a Docker container, but it is still accessible at [`http://localhost:1234`](http://localhost:1234). We have already reconfigured `cypress` to use this URL. Let's just rerun the tests.

Open several terminal windows within a directory with tests and run `cypress` in each.

```bash
# run in each terminal
cypress-cloud run --parallel --record --key somekey --ci-build-id hello-cypress
```

As soon as agents start their execution, refresh the dashboard. You'd see a new project and a new run created.

{% hint style="warning" %}
Use the same `--ci-build-id` value to associate different cypress agents with the same run. Learn more about [CI Build ID.](https://currents.dev/readme/guides/cypress-ci-build-id)
{% endhint %}

### Exploring the dashboard

The dashboard is quite simple - go ahead and explore the tests you have just created.

![Dashboard example - list of tests and results for a run](/files/-MS6ob37-Wj9oqybT1Xv)

Congratulations 🎉

You have set up sorry-cypress on your local machine. Now you can run unlimited cypress tests and use the dashboard to browse the results.

In the next article, we'll learn how to setup sorry-cypress in the cloud using different cloud providers.


# Cloud Setup

Running sorry-cypress in cloud - AWS, Google Cloud, K8s, Heroku

### Cloud Demo

{% hint style="info" %}
This demo runs on a free public Heroku instance, it takes a minute to wake it up when you first navigate
{% endhint %}

Visit <https://sorry-cypress-demo.herokuapp.com/> to see the web dashboard in action.

Start sending your cypress tests to the demo dashboard by using the following command:

```
CYPRESS_API_URL="https://sorry-cypress-demo-director.herokuapp.com/" cy2 run --parallel --record --key somekey --ci-build-id hello-cypress 
```

### Cloud Providers

Now you can consider deploying it on your own infrastructure.

Each service is available as a standalone Docker image at <https://hub.docker.com/u/agoldis>. The images are automatically updated on each release and tagged in accordance with GitHub release tags.

Sorry-cypress has been successfully used by many organizations of different sizes on different platforms, e.g.:

* Heroku
* AWS
* Google Cloud
* Azure
* Digital Ocean
* IBM Cloud

Check out the rest of the documentation for deployment instructions.

{% hint style="success" %}
Congratulations! You have completed the guide.

* ⭐️ us on [GitHub](https://github.com/sorry-cypress/sorry-cypress)
* Learn how to [Contribute](/contributions)
* If you're stuck, check out [Support](/support) options
* Follow [@sorrycypress](https://twitter.com/sorrycypress/) to get the latest updates
  {% endhint %}

{% hint style="info" %}
**New!** Managed, cloud-based affordable alternative to Cypress Cloud without the overhead of managing your own infrastructure at [https://currents.dev](https://currents.dev/cypress-to-playwright?utm_source=docs-sc)
{% endhint %}


# AWS

Sorry Cypress installation instructions for AWS

Sorry Cypress is designed to run on a self-hosted or cloud environment. We provide AWS CloudFormation templates that for convenient and quick deployment of Sorry Cypress AWS.

* [Basic AWS setup](/cloud-setup/aws/basic-aws-setup) is a minimalistic, plug-n-play configuration that doesn't require extensive knowledge or any pre-existing resources other than an active AWS account
* [Advanced AWS](/cloud-setup/aws/advanced-aws-setup) setup is a more comprehensive setup, that requires more AWS expertise and some pre-existing resources, but provides a setup that is more reliable, scalable and secure


# Basic AWS Setup

Basic Setup of Sorry Cypress on AWS

The basic installation is designed to be plug-n-play - it creates the bare minimum of resources to run Sorry Cypress on AWS.

If you are looking for a more comprehensive deployment please process to [Advanced AWS Setup](/cloud-setup/aws/advanced-aws-setup)

### Cloud Formation Stack <a href="#cloud-formation" id="cloud-formation"></a>

It takes just 5 minutes to deploy full sorry-cypress kit on AWS using AWS Cloud Formation template.

[<img src="/files/-MS7Q2TvjqvAxLBzF5qP" alt="" data-size="original">](https://console.aws.amazon.com/cloudformation/home#/stacks/new?stackName=sorry-cypress\&templateURL=https://s3.amazonaws.com/sorry-cypress.dev/cf/sorry-cypress.yml)

1. Click the link, follow on-screen instructions
2. Wait for deloyment to complete
3. Go to "Output" section of Cloud Formation task to see access URLs
4. Reconfigure cypress to use `DirectorURL` from the previous step.
5. That's it!

![Deploying sorry-cypress to AWS](/files/-MS7R0_PMqgmR-zvBAik)

Alternatively, use the commands below

```bash
aws cloudformation create-stack --template-url https://s3.amazonaws.com/sorry-cypress.dev/cf/sorry-cypress.yml --capabilities CAPABILITY_IAM --stack-name sorry-cypress-2
```

### Stack Overview

The Cloud Formation stack uses AWS Elastic Container Service (ECS) to run sorry-cypress services. The configuration includes networks and Load Balancer for secure and convenient access.

![](/files/-MS7RpjFTd8VkcvYYJor)

The artifacts created by the stack are:

* Director URL - this is what you provide when [configure cypress agent to use the alternative dashboard.](/integrating-cypress/configuring-cypress-agent)
* Dashboard URL - web dashboard access URL
* API URL - GraphQL API access URL
* S3 Bucket - for storing tests video recordings and screenshots
* Cloudwatch log groups for debugging and troubleshooting

### Template Configuration

`StackName (default: "sorry-cypress")`

Defines the stack name, also serves a prefix name for all the entities created by the stack. Please keep it short and no special characters as AWS limits service names.

`TaskCpu (default: 1024)`

The amount of CPU units dedicated to running the services. Sorry-cypress uses AWS Fargate as compute platform, and runs all the services as a single task, i.e. those CPU units are shared among all the services. Read more about at [AWS Documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size)

`TaskMemory (default: 2048)`

The amount of memory units dedicated to running the services. This resource is also shared between the services and defined at task-level. Read more at [AWS Documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size)\`\`

`DirectorPort (default: 8080)`

The port number for accessing the director service. You'll need to use it as a destination when [configuring cypress agents](/integrating-cypress/configuring-cypress-agent).

The stack creates [AWS Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html) to provide access to the underlying services. By default, AWS LB URL points to the web dashboard (on port `80`). The director service is available via the same URL but different port.

For example, if the access URL created by the stack is `http://sorry-cypress-1502240720.us-east-1.elb.amazonaws.com`, and `DirectorPort=8080` then `director` service will be available at `http://sorry-cypress-1502240720.us-east-1.elb.amazonaws.com:8080`

### AWS Pricing

You're only paying for AWS resources. Here's a rough estimator of price / month for using the resources used . The actual usage might be higher (or lower) based on actual usage

* Fargate pricing based on [calculator](http://fargate-pricing-calculator.site.s3-website-us-east-1.amazonaws.com/) **35.546 USD** (1 vCPU, 2GB RAM) or **17.773 USD** (0.5 vCPU, 1GB RAM)
* EC2 Application Load Balancer based on [calculator](https://aws.amazon.com/elasticloadbalancing/pricing/) **19.35 USD** (0.5 GB / hour, 0.5 connections / second)
* S3 + Cloudwatch = varies based on usage

Too expensive? Try [free Heroku setup](/cloud-setup/heroku).


# Advanced AWS Setup

Advanced installation of Sorry Cypress on AWS

### Stack Overview <a href="#stack-overview" id="stack-overview"></a>

The advanced deployment uses ECS to run sorry-cypress services and has many parameters for customization.

{% hint style="info" %}
Download [Advanced AWS CloudFormation Template for Sorry Cypress](https://github.com/sorry-cypress/sorry-cypress/blob/master/cloudformation/sorry-cypress-advanced-deployment.yml)
{% endhint %}

Here are the main differences between this template and the simple deployment template.

### Pre-existing VPC

This template expects a VPC, subnets and routing to exist already. If you don't have any of this deployed in the account yet, deploy the standard-networking CloudFormation template and it will deploy:

* 2 public subnets
* 2 private subnets
* an Internet Gateway
* a NAT Gateway
* route tables
* all required attachments and associations

### Deploy a remote DB

You have the option of deploying a remote AWS DocumentDB that the ECS cluster uses for storing cypress test results data. When using a local database, the data is stored in a mongodb container that is running inside the ECS task. That means the data is lost when the task is deleted or restarted, and then only one task can run at a time. A remote DB allows for running multiple tasks to handle higher load, and restarting tasks while maintaining data.

### Automated Task Scaling

You can configure automatic scaling of the ECS tasks to scale up and down during peak and off hours. This helps save costs when sorry-cypress isn't being used, and helps provide service availability during peak work hours.

### Stronger Security

This template deploys a customer-managed KMS key (CMK) that is used to encrypt the database, and optionally, the S3 bucket. You can also provide an ACM certificate for HTTPS access to the sorry-cypress dashboard.

### Dockerhub Credentials

If you have a dockerhub account, you can provide the credentials to the template. They are stored in AWS SecretsManager, and provided to the ECS tasks to allow them to authenticate with dockerhub when pulling the sorry-cypress images. This prevents being throttled by dockerhub.

### S3 Storage Lifecycle

You can set a lifecycle on the S3 bucket that stores videos and screenshots of the cypress tests. The value set is how long they will be retained, in days.

***

The artifacts created by the stack are:

* Director URL - this is what you provide when [configure cypress agent to use the alternative dashboard.](https://file+.vscode-resource.vscode-cdn.net/Users/agoldis/gitbook/integrating-cypress/configuring-cypress-agent.md)
* Dashboard URL - web dashboard access URL
* API URL - GraphQL API access URL
* S3 Bucket - for storing tests video recordings and screenshots
* Cloudwatch log groups for debugging and troubleshooting

***

### Template Configuration <a href="#template-configuration" id="template-configuration"></a>

Below are descriptions of the various parameters in this template and what they do.

#### Network Configuration <a href="#network-configuration" id="network-configuration"></a>

`VPC`

The VPC in which to deploy sorry-cypress. This can be a pre-existing VPC or the one deployed by the standard-networking template.

`PrivateSubnets`

At least one private subnet for the deployment.

`LoadBalancerScheme`

The scheme for the load balancer: internet-facing or internal. If you're deploying an internet-facing load balancer, select public subnets for the `LoadBalancerSubnets` parameter. If internal, select private subnets.

`LoadBalancerSubnets`

The subnets in which to deploy the user-facing load balancer. These can be public or private, depending on your needs.

#### Security Configuration <a href="#security-configuration" id="security-configuration"></a>

`AccessCIDR`

The CIDR range that is allowed to reach the sorry-cypress front-end load balancer.

This CIDR range is permitted to the load balancer via it's attached security group.

More ranges can be added by hand later on, if need be.

`AllowedCIDRRanges`

A comma-separated list of CIDR ranges that can download from the S3 bucket.

Keep in mind that downloads come from your browser when access the sorry-cypress dashboard, so these CIDR ranges should be / include the IP address from which you and other users will access sorry-cypress.

In most cases, this will be the same as the `AccessCIDR` parameter.

Example: `1.1.1.1/32,2.2.2.2/32`

`ACMCertificateArn`

The ARN of a verified ACM certificate. This is attached to the sorry-cypress front-end load balancer to provide HTTPS access to the dashboard.

`S3ObjectACL (default: public-read)`

The ACL to apply to uploaded objects in S3 (videos and screenshots). This value will be set in the pre-signed URL that sorry-cypress generates when a job is about to upload something to the S3 bucket.

The recommended value is `public-read`. The bucket, however, will not be fully public. It will have a bucket policy that restricts downloads to CIDR ranges that you provide.

#### ECS Task Configuration <a href="#ecs-task-configuration" id="ecs-task-configuration"></a>

`TaskCpu (default: 1024)`

The amount of CPU units dedicated to running the services. Sorry-cypress uses AWS Fargate as compute platform, and runs all the services as a single task, i.e. those CPU units are shared among all the services. Read more about at [AWS Documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size)

`TaskMemory (default: 2048)`

The amount of memory units dedicated to running the services. This resource is also shared between the services and defined at task-level. Read more at [AWS Documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size)\`\`

`DirectorPort (default: 8080)`

The port number for accessing the director service. You'll need to use it as a destination when [configuring cypress agents](https://file+.vscode-resource.vscode-cdn.net/Users/agoldis/gitbook/integrating-cypress/configuring-cypress-agent.md).

`SorryCypressVersion (default: latest)`

The version tag of the sorry-cypress image to pull when starting the tasks.

`DockerUsername`

(Optional) The username to dockerhub, for authenticating when pulling the sorry-cypress images.

`DockerPassword`

(Optional) The password to dockerhub, for authenticating when pulling the sorry-cypress images.

#### Screenshots Storage Configuration <a href="#screenshots-storage-configuration" id="screenshots-storage-configuration"></a>

`S3LifecycleExpirationDays (default: 7)`

The number of days after which to expire objects in the screenshots storage S3 bucket

#### Database Configuration <a href="#database-configuration" id="database-configuration"></a>

`DBType (default: remote)`

The type of database. If `remote`, a DocumentDB database will be created which runs externally from the ECS cluster. If `local`, a mongodb container will run in the ECS tasks.

`DBInstanceClass (default: db.t3.medium)`

(Conditional) The class for the DB instance, if using a remote database. If using a local database, this can be ignored.

`DBPassword`

(Conditional) The password for the database, if using a remote database. If using a local database, this can be ignored.

#### Scheduled Scaling Configuration <a href="#scheduled-scaling-configuration" id="scheduled-scaling-configuration"></a>

`MinCapacityOff (default: 0)`

The minimum number of sorry-cypress tasks to run during "off" hours.

`MinCapacityOn (default: 1)`

The minimum number of sorry-cypress tasks to run during "on" hours.

`MaxCapacityOff (default: 0)`

The maximum number of sorry-cypress tasks to run during "off" hours.

`MaxCapacityOn (default: 2)`

The maximum number of sorry-cypress tasks to run during "on" hours.

`ScaleUpHour (default: 5)`

The hour in EST (24-hour format) at which to scale up the sorry-cypress service tasks each day.

`ScaleDownHour (default: 23)`

The hour in EST (24-hour format) at which to scale down the sorry-cypress service tasks each day.

### AWS Pricing <a href="#aws-pricing" id="aws-pricing"></a>

You're only paying for AWS resources. Here's a rough estimator of price / month for using the resources used. The actual usage might be higher (or lower) based on actual usage

* Fargate pricing based on [calculator](http://fargate-pricing-calculator.site.s3-website-us-east-1.amazonaws.com/) **35.546 USD** (1 vCPU, 2GB RAM) or **17.773 USD** (0.5 vCPU, 1GB RAM)
* EC2 Application Load Balancer based on [calculator](https://aws.amazon.com/elasticloadbalancing/pricing/) **19.35 USD** (0.5 GB / hour, 0.5 connections / second)
* DocumentDB database based on [calculator](https://aws.amazon.com/documentdb/pricing/) **61.90 USD** (db.t3.medium instance @ $0.078 per hour)
* S3 + Cloudwatch = varies based on usage


# AWS Networking

Complimentary configuration to support Advanced AWS installation

The standard networking CloudFormation template deploys the following resources:

* a VPC with CIDR range `10.0.0.0/16`
* 2 public subnets with CIDR ranges `10.0.0.0/24` and `10.0.1.0/24`
* 2 private subnets with CIDR ranges `10.0.2.0/24` and `10.0.3.0/24`
* an Internet Gateway
* a NAT Gateway
* a public and private route table
* all required attachments and associations

This is not required to run sorry-cypress but is provided as a convenience when deploying the [advanced template](/cloud-setup/aws/advanced-aws-setup). Any pre-existing VPC with at least 1 subnet and routing to the Internet can be used.


# AWS S3 Manual Setup

Setting up AWS S3 Bucket for storing cypress recordings

{% hint style="info" %}
The following configuration is already included in [CloudFormation setup](/cloud-setup/aws#cloud-formation)
{% endhint %}

* Create a new S3 bucket, enable public access (uncheck `Block all public access`)
* Set bucket's CORS configuration:

```
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
```

or for new AWS dashboard:

```
[
  {
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["POST", "GET", "PUT", "DELETE", "HEAD"],
    "AllowedOrigins": ["*"],
    "ExposeHeaders": []
  }
]
```

* Open IAM dashboard
* Create new user, enable programmatic access. Keep the access key and the secret.
* Create and attach the policy to the user:

  ```
  {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Sid": "VisualEditor0",
              "Effect": "Allow",
              "Action": [
                  "s3:PutObject",
                  "s3:PutObjectAcl"
              ],
              "Resource": "arn:aws:s3:::<your-bucket-name>/*"
          }
      ]
  }
  ```


# Google Cloud

Sorry-cypress installation instructions for Google Cloud Run

The suggested setup uses the following stack:

* [Google Cloud Run](https://cloud.google.com/run) services to run sorry-cypress Director, API and Dashboard
* [Google Cloud Storage](https://cloud.google.com/storage) with signed Read and Write URLs
* MongoDB setup of your choice

{% hint style="info" %}
Please make sure that you have

* recent version of [`gcloud`](https://cloud.google.com/sdk/docs/quickstart) installed
* Google Cloud project is configured and you have [sufficient permissions](https://cloud.google.com/sdk/docs/authorizing)
* recent version of Docker installed
  {% endhint %}

### MongoDB Setup

Please use MongoDB provider of your choice. [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) is a simple and popular managed solution that also has a free tier.

Once you've created MongoDB cluster and a database, please obtain credentials and database name, you will need it in subsequent steps.

### Storage Setup

{% hint style="info" %}
You can use AWS S3 Storage instead, please refer to [AWS S3 setup instructions](/cloud-setup/aws/aws-s3-storage)
{% endhint %}

#### Create Bucket

1. Navigate to the [API Console Storage page](https://console.cloud.google.com/storage/browser)
2. Select a project or create a new project. Note the project ID.
3. Select **Create** and follow the steps to create the bucket. Note the bucket name.

{% hint style="info" %}
Consider setting up a [Lifecycle Rule](https://cloud.google.com/storage/docs/lifecycle) to keep only the most recent objects and keep costs down. Eg: *Delete object, 7+ days since object was created*
{% endhint %}

#### Authentication

Sorry-cypress Director authenticates on Google Cloud Storage using the Service Account assigned on the cloud run revision (usually Compute Engine default service account)

Make sure that service account has the `Storage Object Creator` Role, or assign the role / create a new service account with the role instead.

#### Access Control

By default the **google-cloud-storage** driver uses Signed URLs for both Read & Write URLs. This means the bucket access can be set to `Uniform` - `Not Public`

However, Google Cloud Storage Signed URLs have a [max expiration time of 7 days](https://cloud.google.com/storage/docs/access-control/signed-urls). If you need to view the recording of your runs from sorry-cypress Dashboard for more than 7 days consider one of the following:

* Allow public read access to the bucket
* Use MinIO Gateway to access Google Cloud Storage instead. [Instructions](/cloud-setup/google-cloud/google-cloud)

### Deploying sorry-cypress Kit

Let's create 3 Cloud Run Services and deploy sorry-cypress components. We are going to run the following sequence of commands for each service:

1. Pull latest docker image from Dockerhub
2. Tag and push image to GCR associated with your project
3. Deploy Google Cloud Run service using the newly generated image

Running a simple script hosted on GitHub would deploy the services.

* `-p` is the current Google Cloud project
* `-n` is the name prefix for generated Google Cloud Run services

```bash
curl -sL https://git.io/Jt4cB  \
|  source /dev/stdin -p <project> -n <services-prefix>

## Example output:
# 🏁  Finished deployment to Google Cloud Run
#
# test001-director: https://test001-dashboard-dwpifb4gla-uc.a.run.app
# test001-api: https://test001-dashboard-dwpifb4gla-uc.a.run.app
# test001-dashboard: https://test001-dashboard-dwpifb4gla-uc.a.run.app
```

Note the URLs of the generated services, we'll use those in the next step to configure the services so they'll be able to communicate one with another.

### Configuring sorry-cypress Services

Run the commands below, please be careful while substituting template strings with values obtained at previous steps

```bash
# director configuration
gcloud run services update <services_prefix>-director \
--platform managed \
--set-env-vars DASHBOARD_URL="<dashboard_service_url>" \
--set-env-vars EXECUTION_DRIVER="../execution/mongo/driver" \
--set-env-vars MONGODB_URI="<mongodb_uri>" \
--set-env-vars MONGODB_DATABASE="<mongodb_dbname>" \
--set-env-vars SCREENSHOTS_DRIVER="../screenshots/google-cloud-storage.driver" \
--set-env-vars GCS_BUCKET="<bucket_name>" \
--set-env-vars GCS_PROJECT_ID="<project_id>" \
--set-env-vars GCS_IMAGE_KEY_PREFIX="screenshot/" \ # optional, default blank
--set-env-vars GCS_VIDEO_KEY_PREFIX="video/" \      # optional, default blank
--set-env-vars GCS_IS_BUCKET_PUBLIC_READ="false"    # optional, use 'true' only if the bucket has public read access

# api configuration
gcloud run services update <services_prefix>-api \
  --platform managed \
--set-env-vars MONGODB_URI="<mongodb_uri>" \
--set-env-vars MONGODB_DATABASE="<mongodb_dbname>" \
--set-env-vars APOLLO_PLAYGROUND="<apollo_playground>"

# dashboard configuration
gcloud run services update <services_prefix>-dashboard \
  --platform managed \
  --set-env-vars GRAPHQL_SCHEMA_URL="<api_service_url>"
```

🎉 Congratulations!

You've finished setting up sorry-cypress on Google Cloud - now you can open the Dashboard URL to see the dashboard.

Don't forget to [reconfigure cypress agents](/integrating-cypress/configuring-cypress-agent) to use Director service before running test.


# Google Cloud & MinIO - Deprecated

Sorry-cypress installation instructions for Google Cloud Run with MinIO

### Minio Gateway

MinIO GCS Gateway allows to access Google Cloud Storage (GCS) with AWS S3-compatible APIs.

{% hint style="warning" %}
MinIO Gateway is Deprecated [since February 2022](https://blog.min.io/deprecation-of-the-minio-gateway/?ref=docs-redirect)
{% endhint %}

#### Create Service Account

1. Navigate to the [API Console Credentials page](https://console.developers.google.com/project/_/apis/credentials)
2. Select a project or create a new project. Note the project ID.
3. Select the **Create credentials** drop-down on the **Credentials** page, and click **Service account key**.
4. Select **New service account** from the **Service account** drop-down.
5. Populate the **Service account name** and **Service account ID**.
6. Click the drop-down under **Grant this service account access to the project,** the **Role** and choose **Storage** > **Storage Admin** *(Full control of GCS resources)*.
7. Click on the service account and select **Add Key > Create New Key** key
8. Download the **JSON** file and rename it as `credentials.json`

{% hint style="warning" %}
The service account is granted admin access to all GC storage objects. Please refer to Google Cloud and Minio documentation to limit access.
{% endhint %}

#### Deploy Minio Gateway

Grab the following Dockerfile and place it in the same directory as created earlier `credentials.json`

```bash
.
├── credentials.json
└── Dockerfile
```

{% code title="Dockerfile" %}

```bash
FROM minio/minio
COPY credentials.json ./
ENV GOOGLE_APPLICATION_CREDENTIALS=/credentials.json
ENV MINIO_ACCESS_KEY=<choose_access_key>
ENV MINIO_SECRET_KEY=<choose_secret_key>
CMD ["gateway", "gcs", "<project>"]
```

{% endcode %}

Replace `project` and choose secure `MINIO_ACCESS_KEY` and `MINIO_SECRET_KEY`, build the image and push to GCR.

```bash
docker build -t gcr.io/<project>/minio .
docker push gcr.io/<project>/minio
```

Create and deploy Cloud Run `minio`service.

```bash
gcloud run deploy minio \
--image gcr.io/<project>/minio \
--platform managed \
--allow-unauthenticated \
--port 9000

## Example output:
# Service [minio0demo] revision [minio2-00001-fab] has been deployed and is serving 100 percent of traffic.
# Service URL: https://minio-dwpifb4gla-uc.a.run.app
```

Upon successful deployment, note the `Service URL` of the deployed service. You'd be able to open browsers and access Minio dashboard with the credentials you've set in Dockerfile earlier.

#### Create a New Bucket

Run the next command to create a new bucket (`<bucket_name>`) and set policy using `mc` - minio client Docker image

```bash
docker run -it minio/mc \
  mc config host add gcs <minio_service_url> <minio_access_key> <minio_secret_key> && \
  mc mb gcs/<bucket_name> && \
  mc policy set download gcs/<bucket_name>

## Example output:
# Bucket created successfully `gcs/sorry-cypress-demo`.
# Access permission for `gcs/sorry-cypress-demo` is set to `download`
```

🎉 You have setup Minio Gateway that sorry-cypress can use to store the recordings of your runs.

### Continue the setup steps for deploying sorry-cypress

Continue with the [setup here ](/cloud-setup/google-cloud#deploying-sorry-cypress-kit)and use these environment variables instead:

```bash
# director configuration
gcloud run services update <services_prefix>-director \
--platform managed \
--set-env-vars DASHBOARD_URL="<dashboard_service_url>" \
--set-env-vars EXECUTION_DRIVER="../execution/mongo/driver" \
--set-env-vars MONGODB_URI="<mongodb_uri>" \
--set-env-vars MONGODB_DATABASE="<mongodb_dbname>" \
--set-env-vars MINIO_ACCESS_KEY="<minio_access_key>" \
--set-env-vars MINIO_SECRET_KEY="<minio_secret_key>" \
--set-env-vars MINIO_ENDPOINT="example-minio-dwpifb4gla-uc.a.run.app" \
--set-env-vars MINIO_URL="https://exampleminio-dwpifb4gla-uc.a.run.app" \
--set-env-vars MINIO_BUCKET="<minio_bucket_name>"

# api configuration
gcloud run services update <services_prefix>-api \
  --platform managed \
--set-env-vars MONGODB_URI="<mongodb_uri>" \
--set-env-vars MONGODB_DATABASE="<mongodb_dbname>" \
--set-env-vars APOLLO_PLAYGROUND="<apollo_playground>"

# dashboard configuration
gcloud run services update <services_prefix>-dashboard \
  --platform managed \
  --set-env-vars GRAPHQL_SCHEMA_URL="<api_service_url>"
```


# Microsoft Azure

{% hint style="danger" %}
Under construction
{% endhint %}


# Heroku

Sorry-cypress installation instructions for Heroku

### Basic sorry-cypress Setup <a href="#running-a-stateless-director-service" id="running-a-stateless-director-service"></a>

Click the button below to deploy the basic, in-memory, standalone `director` service to Heroku.

[<img src="/files/-MS7HcIaNVpFLtmZS5Tb" alt="" data-size="original">](https://heroku.com/deploy?template=https://github.com/agoldis/sorry-cypress/tree/master)

### Full sorry-cypress kit on Heroku

{% hint style="info" %}

* Download and install the [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)
* You must have [Docker](https://docs.docker.com/get-docker/) set up locally to continue
  {% endhint %}

We'll create 3 separate Heroku applications - one for each service. Publicly available docker images of 3 services are available at:

* <https://hub.docker.com/repository/docker/agoldis/sorry-cypress-director>
* <https://hub.docker.com/repository/docker/agoldis/sorry-cypress-api>
* <https://hub.docker.com/repository/docker/agoldis/sorry-cypress-dashboard>

The images are automatically updated on each release and tagged in accordance with GitHub releases.

sorry-cypress uses MongoDB as a persistence layer for storing and retrieving test results. We'll use a free hosted solution to run a managed instance of [Atlas](https://www.mongodb.com/cloud/atlas) MongoDB.

#### Creating Heroku Application

Create 3 new Heroku application and give them appropriate names

```bash
heroku create <prefix>-director
heroku create <prefix>-api
heroku create <prefix>-dashboard
```

Run the commands to deploy `director` , `API` and `Dashboard` services

```bash
# Sign into Heroku Container Registry.
heroku container:login

# Pull services image
docker pull agoldis/sorry-cypress-director:latest
docker pull agoldis/sorry-cypress-api:latest
docker pull agoldis/sorry-cypress-dashboard:latest

# Tag service images as Heroku app image
docker tag agoldis/sorry-cypress-director:latest registry.heroku.com/<name_of_director_app>/web
docker tag agoldis/sorry-cypress-api:latest registry.heroku.com/<name_of_api_app>/web
docker tag agoldis/sorry-cypress-dashboard:latest registry.heroku.com/<name_of_dashboard_app>/web

# Push the images to Heroku Container Registry
docker push registry.heroku.com/<name_of_director_app>/web
docker push registry.heroku.com/<name_of_api_app>/web
docker push registry.heroku.com/<name_of_dashboard_app>/web

# Deploy the image
heroku container:release --app <name_of_director_app> web
heroku container:release --app <name_of_api_app> web
heroku container:release --app <name_of_dashboard_app> web
```

#### Setup MongoDB

Choose the MongoDB provider of your choice and obtain connection details. You will need to set the credentials for newly deployed services.

Heroku has a plenty of add-ons that allows attaching a MongoDB cluster. The recommended way is to attach a MongoDB add-on to `director` application and use the same credentials for `API` service.

All you'll need is the database name and the access credentials so you can fill the Heroku config variables as we'll see right after. So go ahead to the [MongoDB Atlas docs](https://docs.atlas.mongodb.com/getting-started/), get your database running and grab that data!

Because the creation of this cluster is very straightforward and well-written in the docs, we'll not cover that here.

#### Setup Recordings Storage

Please refer to [Storage Configuration](/configuration/director-configuration#remote-storage-configuration) instructions to configure Recordings Storage (failed tests screenshots and videos) and obtains credentials.

#### Setup `director` Service

```bash
# Use stateful mode and keep test results in MongoDB
EXECUTION_DRIVER="../execution/mongo/driver"

# Dashboard app url
DASHBOARD_URL=<dashboard_app_url>

# MongoDB database name
MONGODB_DATABASE=<atlas_database_name>

# MongoDB connection string
MONGODB_URI=<atlas_database_access_credentials>

# If you've set up S3 bucket for keeping screenshots
# Screenshots driver path
SCREENSHOTS_DRIVER="../screenshots/s3.driver"
# If you've set up minio for keeping screenshots
#SCREENSHOTS_DRIVER="../screenshots/minio"

# S3 Bucket name
S3_BUCKET="bucket_name"

# AWS region, default value is "us-east-1"
S3_REGION="us-east-1"

# AWS / MIIO credentials with write access to AWS S3 bucket
AWS_ACCESS_KEY_ID="key_id"
AWS_SECRET_ACCESS_KEY="secret_access"
```

#### Setup `API` Service

```bash
# MongoDB database name
MONGODB_DATABASE=<atlas_database_name>

# MongoDB connection string
MONGODB_URI=<atlas_database_access_credentials>

# Enable or disable Apollo playgroun landing page
APOLLO_PLAYGROUND=<apollo_playground>
```

#### Setup `Dashboard` Service

```bash
# For communicating with API
GRAPHQL_SCHEMA_URL=<api_app_url>
```

[Reconfigure cypress agents](/integrating-cypress/configuring-cypress-agent) and try running some tests. You will see test results appear in the newly installed dashboard.


# Kubernetes

Sorry-cypress setup example using Kubernetes

{% hint style="warning" %}
Please refer to [Introducing the Sorry Cypress Helm Chart](https://crumbhole.com/indroducing-the-sorry-cypress-helm-chart/) by Tim Collins
{% endhint %}

There is a Helm chart for Sorry Cypress. Detailed information on the latest release versions plus how to install and configure can be found at [Artifact Hub](https://artifacthub.io/packages/helm/sorry-cypress/sorry-cypress).

The chart is designed to work with Kubernetes 1.16 to 1.27.

If you find any issues with the Helm chart, or you wish to raise a feature request, please raise an issue in the [Sorry Cypress Charts Git repository](https://github.com/sorry-cypress/charts/issues).


# Docker Images

Docker images allow to customize your setup

Publicly available docker images of 3 services that compose sorry-cypress kit are available on Dockerhub in ARM and AMD architectures.

* <https://hub.docker.com/repository/docker/agoldis/sorry-cypress-director>
* <https://hub.docker.com/repository/docker/agoldis/sorry-cypress-api>
* <https://hub.docker.com/repository/docker/agoldis/sorry-cypress-dashboard>

The images are automatically updated on each release and tagged in accordance with GitHub releases.


# Integration options

{% hint style="info" %}
TL;DR

* [**cypress-cloud**](https://github.com/currents-dev/cypress-cloud) is the preferred way to use Currents, it is compatible with cypress 10.0.0+
* [**cy2**](https://github.com/sorry-cypress/cy2) is a legacy integration, it is **incompatible** with cypress 12.6.0+
  {% endhint %}

Please refer to <https://currents.dev/readme/integration-with-cypress/integrating-with-cypress> for details.


# cy2 - Deprecated

{% hint style="warning" %}
Cypress introduced a breaking change in version 12. Please use`cypress-cloud`  integration package.&#x20;

cy2 is deprecated.
{% endhint %}

`cy2` is an [NPM package](https://www.npmjs.com/package/cy2) that Integrates Cypress with alternative cloud services like Sorry Cypress or Currents by setting the environment variable `CYPRESS_API_URL.`

The command passes down to cypress all the CLI flags, so you can just use it instead of `cypress`

```bash
$ npm install -g cy2

$ export CYPRESS_API_URL="https://sorry.yourdomain.com/"
$ cy2 run --record --key XXX --parallel --ci-build-id `date +%s`
```

* Running the command above will invoke your default cypress version with the flags you've provided. It will also modify the internal cypress configuration to use a different API URL.
* If no URL is provided, it will use the default `cypress` package configuration
* On Windows set `CYPRESS_API_URL` in the CMD shell with `set CYPRESS_API_URL=https://sorry.yourdomain.com/` (Don't use quotes (`"`) because the Windows CMD takes them literally unlike the Linux shells)

{% hint style="warning" %}
MacOS Ventura users:

Running \`cy2\` in an interactive shell can fail with `EPERM: operation not permitted` unless you need to explicitly allow the shell app to modify other applications.

Add the shell app of your choice to the allowed list.

**Mac OS Settings > Privacy and Security > App Management**

<img src="/files/c7GjxcnR511KgATjVGZB" alt="cy2 EPERM - adding shell to App Management allowed list" data-size="original">
{% endhint %}

***


# Agent Configuration - Deprecated

Changing cypress agent configuration

{% hint style="danger" %}
**Please note**

Cypress 11 and 12+ deprecated agent configuration files. Please make sure to use the latest version of cy2 package. See more at <https://currents.dev/readme/guides/cypress-compatibility>
{% endhint %}

Find cypress installation path

```bash
DEBUG=cypress:* cypress version

# here it is
cypress:cli Reading binary package.json from: /Users/john/Library/Caches/Cypress/3.4.1/Cypress.app/Contents/Resources/app/package.json +0ms
```

In my case it is: `/Users/john/Library/Caches/Cypress/6.3.0/Cypress.app/Contents/Resources/app/`

Change the default dashboard URL - use the `director` service URL

```bash
$ cat /Users/john/Library/Caches/Cypress/3.4.1/Cypress.app/Contents/Resources/app/packages/server/config/app.yml

...
# Replace this with a URL of the alternative dashboard
production:
  # api_url: "https://api.cypress.io/"
  api_url: "http://localhost:1234/"
...
```


# CLI One Liners - Deprecated

One-liners to easily change cypress configuration

{% hint style="danger" %}
**Please note**

Cypress 11 and 12+ deprecated agent configuration files. Please make sure to use the latest version of cy2 package. See more at <https://currents.dev/readme/guides/cypress-compatibility>
{% endhint %}

Use this CLI one-liner to change cypress configuration for all installed versions of cypress

```bash
sed -i -e 's|api_url:.*$|api_url: "https://sorry-cypress-demo-director.herokuapp.com/"|g' /*/.cache/Cypress/*/Cypress/resources/app/packages/server/config/app.yml
```

Or for Windows:

```bash
ls $env:LOCALAPPDATA/Cypress/Cache -Recurse -Filter app.yml |
% { (Get-Content $_ -Raw) -replace "https://api.cypress.io/", "https://sorry-cypress-demo-director.herokuapp.com/" | Out-File $_ }
```


# Basic Setup

Sorry-cypress Director basic setup instructions

The basic sorry-cypress setup:

* enables tests parallelization with [grouping support](https://docs.cypress.io/guides/guides/parallelization.html#Grouping-test-runs)
* does not require any database
* does not require any storage
* does not support integrations (web hooks, Slack and GitHub integration)
* keeps all the data in-memory

This setup might be useful for simple workflows when you **do** need parallelization but **don't need** the overhead of maintaining and paying for the infrastructure required to keep and browse tests results.

One could even create such a service on-demand every CI run and terminate at the end of CI process.

In order to start the director in the default, basic setup just run

```
docker run agoldis/sorry-cypress-director
```

By default the service starts on port `1234`. Point cypress agents to use the newly launched service and see the tests running in parallel.

Behind the scene director service uses in-memory execution driver and can be explicitly set to basic mode by setting environment variables

```
EXECUTION_DRIVER="../execution/in-memory"
SCREENSHOTS_DRIVER="../screenshots/dummy.driver"
PORT=1234
```

{% hint style="info" %}
To achieve parallelization for the same CI run, make sure that all CI machine are using the same `sorry-cypress-director` service and use the same `--ci-build-id` flag
{% endhint %}

{% hint style="info" %}
`--key` flag has no effect - all keys are accepted for the basic setup. Same for cypress `projectId`
{% endhint %}


# Full Setup

Sorry-cypress full setup with persistency and web dashboard

The full sorry-cypress setup allows to use all the supported featured but comes with an overhead of maintaining the infrastructure required to run the services:

* sorry-cypress-director in "persisting" mode
  * MongoDB
  * Test Recordings storage
* sorry-cypress-api
* sorry-cypress-dashboard

### Director Service

Director service is responsible for

* parallelization and coordination of test runs
* integration with Slack, GitHub, MS Teams and emitting generic WebHooks
* saving tests results
* generating signed upload URL for saving failed tests screenshots

When you launch Cypress agents on a CI environment with multiple machines, each agent contacts the director service and gets instructions on the next spec file to run.

After running the test spec, the agent reports the results to the Director service, receives the instructions for the next run, and so on until all the tests are done.

The director service coordinates those activities for multiple agents and different runs, stores the test results in a database.

Full setup requires the director to run in "persisting" mode to use MongoDB driver and provide credentials.,

```
EXECUTION_DRIVER="../execution/mongo/driver"
MONGODB_URI="monodgb://your-DB-URI"
MONGODB_DATABASE="your-DB-name"
```

Also, see [Director Configuration](/configuration/director-configuration) options.

### API Service

API Service is a simple GraphQL wrapper that exposes a convenient way to query the data stored by Director.

The service is only required as an interface for the Web Dashboard, but can be used to query the database and describe the internal data models.

Also, see [API Configuration](/configuration/api-configuration) options.

### Web Dashboard Service

The dashboard allows end-users to interact with sorry-cypress using a browser and to:

* track test runs progress
* browser test results, videos, and failures screenshots
* set projects configuration like WebHooks, Slack, MS Teams and GitHub integration
* create and delete entries (projects, runs)

Also, see [Dashboard Configuration](/configuration/dashboard-configuration) options.

### Recordings Storage

Cypress comes with the ability to take [screenshots and videos](https://docs.cypress.io/guides/guides/screenshots-and-videos.html#Screenshots), whether you are running via `cypress open` or `cypress run`, even in CI.

We need remote storage to store the generated screenshots and videos. Director service will send a signed upload URL that cypress agent will use to upload the generated artifacts.

> A signed URL is a URL that provides limited permission and time to make a request. Signed URLs contain authentication information in their query string, allowing users without credentials to perform specific actions on a resource.

Sorry-cypress integrates with the major remote cloud storage solutions:

* AWS S3
* Minio integration (via [Minio S3 Gateway](https://docs.min.io/docs/minio-gateway-for-s3.html)) that is compatible with
  * Google Cloud Storage
  * IBM COS
  * NAS
  * HDFS
* Azure Blob Storage

To disable remote storage, we need to set a "dummy" screenshots driver for Director service.

```
SCREENSHOTS_DRIVER="../screenshots/dummy.driver"
```

To enable remote storage, see [Director Configuration](/configuration/director-configuration) options.

{% hint style="info" %}
Refer to specific cloud platform instructions for remote cloud storage configuration guidelines.
{% endhint %}

### MongoDB

Director and API services work with MongoDB as a persistency layer. It's up to you to choose MongoDB solution that works for your needs.

[MongoDB Atlas](https://www.mongodb.com/cloud/atlas) is a simple and popular managed solution that also has a free tier.

[AWS DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/what-is.html) is a managed NoSQL DB in AWS which is [partially compatible](https://docs.aws.amazon.com/documentdb/latest/developerguide/compatibility.html) to the MongoDB API. It has no free tier option, but can be still be a suitable option. Sorry-cypress added compatibility in [v1.0.0-rc.8](https://github.com/sorry-cypress/sorry-cypress/releases/tag/v1.0.0-rc.8)


# Director Service

Director service configuration options

## Common Configuration

`PORT=1234`

Director will listen on that port

`DASHBOARD_URL="http://localhost:8080"`

"Run URL" shown by Cypress agent when running tests

`INACTIVITY_TIMEOUT_SECONDS=180`

Director uses the timeout value to define how long we should wait before checking for a run’s inactivity.

`ALLOWED_KEYS=null`

List of comma delimited record keys (provided to the Cypress Runner using --key option) which are accepted by the director service.

This can be useful when cypress is running on external CI servers and we need to expose director to the internet.

Empty or not provided variable means that all record keys are allowed.

`GITLAB_JOB_RETRIES=false`

Enables/disables the ability to retry tests by rerunning CI jobs on GitLab.

This functionality is only supported when using the mongo execution driver.

`BASE_PATH="/"`

Service's base path, useful for reverse proxies

## Persistence Configuration

`EXECUTION_DRIVER="../execution/in-memory"`

Set the execution driver for Director service. Possible values are:

* `../execution/in-memory` - Director will keep all the data in-memory. See [Basic Setup](/configuration/in-memory).
* `../execution/mongo/driver` - use MongoDB as a persistence. See [Full Setup](/configuration/persistent#director-service).

## MongoDB Configuration

Used when mogo persistence configuration is selected. Refer to [MongoDB Configuration](/configuration/mongodb-configuration).

## Remote Storage Configuration

`SCREENSHOTS_DRIVER="../screenshots/dummy.driver"`

Set the execution driver for Director service. Possible values are:

* `../screenshots/dummy.driver` - don't store anything, dummy driver
* `../screenshots/s3.driver` - use AWS S3. See [Full Setup](/configuration/persistent#director-service) for details.
* `../screenshots/minio.driver`- use Minio. See [Full Setup](/configuration/persistent#director-service) for details.
* `../screenshots/azure-blob-storage.driver`- use Minio. See [Full Setup](/configuration/persistent#director-service) for details.
*

### AWS S3 Remote Storage Configuration

Refer to [AWS S3 Configuration.](/configuration/director-configuration/aws-s3-configuration)

### Minio Configuration

Read [Minio Configuration](/configuration/director-configuration/minio-configuration) for Director

### Azure Blob Storage Configuration

Refer to [Azure Blob Storage Configuration](/configuration/director-configuration/azure-blob-storage-configuration)

## Probe logs

`PROBE_LOGGER=false`

Enable or disable Director healthchecks logs.


# AWS Role Assumption via Service Account

Director AWS Role Based Authentication

Service Account Name

`serviceAccountName=""`

In case of role based authentication, a service account that is annotated with a trust relationship should be used. A service account K8s object should be deployed, and annotated as per [the AWS docs](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-technical-overview.html).

The service account should be linked to an IAM role, with the end goal of the director assuming the role, therefore having access to the appropriate AWS resources (eg. an S3 bucket with test artifacts)


# AWS S3 Configuration

Director AWS S3 configuration

`AWS_ACCESS_KEY_ID=null`

AWS Access Key

`AWS_SECRET_ACCESS_KEY=null`

AWS Secret\\

`S3_BUCKET="sorry-cypress"`

AWS S3 Bucket name

`S3_REGION="us-east-1"`

AWS S3 Region

`S3_ACL="public-read"`

[AWS S3 ACL](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectAcl.html) for `putObject` operation

`S3_READ_URL_PREFIX=null`

Custom prefix for generating "read" URL for generated artifacts. By default, the read `${S3_BUCKET}.s3.amazonaws.com/${objectKey}`, if `S3_READ_URL_PREFIX`is set, then it becomes `${S3_READ_URL_PREFIX}/${objectKey}`

`S3_IMAGE_KEY_PREFIX=null`

Custom prefix for stored images, if set the prefix will be applied e.g.: `${S3_BUCKET}.s3.amazonaws.com/${S3_IMAGE_KEY_PREFIX}${objectKey}`

`S3_VIDEO_KEY_PREFIX=null`

Custom prefix for stored videos, if set the prefix will be applied e.g.: `${S3_BUCKET}.s3.amazonaws.com/${S3_VIDEO_KEY_PREFIX}${objectKey}`

```typescript
UPLOAD_EXPIRY_SECONDS=90
```

The expiration time for signed upload URLs to be valid. The director service generates the signed URLs that clients use for uploading the artifacts.


# Minio Configuration

Minio and Sorry Cypress

Minio is an awesome tool that allows using local storage (or any other supported provider) instead of AWS S3.

Sorry-cypress integrates with the major remote cloud storage solution via [Minio S3 Gateway](https://docs.min.io/docs/minio-gateway-for-s3.html), that is compatible with:

* Google Cloud Storage
* IBM COS
* Azure Blob Storage
* NAS
* HDFS
* Local storage

In order to use minio as storage driver provider, you need to configure director service

```
SCREENSHOTS_DRIVER="../screenshots/minio.driver"
```

And also provide other configuration options (see below).

#### Configuration Options

{% hint style="danger" %}
Treat your Minio keys and secrets AWS credentials and hide them.
{% endhint %}

{% hint style="info" %}
Refer to[`docker-compose.minio.yml`](https://github.com/sorry-cypress/sorry-cypress/blob/master/docker-compose.minio.yml)for Minio setup example.
{% endhint %}

`MINIO_ACCESS_KEY="defaultAccessKey"`

Minio Access Key

`MINIO_SECRET_KEY="defaultSecret"`

Minio Secret

`MINIO_BUCKET="sorry-cypress"`

Bucket name for storing generated artifacts. Please make sure that the bucket is created and configured properly before using it.

`MINIO_URL="https://storage.yourdomain.com"`

The public URL used for public read access to the stored screenshots and videos. This URL should be available from your browser and it will be used to fetch generated screenshots and videos.

`MINIO_PORT=9000`

Port that `director` and cypress agents will use to communicate with Minio.

`MINIO_ENDPOINT="storage.yourdomain.com"`

Hostname or IP address that **both `director` and cypress agents** (see the detailed explanation below) will use to communicate with `minio` service.

* Please make sure that your network configuration allows access to Minio resource for cypress agents and for Director service
* To run on the local machine, edit your `/etc/hosts` file to allow cypress agents discover the local instance of Minio `127.0.0.1 localhost`

`MINIO_READ_URL_PREFIX=null`

You can override the whole read URL, including the bucket name using this variable. Most chances you won't need it, if you do, see the [source code](https://github.com/sorry-cypress/sorry-cypress/blob/master/packages/director/src/screenshots/minio/minio.ts#L42).

`MINIO_UPLOAD_URL_PREFIX=null`

Override the upload URL. The updated URL is not valid because the host is part of the presigned url signature. A reverse proxy, ingress controller or api gateway will be responsible for reversing this translation, into the original URL, before passing the upload request to Minio. For example by setting the `Host` header to the backend hostname.

`MINIO_USESSL="false"`

Whether `director` should use SSL for communicating with `minio`.

```typescript
UPLOAD_EXPIRY_SECONDS=90
```

The expiration time for signed upload URLs to be valid. The director service generates the signed URLs that clients use for uploading the artifacts.

### Caveats of using Minio

I have seen people being challenged by configuring minio and sorry cypress for non-trivial use cases.

We need to understand first how cypress uploads videos and screenshots to remote storage to be aware of limitations and caveats.

1. When cypress finishes running a spec file, it reports the results to sorry-cypress (director service)
2. Director service analyzes the results and, if needed, generates a **signed upload URL** for each asset, using `MINIO_ENDPOINT` and `MINIO_PORT`configuration variables (see below). That means:
   1. Director should be able to access minio service within your network configuration using `MINIO_ENDPOINT` and `MINIO_PORT`
   2. Once the signed upload URL is generated it only can be used **using the same hostname, port and path** that were used to generate it
3. Director sends back to cypress agent the list of signed upload URLs
4. Cypress agent uploads the assets using the signed upload URLs. For successful upload:
   1. Cypress agent should be able to access the signed upload URL that was generated earlier
   2. You must not modify the URL, otherwise the signature wouldn't match and the upload requests would fail
5. Eventually, a browser will try to read the assets uploaded during steps 1-4. Since the read operation doesn't require signed URL, we have more freedom to use different URLs for read request - see `MINIO_URL` and `MINIO_READ_URL_PREFIX`

![](/files/-Mhgs_T6ZWJeAByW9G_z)

{% hint style="info" %}
Part of a Signed Upload URL is a unique signature, the signature contains

* hostname + port
* path

Minio verifies that all elements if the signature match when serving upload reqests, otherwise the requests fail
{% endhint %}

The implications of this flow (and where most people are getting confused) are:

* Director and cypress agents have to use the same hostname to access minio
* Director and cypress should be able to access minio service using the hostname and port you've defined

Here are two most common scenarios of misconfigured network:

#### Scenario A

Minio service is available as `storage` and port is `9000` within your docker-compose. network. director will generate a signed URL that looks like `http://storage:9000/bucket/key...`

Cypress agents will try to upload their files use the URL 👆🏻, if they cannot reach minio service using that URL, the upload request will fail 😈

**Scenario B**

You've configured and verified that minio service is available at <http://storage.yourcompany.com> for cypress agents (external network). However, your docker-compose network doesn't have a proper DNS configuration, and director cannot reach minio service at <http://storage.yourcompany.com>. Director will silently fail to connect to minio and won't return any upload URLs. 😈

#### What should I do then?

As long as you're able to configure your network so that director and cypress agents can reliable access minio using exactly the same URL, every solution would work.

If you have a simple and proven solution, please consider sharing.


# Azure Blob Storage Configuration

Azure Blob Storage and Sorry Cypress

[Azure Blob Storage](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction) is the object storage solution provided by Microsoft, like S3 is provided by AWS.

Sorry Cypress can use an Azure Blob Storage container in order to stores the screenshots and videos taken during tests.

In order to use minio as storage driver provider, you need to configure director service

```
SCREENSHOTS_DRIVER="../screenshots/azure-blob-storage.driver"
```

You also need to patch the cypress runner code using [cy2-azure](https://github.com/sorry-cypress/cy2-azure). The package will modify the runner code called when uploading a file in order to add specific headers needed by Azure Blob Storage.

Please note that the implementation of Azure Blob Storage uses signed URLs for both writing and reading operations. This means that your container does not need to be public. It also means that both type of URLs will expire. Signed URLs used for writing will expire after the time set using `AZURE_UPLOAD_URL_EXPIRY_IN_HOURS` (defaults to a day). Signed URLs used for reading will expire after a year, which is the maximum duration.

#### Configuration Options

{% hint style="danger" %}
Treat your connexion string as a secret and hide it.
{% endhint %}

{% hint style="info" %}
Refer to[`docker-compose.azure-blob-storage.yml`](https://github.com/sorry-cypress/sorry-cypress/blob/master/docker-compose.azure-blob-storage.yml)for setup example.
{% endhint %}

`AZURE_CONNEXION_STRING="*********"`

Connexion string to your Azure Blob Storage Account (documentation [here](https://docs.microsoft.com/en-us/azure/storage/common/storage-configure-connection-string))

`AZURE_UPLOAD_URL_EXPIRY_IN_HOURS="24"`

Duration during which the signed upload urls stay valid.

`AZURE_CONTAINER_NAME="sorry-cypress"`

Container name for storing generated artifacts. Please make sure that the container is created and configured properly before using it.

Azure Blob Storage has the same caveats as [MinIO](/configuration/director-configuration/minio-configuration) : the hostname is part of the signed URL. Please see the Minio documentation to understand the implications in terms of network configuration.


# API Service

API service configuration options

`PORT=1234`

API service port

`PAGE_ITEMS_LIMIT=10`

Default number of items to serve for runs feed

`APOLLO_PLAYGROUND=false`

Enable or disable Apollo playground landing page

`BASE_PATH="/graphql"`

Service's base path, useful for reverse proxies

### MongoDB Connection Settings

Refer to [MongoDB Configuration](/configuration/mongodb-configuration).


# Web Dashboard

Web Dashboard service configuration


# Configuration

`PORT=8080`

Dashboard will listen on that port

`GRAPHQL_SCHEMA_URL="http://localhost:4000"`

The publicly accessible URL of API service. GraphQL client will use it to pull schema definitions and issue queries.

`CI_URL=Link name,https://your.ci.service/project/{project_id}/build/{build_id}`

Set optional environment variable `CI_URL` to add a link to your CI tool.

* `Link name` is the link name, for example: `Travis CI`, `Drone CI`, `Circle CI`.
* `{project_id}` is a template tag for cypress project name - will be injected dynamically.
* `{build_id}` is a template tag for ID passed to cypress via `--ci-build-id` parameter - will be injected dynamically.

Example:

![](/files/-MSRWvCmu2Z6ggz8bjq4)


# MongoDB Configuration

Configuration entries are similar for API and for Director services

`MONGODB_URI="mongodb://mongo:27017"`

MongoDB connection URL, required if using "mongo" execution driver.

`MONGODB_DATABASE="sorry-cypress"`

MongoDB database name, required if using "mongo" execution driver.

`MONGODB_TLS`

TLS connection settings, settings to `true` will enable TLS for MongoDB connection

`MONGODB_AUTH_MECHANISM`

MongoDB authentication mechanism. See [MongoDB Authentication](https://mongodb.github.io/node-mongodb-native/3.0/tutorials/connect/authenticating/).

`MONGODB_USER`

MongoDB authentication user, when `MONGODB_AUTH_MECHANISM` is non-empty

`MONGODB_PASSWORD`

MongoDB authentication `password`, when `MONGODB_AUTH_MECHANISM` is non-empty

\`\`


# Troubleshooting

Common questions and setup issues

This is a collection of most common questions associated with Sorry Cypress setup

### Can I use a private AWS S3 bucket with sorry-cypress?

Yes! In orther to use a private S3 bucket with sorry-cypress, you need to create a bucket with the following:

1. A `public-read` ACL
2. Public Access Block should be:

```
block_public_acls       = false
block_public_policy     = true
ignore_public_acls      = false
restrict_public_buckets = true
```

1. A bucket resource policy making it private. You can restrict bucket access based on the source IP, or only from sources in your private VPC, for example.

Please refer to the [`s3.tf`](https://github.com/feedzai/terraform-aws-sorry-cypress/blob/main/s3.tf) file in the [`terraform-aws-sorry-cypress`](https://github.com/feedzai/terraform-aws-sorry-cypress) module to find and example of an S3 bucket configuration.

Please refer to the following scheme for reference.

1. **Upload flow:** Cypress runner reports its results to director service
2. Director service get [signed S3 upload URL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html) from the configured AWS S3 bucket (or any other object storage compatible service - e.g. [minio](/configuration/director-configuration/minio-configuration))
3. Director service sends back the signed S3 upload URL, stores the read URL in a DB
4. Cypress runner uses the signed upload URL to upload the screenshots / videos
5. **Read flow:** a browser reads the test results and uses the read URL from a DB
6. AWS S3 returns the content to the browser

![Cypress AWS S3 upload / read flow](/files/3Eb6dXrkjm9Hz1ZXUe5w)

### Cypress Parallelization is not working - I see a separate build for each machine

* Please make sure you understand how [CI Build ID](https://currents.dev/readme/guides/cypress-ci-build-id) affects [Parallelization](https://currents.dev/readme/guides/parallelization)
* Please make sure your MongoDB instance has all the [indexes defined](https://github.com/sorry-cypress/sorry-cypress/blob/master/packages/mongo/src/db.ts#L72). The indexes are required for parallelization to work.

### Why isn't Sorry Cypress Dashboard working? I cannot see test results!

Most chances something is wrong with your setup or the way you're connecting to sorry-cypress. Try following the next steps for troubleshooting before submitting support requests.

* Make sure Sorry Cypress services are up and running
  * Director service is reachable, is connected to the right DB and it logs the requests
  * API service is reachable and is connected to the right DB and it logs the requests
  * Dashboard loads with empty results
* Ensure you're [reconfiguring cypress](/integrating-cypress/cy2) to use Director's service URL.
  * Run cypress in debug mode `DEBUG=cypress:server:*` to see the details of network requests - the debug mode works both when running `cypress` and `cy2`
  * Examine Director service log files to see the incoming requests
* Examine the logs files
  * Run cypress runner in debug mode - `DEBUG=cypress:server:* cypress run ...`
  * Examine sorry-cypress log files and identify the requests / responses that are not working as expected
* Check out available [Support](/support) options if you still need help. Collect all the relevant logs, configuration, describe the desired and the actual results.

###


# Events

Sorry-cypress provides integration with popular 3rd party tools - it reports test runs progress together with results.

The following events are supported:

* `RUN_START` - run has started
* `INSTANCE_START` - a spec file started execution
* `INSTANCE_FINISH` - a spec file reported completion
* `RUN_FINISH` - runs finished after reaching [Inactivity Timeout](https://github.com/sorry-cypress/gitbook/blob/master/integrations/broken-reference/README.md)

You can edit the integration individually for each project via dashboard or an HTTP `POST` to director if using Getting Started setup (in-memory database).

See the detailed documentation for each integration type.


# Webhooks

Sorry-cypress will send a `POST` HTTP request to a URL with a JSON payload.

```typescript
// Payload schema
{
  event: "INSTANCE_FINISH" | "INSTANCE_START" | "RUN_START" | "RUN_FINISH";
  runUrl: string;
  failures: number;
  passes: number;
  skipped: number;
  tests: number;
  pending: number;
  wallClockDurationSeconds: number;
}
```

Use the web dashboard Project Settings to add or edit Generic Webhook Integration

![](/files/-MV_EeZ_mFL9qkuV6Sll)

If you are using the in-memory director and do not have a dashboard you can add webhooks to your project via a `POST` to `/hooks` route to your director. Ensure your "projectId" matches that in your cypress.json or cypress.config.js that you wish to add hooks to. Note this will replace all the hooks for the given projectId.

```
//Example POST body to localhost:1234/hooks

{
  "projectId": "test",
  "hooks": [
    {
      "hookId": "1",
      "headers": "{\"some\":\"thing\"}",
      "url": "http://localhost:3005",
      "hookEvents": [
        "INSTANCE_FINISH",
        "RUN_FINISH"
      ],
      "hookType": "GENERIC_HOOK"
    }
  ]
}

```


# Slack Integration

Sorry-cypress integrates with [Slack Webhooks API](https://api.slack.com/messaging/webhooks). Use the web dashboard Project Settings to add or edit Slack Integration. Also you can filter messages by event type, by test suite result and by branch.

![](/files/-MYJlJhguUdvevygAbaB)

Here's an example of Slack message posted by sorry-cypress:

![](/files/-MYJs3KXUTIvTlHfUyW6)

If you are using the in-memory director and do not have a dashboard you can add hooks to your project via a HTTP `POST` to the `/hooks` route of your director.. Ensure your "projectId" matches that in your cypress.json or cypress.config.js that you wish to add hooks to. Note this will replace all the hooks for the given projectId.

```
//Example POST body to localhost:1234/hooks

{
  "projectId": "test",
  "hooks": [
    {
      "hookId": "1",
      "url": "http://localhost:3005",
      "username": "user",
      "hookEvents": [
        "INSTANCE_FINISH",
        "RUN_FINISH"
      ],
      "hookType": "SLACK_HOOK",
      "slackResultFilter": "ONLY_FAILED"
      "slackBranchFilter": ["main"]
    }
  ]
}

```


# GitHub Integration

Integrating with Github allows reporting [status check](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-status-checks) for your commits and pull requests. Use the web dashboard Project Settings to add or edit Github Integration.

![Example of Github Integration](/files/-MV_Ftenste6wk7rX6gE)

Sorry-cypress would update commit status to failure / success and provide a short tests summary status.

![](/files/-MV_H6RbxdomADTr7Bbv)

If you are using the in-memory director and do not have a dashboard you can add hooks to your project via a HTTP `POST` to the `/hooks` route of your director.. Ensure your "projectId" matches that in your cypress.json or cypress.config.js that you wish to add hooks to. Note this will replace all the hooks for the given projectId.

```
//Example POST body to localhost:1234/hooks

{
  "projectId": "test",
  "hooks": [
    {
      "hookId": "1",
      "url": "http://localhost:3005",
      "hookType": "GITHUB_STATUS_HOOK",
      "githubAuthType": "token",
      "githubToken": "token",
      "githubContext": "context",
      "githubAppPrivateKey": "key",
      "githubAppId": "id",
      "githubAppInstallationId": "installId"
    }
  ]
}

```


# BitBucket Integration

Integrating with Bitbucket allows [reporting build status](https://developer.atlassian.com/server/bitbucket/how-tos/updating-build-status-for-commits/) for your commits and pull requests. Use the web dashboard Project Settings to add or edit Bitbucket Integration.

{% hint style="info" %}
**Please note:** Bitbucket app password should have at least "Repositories:write" permissions
{% endhint %}

![Example of Bitbucket Integration](/files/-MV_HNmAfVGXXPfZSGVj)

Sorry-cypress would update build status to failure / success.

![](/files/-MV_HwXjnPdCBxM0G_NU)

If you are using the in-memory director and do not have a dashboard you can add hooks to your project via a HTTP `POST` to the `/hooks` route of your director. Ensure your "projectId" matches that in your cypress.json or cypress.config.js that you wish to add hooks to. Note this will replace all the hooks for the given projectId.

```
//Example POST body to localhost:1234/hooks

{
  "projectId": "test",
  "hooks": [
    {
      "hookId": "1",
      "url": "http://localhost:3005",
      "hookType": "BITBUCKET_STATUS_HOOK",
      "bitbucketUsername": "username",
      "bitbucketToken": "token",
      "bitbucketBuildName": "build"
    }
  ]
}

```


# MS Teams Integration

Sorry-cypress integrates with [MS Teams Webhooks](https://docs.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook). Use the web dashboard Project Settings to add or edit Teams Integration. Also you can filter messages by event type.

![](/files/-MlONgkJEfiHCKnsqir6)

If you are using the in-memory director and do not have a dashboard you can add hooks to your project via a HTTP `POST` to the `/hooks` route of your director. Ensure your "projectId" matches that in your cypress.json or cypress.config.js that you wish to add hooks to. Note this will replace all the hooks for the given projectId.

```
//Example POST body to localhost:1234/hooks

{
  "projectId": "test",
  "hooks": [
    {
      "hookId": "1",
      "url": "http://localhost:3005",
      "hookEvents": [
        "INSTANCE_FINISH",
        "RUN_FINISH"
      ],
      "hookType": "TEAMS_HOOK"
    }
  ]
}

```


# Parallelization Explained

{% hint style="info" %}
EDIT: Check out the new parallelization guide available at <https://currents.dev/readme/guides/parallelization>
{% endhint %}

Parallelizing cypress tests means running different tests with multiple cypress agents at the same time. The [official Cypress documentation](https://docs.cypress.io/guides/guides/parallelization.html) greatly explains why is it good. In short, it allows to greatly reduce the overall time of running your tests.

![Parallelization diagram](/files/-MVeLqahRla6eLMREFLr)

When an agent is configured to run tests in parallel, it tries to connect to a remote service to coordinate the tests running order. Sorry-cypress is such a service.

It coordinates requests from cypress agents, providing each agent with different tests to run. It also collects test results for browsing.

You will still need to set up (and pay for) a CI environment that runs cypress agents.

When using sorry-cypress you'll need to [override the default configuration](/integrating-cypress/configuring-cypress-agent) to set an alternative URL for contacting the remote dashboard.


# Flaky Tests

Guide to Cypress Flaky Tests

### What is flaky cypress test?

Flaky cypress test is a test that did not succeed from the first attempt. The build will fail only occasionally: One time it will pass, another time fail, the next time pass again, without any changes to the build having been made. Flaky tests are marked with a special badge on run, spec and individual test level.

### How to activate flaky tests detection?

Flaky tests are automatically activated for all cypress tests with [retries](https://docs.cypress.io/guides/guides/test-retries#How-It-Works) enabled. When a test has retries enabled and doesn't not pass from the first attempt, it will be marked as flaky.


# Test Details

Test details and metadata - git, environment, link to CI Run

![Cypress test details example](/files/z57MrOrxCJ4DQnXlq7yw)

| Field          | Description                                     |
| -------------- | ----------------------------------------------- |
| Status         | [Test Status](/concepts/test-status)            |
| Test File Path | The full path of the test file                  |
| Duration       | Test duration                                   |
| CI Run URL     | The URL of the CI job running the Cypress tests |
| Browser        | Cypress tests browser                           |

### CI Run URL

An environment variable is used to get the CI Run URL. It needs to be set before the Cypress tests start running in the CI configuration file. Here's an example of how to obtain the URL with [Github Actions](https://currents.dev/posts/github-actions-cypress-job-url).

```
CI_RUN_URL = https://github.com/owner/repo/actions/runs/run_id/job/job_id
```


# Test Status

Cypress Test Statuses - detailed guide and explanation

### Possible Cypress Tests Statuses

A cypress test can be in one of the following states:

* <mark style="color:blue;">**Passed**</mark> - a test successfully completed all attempts without any exceptions or errors during its execution
* <mark style="color:red;">**Failed**</mark> - a test that triggered an exception or one of its assertions failed for all of its attempts
* **Ignored / Pending** - a test was excluded by a developer, e.g. `it.skip()` and was excluded by cypress runner
* <mark style="color:orange;">**Skipped**</mark> - a test was not excluded by a developer, but wasn't run by cypress runner due to an error
* <mark style="background-color:purple;">**Flaky**</mark> - a test that passed after a few failing attempts

### Passing Tests

A passed test was successfully executed by cypress runner, including all `before` and `beforeEach` expressions. During its execution, the test runner didn't encounter any timeouts, exceptions or failed assertions.

Please note, for tests with multiple attempts, if the last attempt was successful, the whole test will be marked as "Passed" but "Flaky". See [Flaky Tests](/concepts/flaky-tests) for details.

### Failing Tests

A failing test is a test that has either triggered an exception, failed assertion or a timeout during the execution of `before`, `beforeEach` or the test body for each of its attempts.

By default, when a test fails, Cypress will take a screenshot and a video recording capturing the failure. Both will be shown in the test details page.

### **Ignored / Pending Tests**

`Ignored/pending` tests are tests that were:

* explicitly marked by a developer to be excluded, e.g. `it.skip(),` `describe.skip()` or `xit()`
* a test that is not implemented - i.e. a test that has no "body". For example, `it('nothing is here')`
* a test suite that was filtered out in [test/suite configuration](https://docs.cypress.io/guides/core-concepts/writing-and-organizing-tests#Test-Configuration), for example:

```javascript
describe('Skip in Chrome', { browser: '!chrome' }, () => {/* ... */})
```

### Skipped Tests

A skipped test is a test that **was supposed to run but has been skipped** because of a runtime error.

One of the most common examples is a situation where there's a crash in `beforeEach.` After unsuccessfully running the first test and recognizing an error in `beforeEach,` Cypress runner "skips" the rest of the tests because they would fail due to the same error.


# GitHub Actions

{% hint style="danger" %}
Under construction
{% endhint %}

<https://github.com/sorry-cypress/sorry-cypress/issues/46>


# Travis

{% hint style="danger" %}
Under construction
{% endhint %}


# Jenkins

{% hint style="danger" %}
Under construction
{% endhint %}


# AWS Codebuild


# Changelog

Sorry Cypress changelog

### v2.6.0

#### What's Changed

* fix: resolve multiple illegal characters in document keys by [@liamchilds](https://github.com/liamchilds) in [#881](https://github.com/sorry-cypress/sorry-cypress/pull/881)
* feat(minio): support for upload to proxied minio by [@erikmartino](https://github.com/erikmartino) in [#876](https://github.com/sorry-cypress/sorry-cypress/pull/876)
* docs: add erikmartino as a contributor for code by [@allcontributors](https://github.com/allcontributors) in [#882](https://github.com/sorry-cypress/sorry-cypress/pull/882)
* Cypress 13 Compatibility for the Dashboard and Director by [@Roemer](https://github.com/Roemer) in [#892](https://github.com/sorry-cypress/sorry-cypress/pull/892)

#### New Contributors

* [@liamchilds](https://github.com/liamchilds) made their first contribution in [#881](https://github.com/sorry-cypress/sorry-cypress/pull/881)
* [@erikmartino](https://github.com/erikmartino) made their first contribution in [#876](https://github.com/sorry-cypress/sorry-cypress/pull/876)

**Full Changelog**: [v2.5.11...v2.6.0](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.11...v2.6.0)

## v2.5.11

### What's Changed

* build(deps): bump systeminformation from 5.8.7 to 5.21.8 by [@dependabot](https://github.com/dependabot) in [#857](https://github.com/sorry-cypress/sorry-cypress/pull/857)
* Issues 862 : Add button to see background color & running tests by [@samixchoumi](https://github.com/samixchoumi) in [#863](https://github.com/sorry-cypress/sorry-cypress/pull/863)

**Full Changelog**: [v2.5.10...v2.5.11](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.10...v2.5.11)

## v2.5.10

### What's Changed

* build(deps): bump apollo-server-core from 3.11.1 to 3.12.1 by [@dependabot](https://github.com/dependabot) in [#846](https://github.com/sorry-cypress/sorry-cypress/pull/846)
* build(deps): bump mongodb from 3.6.8 to 3.6.10 by [@dependabot](https://github.com/dependabot) in [#847](https://github.com/sorry-cypress/sorry-cypress/pull/847)
* Count all groups of a run for projects view by [@agoldis](https://github.com/agoldis) in [#852](https://github.com/sorry-cypress/sorry-cypress/pull/852)
* build(deps): change pac-resolver to 7.0.0 by [@mathpaquette](https://github.com/mathpaquette) in [#856](https://github.com/sorry-cypress/sorry-cypress/pull/856)
* Add a background color for each project of /project page by [@samixchoumi](https://github.com/samixchoumi) in [#842](https://github.com/sorry-cypress/sorry-cypress/pull/842)
* docs: add samixchoumi as a contributor for code by [@allcontributors](https://github.com/allcontributors) in [#855](https://github.com/sorry-cypress/sorry-cypress/pull/855)

**Full Changelog**: [v2.5.9...v2.5.10](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.9...v2.5.10)

## v2.5.9

### What's Changed

* build(deps): bump word-wrap from 1.2.3 to 1.2.4 by [@dependabot](https://github.com/dependabot) in [#823](https://github.com/sorry-cypress/sorry-cypress/pull/823)
* Make CFT more robust by [@crux-capacitor](https://github.com/crux-capacitor) in [#812](https://github.com/sorry-cypress/sorry-cypress/pull/812)
* docs: add crux-capacitor as a contributor for infra, and doc by [@allcontributors](https://github.com/allcontributors) in [#826](https://github.com/sorry-cypress/sorry-cypress/pull/826)
* Update slack.ts for improved newline formatting by [@amartinez1558](https://github.com/amartinez1558) in [#838](https://github.com/sorry-cypress/sorry-cypress/pull/838)
* Issues 804 : Add test chips status to projectList view by [@samixchoumi](https://github.com/samixchoumi) in [#833](https://github.com/sorry-cypress/sorry-cypress/pull/833)

### New Contributors

* [@crux-capacitor](https://github.com/crux-capacitor) made their first contribution in [#812](https://github.com/sorry-cypress/sorry-cypress/pull/812)
* [@amartinez1558](https://github.com/amartinez1558) made their first contribution in [#830](https://github.com/sorry-cypress/sorry-cypress/pull/830)
* [@samixchoumi](https://github.com/samixchoumi) made their first contribution in [#833](https://github.com/sorry-cypress/sorry-cypress/pull/833)

**Full Changelog**: [v2.5.8...v2.5.9](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.8...v2.5.9)

## v2.5.8

### What's Changed

* \[Snyk] Security upgrade semver from 7.3.5 to 7.5.2 by [@agoldis](https://github.com/agoldis) in [#800](https://github.com/sorry-cypress/sorry-cypress/pull/800)
* fix: fix parsing UPLOAD\_EXPIRY\_SECONDS by [@agoldis](https://github.com/agoldis) in [#813](https://github.com/sorry-cypress/sorry-cypress/pull/813)
* build(deps): bump fast-xml-parser from 4.2.4 to 4.2.5 by [@dependabot](https://github.com/dependabot) in [#814](https://github.com/sorry-cypress/sorry-cypress/pull/814)
* build(deps): bump tough-cookie from 4.0.0 to 4.1.3 by [@dependabot](https://github.com/dependabot) in [#815](https://github.com/sorry-cypress/sorry-cypress/pull/815)
* build(deps): bump semver from 7.3.2 to 7.5.2 by [@dependabot](https://github.com/dependabot) in [#803](https://github.com/sorry-cypress/sorry-cypress/pull/803)
* Start building Arm64 Docker image by [@pavlospt](https://github.com/pavlospt) in [#759](https://github.com/sorry-cypress/sorry-cypress/pull/759)
* docs: add pavlospt as a contributor for code \[skip ci] by [@allcontributors](https://github.com/allcontributors) in [#817](https://github.com/sorry-cypress/sorry-cypress/pull/817)
* Add Google Cloud Storage native driver by [@mauriciovillalobos](https://github.com/mauriciovillalobos) in [#807](https://github.com/sorry-cypress/sorry-cypress/pull/807)
* docs: add mauriciovillalobos as a contributor for code, and doc \[skip ci] by [@allcontributors](https://github.com/allcontributors) in [#818](https://github.com/sorry-cypress/sorry-cypress/pull/818)
* fix: remove deprecated S3 ACL from CF \[skip ci] by [@agoldis](https://github.com/agoldis) in [#819](https://github.com/sorry-cypress/sorry-cypress/pull/819)

### New Contributors

* [@pavlospt](https://github.com/pavlospt) made their first contribution in [#759](https://github.com/sorry-cypress/sorry-cypress/pull/759)
* [@mauriciovillalobos](https://github.com/mauriciovillalobos) made their first contribution in [#807](https://github.com/sorry-cypress/sorry-cypress/pull/807)

**Full Changelog**: [v2.5.7...v2.5.8](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.7...v2.5.8)

## v2.5.7

### What's Changed

* fix: properly resolve UPLOAD\_EXPIRY\_SECONDS value by [@agoldis](https://github.com/agoldis) in [#799](https://github.com/sorry-cypress/sorry-cypress/pull/799)

**Full Changelog**: [v2.5.6...v2.5.7](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.6...v2.5.7)

## v2.5.6

### What's Changed

* feat: add UPLOAD\_EXPIRY\_SECONDS for signed URL by [@agoldis](https://github.com/agoldis) in [#794](https://github.com/sorry-cypress/sorry-cypress/pull/794)

**Full Changelog**: [v2.5.5...v2.5.6](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.5...v2.5.6)

## v2.5.5

### What's Changed

* build(deps): bump vm2 from 3.9.16 to 3.9.17 by [@dependabot](https://github.com/dependabot) in [#776](https://github.com/sorry-cypress/sorry-cypress/pull/776)
* build(deps): bump vm2 from 3.9.17 to 3.9.19 by [@dependabot](https://github.com/dependabot) in [#782](https://github.com/sorry-cypress/sorry-cypress/pull/782)
* build(deps): bump fast-xml-parser from 4.2.0 to 4.2.4 by [@dependabot](https://github.com/dependabot) in [#789](https://github.com/sorry-cypress/sorry-cypress/pull/789)
* fix: prevent crash when attempts are missing by [@agoldis](https://github.com/agoldis) in [#792](https://github.com/sorry-cypress/sorry-cypress/pull/792)

**Full Changelog**: [v2.5.4...v2.5.5](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.4...v2.5.5)

## v2.5.4

### What's Changed

* \[Snyk] Security upgrade minio from 7.0.28 to 7.0.33 by [@agoldis](https://github.com/agoldis) in [#763](https://github.com/sorry-cypress/sorry-cypress/pull/763)
* build(deps): bump vm2 from 3.9.13 to 3.9.15 by [@dependabot](https://github.com/dependabot) in [#767](https://github.com/sorry-cypress/sorry-cypress/pull/767)
* build(deps-dev): bump webpack from 5.64.0 to 5.76.0 by [@dependabot](https://github.com/dependabot) in [#758](https://github.com/sorry-cypress/sorry-cypress/pull/758)
* build(deps): bump vm2 from 3.9.15 to 3.9.16 by [@dependabot](https://github.com/dependabot) in [#769](https://github.com/sorry-cypress/sorry-cypress/pull/769)
* \[Snyk] Security upgrade @azure/storage-blob from 12.10.0 to 12.13.0 by [@snyk-bot](https://github.com/snyk-bot) in [#768](https://github.com/sorry-cypress/sorry-cypress/pull/768)
* build(deps): bump ua-parser-js from 0.7.28 to 0.7.33 by [@dependabot](https://github.com/dependabot) in [#730](https://github.com/sorry-cypress/sorry-cypress/pull/730)
* fix: patch security warnings, upgrade husky by [@agoldis](https://github.com/agoldis) in [#770](https://github.com/sorry-cypress/sorry-cypress/pull/770)

**Full Changelog**: [v2.5.3...v2.5.4](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.3...v2.5.4)

## v2.5.2

### What's Changed

* allow use s3 in path style by [@thuvh](https://github.com/thuvh) in [#712](https://github.com/sorry-cypress/sorry-cypress/pull/712)
* fix: update docker-compose.minio.yml file by [@Zaista](https://github.com/Zaista) in [#708](https://github.com/sorry-cypress/sorry-cypress/pull/708)
* build(deps): bump fast-json-patch from 3.1.0 to 3.1.1 by [@dependabot](https://github.com/dependabot) in [#715](https://github.com/sorry-cypress/sorry-cypress/pull/715)
* docs: add amit-o as a contributor for code by [@allcontributors](https://github.com/allcontributors) in [#720](https://github.com/sorry-cypress/sorry-cypress/pull/720)
* Add base path overrides by [@amit-o](https://github.com/amit-o) in [#718](https://github.com/sorry-cypress/sorry-cypress/pull/718)
* Fix api base path, add tests by [@amit-o](https://github.com/amit-o) in [#728](https://github.com/sorry-cypress/sorry-cypress/pull/728)
* docs: add blakeromano as a contributor for code by [@allcontributors](https://github.com/allcontributors) in [#736](https://github.com/sorry-cypress/sorry-cypress/pull/736)
* build(deps): bump http-cache-semantics from 4.1.0 to 4.1.1 by [@dependabot](https://github.com/dependabot) in [#733](https://github.com/sorry-cypress/sorry-cypress/pull/733)
* Turborepo by [@nmengual](https://github.com/nmengual) in [#741](https://github.com/sorry-cypress/sorry-cypress/pull/741)
* docs: add nmengual as a contributor for code \[skip ci] by [@allcontributors](https://github.com/allcontributors) in [#746](https://github.com/sorry-cypress/sorry-cypress/pull/746)

### New Contributors

* [@thuvh](https://github.com/thuvh) made their first contribution in [#712](https://github.com/sorry-cypress/sorry-cypress/pull/712)
* [@amit-o](https://github.com/amit-o) made their first contribution in [#718](https://github.com/sorry-cypress/sorry-cypress/pull/718)
* [@kuznar](https://github.com/kuznar) made their first contribution in [#721](https://github.com/sorry-cypress/sorry-cypress/pull/721)
* [@blakeromano](https://github.com/blakeromano) made their first contribution in [#735](https://github.com/sorry-cypress/sorry-cypress/pull/735)
* [@nmengual](https://github.com/nmengual) made their first contribution in [#741](https://github.com/sorry-cypress/sorry-cypress/pull/741)

**Full Changelog**: [v2.5.1...v2.5.2](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.1...v2.5.2)

## v2.5.1

### What's Changed

* feat: Add screenshot zoom in/out on preview functionality by [@matrunchyk](https://github.com/matrunchyk) in [#700](https://github.com/sorry-cypress/sorry-cypress/pull/700)

### New Contributors

* [@matrunchyk](https://github.com/matrunchyk) made their first contribution in [#700](https://github.com/sorry-cypress/sorry-cypress/pull/700)

**Full Changelog**: [v2.5.0...v2.5.1](https://github.com/sorry-cypress/sorry-cypress/compare/v2.5.0...v2.5.1)

## v2.5.0

### What's Changed

* build(deps): bump loader-utils from 1.4.1 to 1.4.2 by [@dependabot](https://github.com/dependabot) in [#685](https://github.com/sorry-cypress/sorry-cypress/pull/685)
* build(dashboard): switch to nginx unprivileged docker by [@mathpaquette](https://github.com/mathpaquette) in [#691](https://github.com/sorry-cypress/sorry-cypress/pull/691)
* docs: add Spea as a contributor for code \[skip ci] by [@allcontributors](https://github.com/allcontributors) in [#693](https://github.com/sorry-cypress/sorry-cypress/pull/693)
* Add new app authentication mechanism for github hooks by [@Spea](https://github.com/Spea) in [#688](https://github.com/sorry-cypress/sorry-cypress/pull/688)
* build(deps): bump apollo-server-core from 3.10.1 to 3.11.1 by [@dependabot](https://github.com/dependabot) in [#692](https://github.com/sorry-cypress/sorry-cypress/pull/692)
* Only install necessary octokit packages by [@Spea](https://github.com/Spea) in [#696](https://github.com/sorry-cypress/sorry-cypress/pull/696)
* Adjust github reporter tests and support enterprise URL by [@Spea](https://github.com/Spea) in [#698](https://github.com/sorry-cypress/sorry-cypress/pull/698)

### New Contributors

* [@Spea](https://github.com/Spea) made their first contribution in [#688](https://github.com/sorry-cypress/sorry-cypress/pull/688)

**Full Changelog**: [v2.4.4...v2.5.0](https://github.com/sorry-cypress/sorry-cypress/compare/v2.4.4...v2.5.0)

## v2.4.4

### What's Changed

* build(deps): bump loader-utils from 1.4.0 to 1.4.1 by @dependabot in <https://github.com/sorry-cypress/sorry-cypress/pull/678>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.4.3...v2.4.4>

## v2.4.3

### What's Changed

* Disables logs for probes by @tehKapa in <https://github.com/sorry-cypress/sorry-cypress/pull/663>
* feat: Add Fullscreen button to video player by @mattelen in <https://github.com/sorry-cypress/sorry-cypress/pull/673>
* Add ability to seek recording video on click by @akcyp in <https://github.com/sorry-cypress/sorry-cypress/pull/679>

### New Contributors

* @mattelen made their first contribution in <https://github.com/sorry-cypress/sorry-cypress/pull/673>
* @akcyp made their first contribution in <https://github.com/sorry-cypress/sorry-cypress/pull/679>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.4.2...v2.4.3>

## v2.4.2

### What's Changed

* Update nodejs to lts by @solidnerd in <https://github.com/sorry-cypress/sorry-cypress/pull/657>
* add solidnerd as a contributor for infra by @allcontributors in <https://github.com/sorry-cypress/sorry-cypress/pull/658>

### New Contributors

* @solidnerd made their first contribution in <https://github.com/sorry-cypress/sorry-cypress/pull/657>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.4.1...v2.4.2>

## v2.4.1

### What's Changed

* chore: update vm2 to 3.9.11 by @mathpaquette in <https://github.com/sorry-cypress/sorry-cypress/pull/649>
* fix: add project summary for single project by @mathpaquette in <https://github.com/sorry-cypress/sorry-cypress/pull/653>
* fix: director returning 500 using gitlab job retries by @bjartur20 in <https://github.com/sorry-cypress/sorry-cypress/pull/650>
* feat: make USER an ARG so containers based on this one can switch between root and $USER by @rrauenza in <https://github.com/sorry-cypress/sorry-cypress/pull/654>
* add rrauenza as a contributor \[skip ci] by @allcontributors in <https://github.com/sorry-cypress/sorry-cypress/pull/655>

### New Contributors

* @rrauenza made their first contribution in <https://github.com/sorry-cypress/sorry-cypress/pull/654>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.4.0...v2.4.1>

## v2.4.0

### What's Changed

* feat: proposed solution for retrying specs using job retries with GitLab CI by @bjartur20 in <https://github.com/sorry-cypress/sorry-cypress/pull/641>
* feat: add overview by ci-builds by @mathpaquette in <https://github.com/sorry-cypress/sorry-cypress/pull/639>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.3.3...v2.4.0>

## v2.3.3

### What's Changed

* fix: Fixing 636 by only parses remoteOrigin if it contains @ by @bjartur20 in <https://github.com/sorry-cypress/sorry-cypress/pull/637>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.3.2...v2.3.3>

## v2.3.2

### What's Changed

* Fixed issue where director saves the gitlab\_ci\_token in remoteOrigin by @bjartur20 in <https://github.com/sorry-cypress/sorry-cypress/pull/627>
* docs: add bjartur20 as a contributor for code by @allcontributors in <https://github.com/sorry-cypress/sorry-cypress/pull/628>
* feat(apollo): makes optional the enable of the landing page playground by @tehKapa in <https://github.com/sorry-cypress/sorry-cypress/pull/624>
* docs: add tehKapa as a contributor for code by @allcontributors in <https://github.com/sorry-cypress/sorry-cypress/pull/629>
* Fix wrong indx for remote origin by @bjartur20 in <https://github.com/sorry-cypress/sorry-cypress/pull/630>
* now uses URL to parse remoteOrigin by @bjartur20 in <https://github.com/sorry-cypress/sorry-cypress/pull/631>
* Fixed typing error and added typechecks to ci by @bjartur20 in <https://github.com/sorry-cypress/sorry-cypress/pull/633>
* build(deps): bump apollo-server-core from 3.9.0 to 3.10.1 by @dependabot in <https://github.com/sorry-cypress/sorry-cypress/pull/632>
* Correct parsing of remoteOrigin url by @bjartur20 in <https://github.com/sorry-cypress/sorry-cypress/pull/635>

### New Contributors

* @tehKapa made their first contribution in <https://github.com/sorry-cypress/sorry-cypress/pull/624>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.3.1...v2.3.2>

## v2.3.1

### What's Changed

* build(deps): bump terser from 5.9.0 to 5.14.2 by @dependabot in <https://github.com/sorry-cypress/sorry-cypress/pull/605>
* feat(dashboard): add search value in the URL (deeplink) by @mathpaquette in <https://github.com/sorry-cypress/sorry-cypress/pull/621>

### New Contributors

* @mathpaquette made their first contribution in <https://github.com/sorry-cypress/sorry-cypress/pull/621>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.3.0...v2.3.1>

## v2.3.0

### What's Changed

* gchat webhook by [@joaoduartepinto](https://github.com/joaoduartepinto) in [#612](https://github.com/sorry-cypress/sorry-cypress/pull/612)
* Fix off-by-one error in the in-memory director by [@alyssa-glean](https://github.com/alyssa-glean) in [#615](https://github.com/sorry-cypress/sorry-cypress/pull/615)
* docs: add joaoduartepinto as a contributor for code by [@allcontributors](https://github.com/allcontributors) in [#616](https://github.com/sorry-cypress/sorry-cypress/pull/616)
* docs: add alyssa-glean as a contributor for code by [@allcontributors](https://github.com/allcontributors) in [#618](https://github.com/sorry-cypress/sorry-cypress/pull/618)

### New Contributors

* [@joaoduartepinto](https://github.com/joaoduartepinto) made their first contribution in [#612](https://github.com/sorry-cypress/sorry-cypress/pull/612)
* [@alyssa-glean](https://github.com/alyssa-glean) made their first contribution in [#615](https://github.com/sorry-cypress/sorry-cypress/pull/615)

**Full Changelog**: [v2.2.1...v2.3.0](https://github.com/sorry-cypress/sorry-cypress/compare/v2.2.1...v2.3.0)

## v2.2.1

### What's Changed

* Fix word break overflow by [@fsmaia](https://github.com/fsmaia) in [#610](https://github.com/sorry-cypress/sorry-cypress/pull/610)
* Fix upload urls in `docker-compose.minio.yml` by [@Hackatosh](https://github.com/Hackatosh) in [#611](https://github.com/sorry-cypress/sorry-cypress/pull/611)

**Full Changelog**: [v2.2.0...v2.2.1](https://github.com/sorry-cypress/sorry-cypress/compare/v2.2.0...v2.2.1)

## v2.2.0

### What's Changed

* Enhance sidebar layout by [@fsmaia](https://github.com/fsmaia) in [#608](https://github.com/sorry-cypress/sorry-cypress/pull/608)
* Use classic status items for tests by [@agoldis](https://github.com/agoldis) in [#609](https://github.com/sorry-cypress/sorry-cypress/pull/609)

**Full Changelog**: [v2.1.7...v2.2.0](https://github.com/sorry-cypress/sorry-cypress/compare/v2.1.7...v2.2.0)

## v2.1.7

### What's Changed

* feat: add indexes to speed up the runs page and ci build redirect query by [@Aeolun](https://github.com/Aeolun) in [#603](https://github.com/sorry-cypress/sorry-cypress/pull/603)
* Add content type to blob storage url generation by [@Hackatosh](https://github.com/Hackatosh) in [#606](https://github.com/sorry-cypress/sorry-cypress/pull/606)

**Full Changelog**: [v2.1.6...v2.1.7](https://github.com/sorry-cypress/sorry-cypress/compare/v2.1.6...v2.1.7)

## 2.1.6

### What's Changed

* Restore apollo playground by [@agoldis](https://github.com/agoldis)

**Full Changelog**: [v2.1.5...v2.1.6](https://github.com/sorry-cypress/sorry-cypress/compare/v2.1.5...v2.1.6)

## 2.1.5

### What's Changed

* Add Azure Blob Storage support by [@Hackatosh](https://github.com/Hackatosh) in [#595](https://github.com/sorry-cypress/sorry-cypress/pull/595)

**Full Changelog**: [v2.1.4...v2.1.5](https://github.com/sorry-cypress/sorry-cypress/compare/v2.1.4...v2.1.5)

## 2.1.4

### What's Changed

* feat: allow toggling readable spec names by [@ImanMahmoudinasab](https://github.com/ImanMahmoudinasab) in [#588](https://github.com/sorry-cypress/sorry-cypress/pull/588)
* feat: Add mongodb health checks by [@Hackatosh](https://github.com/Hackatosh) in [#589](https://github.com/sorry-cypress/sorry-cypress/pull/589)
* docs: add Hackatosh as a contributor for code by [@allcontributors](https://github.com/allcontributors) in [#593](https://github.com/sorry-cypress/sorry-cypress/pull/593)
* \[Snyk] Security upgrade apollo-server from 2.25.3 to 3.0.0 by [@snyk-bot](https://github.com/snyk-bot) in [#591](https://github.com/sorry-cypress/sorry-cypress/pull/591)
* \[Snyk] Security upgrade apollo-server-express from 2.25.4 to 3.0.0 by [@agoldis](https://github.com/agoldis) in [#594](https://github.com/sorry-cypress/sorry-cypress/pull/594)
* build(deps): bump shell-quote from 1.7.2 to 1.7.3 by [@dependabot](https://github.com/dependabot) in [#592](https://github.com/sorry-cypress/sorry-cypress/pull/592)

### New Contributors

* [@Hackatosh](https://github.com/Hackatosh) made their first contribution in [#589](https://github.com/sorry-cypress/sorry-cypress/pull/589)

**Full Changelog**: [v2.1.3...v2.1.4](https://github.com/sorry-cypress/sorry-cypress/compare/v2.1.3...v2.1.4)

## 2.1.3

### What's Changed

* fix: fixes [#555](https://github.com/sorry-cypress/sorry-cypress/issues/555) mocha statuses are converted to cypress statuses by [@Aeolun](https://github.com/Aeolun) in [#580](https://github.com/sorry-cypress/sorry-cypress/pull/580)
* \[Snyk] Security upgrade nginx from 1-alpine to 1.22.0-alpine by [@agoldis](https://github.com/agoldis) in [#579](https://github.com/sorry-cypress/sorry-cypress/pull/579)
* build(deps): bump dset from 3.1.1 to 3.1.2 by [@dependabot](https://github.com/dependabot) in [#577](https://github.com/sorry-cypress/sorry-cypress/pull/577)

**Full Changelog**: [v2.1.2...v2.1.3](https://github.com/sorry-cypress/sorry-cypress/compare/v2.1.2...v2.1.3)

## 2.1.2

### What's Changed

* use commit message instead of sha by [@raftx24](https://github.com/raftx24) in [#542](https://github.com/sorry-cypress/sorry-cypress/pull/542)
* Updating GH actions to latest versions by [@diogormendes](https://github.com/diogormendes) in [#557](https://github.com/sorry-cypress/sorry-cypress/pull/557)
* Update README.md by [@eltociear](https://github.com/eltociear) in [#559](https://github.com/sorry-cypress/sorry-cypress/pull/559)
* build(deps): bump async from 2.6.3 to 2.6.4 by [@dependabot](https://github.com/dependabot) in [#563](https://github.com/sorry-cypress/sorry-cypress/pull/563)
* feat: make grid coulmns sortable and filterable by [@ImanMahmoudinasab](https://github.com/ImanMahmoudinasab) in [#565](https://github.com/sorry-cypress/sorry-cypress/pull/565)
* \[Snyk] Security upgrade axios from 0.21.2 to 0.21.3 by [@agoldis](https://github.com/agoldis) in [#569](https://github.com/sorry-cypress/sorry-cypress/pull/569)
* \[Snyk] Fix for 3 vulnerabilities by [@snyk-bot](https://github.com/snyk-bot) in [#571](https://github.com/sorry-cypress/sorry-cypress/pull/571)
* \[Snyk] Security upgrade axios from 0.21.2 to 0.21.3 by [@agoldis](https://github.com/agoldis) in [#570](https://github.com/sorry-cypress/sorry-cypress/pull/570)
* build(deps): bump minimist from 1.2.5 to 1.2.6 by [@dependabot](https://github.com/dependabot) in [#556](https://github.com/sorry-cypress/sorry-cypress/pull/556)
* build(deps): bump cross-fetch from 3.0.6 to 3.1.5 by [@dependabot](https://github.com/dependabot) in [#562](https://github.com/sorry-cypress/sorry-cypress/pull/562)
* build(deps): bump follow-redirects from 1.14.7 to 1.15.0 by [@dependabot](https://github.com/dependabot) in [#573](https://github.com/sorry-cypress/sorry-cypress/pull/573)

### New Contributors

* [@raftx24](https://github.com/raftx24) made their first contribution in [#542](https://github.com/sorry-cypress/sorry-cypress/pull/542)
* [@diogormendes](https://github.com/diogormendes) made their first contribution in [#557](https://github.com/sorry-cypress/sorry-cypress/pull/557)
* [@eltociear](https://github.com/eltociear) made their first contribution in [#559](https://github.com/sorry-cypress/sorry-cypress/pull/559)
* [@snyk-bot](https://github.com/snyk-bot) made their first contribution in [#571](https://github.com/sorry-cypress/sorry-cypress/pull/571)

**Full Changelog**: [v2.1.1...v2.1.2](https://github.com/sorry-cypress/sorry-cypress/compare/v2.1.1...v2.1.2)

## 2.1.1

### What's Changed

* Prevent crash on GitHub http failure. Closes #534 by @agoldis.

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.1.0...v2.1.1>

## 2.1.0

### What's Changed

* Dockerfile efficiencies by @tico24 in <https://github.com/sorry-cypress/sorry-cypress/pull/523>
* Add HOST parameter to API config. by @nijine in <https://github.com/sorry-cypress/sorry-cypress/pull/528>
* docs: add nijine as a contributor for code by @allcontributors in <https://github.com/sorry-cypress/sorry-cypress/pull/529>
* build(deps): bump follow-redirects from 1.14.3 to 1.14.7 by @dependabot in <https://github.com/sorry-cypress/sorry-cypress/pull/522>
* build(deps): bump nanoid from 3.1.30 to 3.1.31 by @dependabot in <https://github.com/sorry-cypress/sorry-cypress/pull/527>
* build(deps): bump glob-parent from 5.1.1 to 5.1.2 by @dependabot in <https://github.com/sorry-cypress/sorry-cypress/pull/530>
* build(deps): bump normalize-url from 4.5.0 to 4.5.1 by @dependabot in <https://github.com/sorry-cypress/sorry-cypress/pull/531>
* Dev container by @agoldis in <https://github.com/sorry-cypress/sorry-cypress/pull/532>

### New Contributors

* @nijine made their first contribution in <https://github.com/sorry-cypress/sorry-cypress/pull/528>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.0.2...v2.1.0>

## 2.0.2

### What's Changed

* use new logo by @agoldis in <https://github.com/sorry-cypress/sorry-cypress/pull/515>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.0.1...v2.0.2>

## 2.0.1

### What's Changed

* build(deps): bump aws-sdk from 2.756.0 to 2.814.0 by @dependabot in <https://github.com/sorry-cypress/sorry-cypress/pull/494>
* build(deps): bump apollo-server from 2.18.1 to 2.25.3 by @dependabot in <https://github.com/sorry-cypress/sorry-cypress/pull/485>
* fix: encode project ids wherever it is used in url by @ImanMahmoudinasab in <https://github.com/sorry-cypress/sorry-cypress/pull/510>

**Full Changelog**: <https://github.com/sorry-cypress/sorry-cypress/compare/v2.0.0...v2.0.1>

## 2.0.0 🎉

### Breaking changes

* Deprecated support for cypress agents lt `6.7.0`
  * Supporting the legacy versions of cypress with all the code was cumbersome. Trying to use SC with older cypress versions would return an error when creating new runs. Closes #412.
* The internal representation of runs has changed. **Runs created prior to v2.0 might be displayed partially or not displayed at all.**
  * added a `progress` field on `run` with the instances and tests progress state. We use this field to report run's progress in hooks / dashboard instead of invoking complex MongoDB queries. This should resolve #417 because we won't use MongoDB aggregations that create gt 16MB documents.
  * `runs.specs` will have a short version of "results" - that would allow more efficient data fetching for showing runs feeds and individual runs.

### Other changes

* feat: 😎 ⭐️ New UI implementation by @ImanMahmoudinasab
* fix: Delete run timeout when deleting run. Closes #409.
* fix: Correctly report failed tests w/o counting retires. Closes #384
* fix: In-memory director crashes when test fails with an exception. Closes #425
* fix: Stop showing duration running for completed runs / tests. Closes #377
* feat: Add retries to Slack integration, show retries count everywhere and use "Flaky" badge if spec / test was retried. Closes #378
* feat: Configure default page items # on runs feed via `PAGE_ITEMS_LIMIT` env variable for API service
* infra: remove redis dependency in docker-compose files, updated docs accordingly
* infra: properly set up typescript for monorepo, resolved dozens of TS errors and warnings
* misc: completely removed lookup aggregations from mongoDB queries. Sorry cypress is much DocumentDB friendly now!
* misc: added material-UI for gradual transition. See #401

See the complete list of changes on GitHub <https://github.com/sorry-cypress/sorry-cypress/releases/tag/v2.0.0>

## 1.1.1

### Added

* feat: allow excluding branches from triggering slack hooks [#406](https://github.com/sorry-cypress/sorry-cypress/pull/406) by [@ImanMahmoudinasab](https://github.com/ImanMahmoudinasab)

### Fixed

* fix: properly show git SSH URLs [#413](https://github.com/sorry-cypress/sorry-cypress/pull/413) by [@Zaista](https://github.com/Zaista)

## 1.1.0

### Added

* feat: Allow resetting instance for retesting [fae3f7a](https://github.com/sorry-cypress/sorry-cypress/commit/fae3f7a6bac8e24ed3b4c4546043f8f48f2ac31b) by [@Aeolun](https://github.com/Aeolun)

## 1.0.3

### Fixed

* fix: show correct duration in specs list [98ae7be](https://github.com/sorry-cypress/sorry-cypress/commit/98ae7be35005eadd0981455396cfe608f998fc2b). Closes [#374](https://github.com/sorry-cypress/sorry-cypress/issues/374).
* fix: heroku build build process [a658d3f](https://github.com/sorry-cypress/sorry-cypress/commit/a658d3f34dd988a9b281dfbe659626473e47f665). Closes [#373](https://github.com/sorry-cypress/sorry-cypress/issues/373).

### Dependencies

* deps: dns-packet-1.3.4 [1358c74](https://github.com/sorry-cypress/sorry-cypress/commit/1358c7431babac346bca8f79c591c0d6a305ce84)

## 1.0.2

### Fixed

* fix: handle nullable results.tests [a469c76](https://github.com/sorry-cypress/sorry-cypress/commit/a469c76a586a35e71c8756f269aadb81fb375b48). Closes [#360](https://github.com/sorry-cypress/sorry-cypress/issues/360).

## 1.0.1

### Changes

* Serve css and fonts locally [9e5c3a5](https://github.com/sorry-cypress/sorry-cypress/commit/9e5c3a5b28f6660c58bf7d81739c31114e44e640). Closes [#363](https://github.com/sorry-cypress/sorry-cypress/issues/363)

### Fixed

* Allow skipping --parallel flag [d7a64b0](https://github.com/sorry-cypress/sorry-cypress/commit/d7a64b0fba4533d5b282e087f907f5304d52eda2). Closes [#365](https://github.com/sorry-cypress/sorry-cypress/issues/365)

## 1.0.0 🎉

### Changed

* remove inactivity timeout implementation
* use runs timeout via project settings
* add `RUN_TIMEDOUT` hook - based on the project runs timeout settings
* emit `RUN_FINISH` for each group in a run

## 1.0.0-rc.12

### Fixed

* Return `runId` with `getInstance` query. [Issue #357](https://github.com/sorry-cypress/sorry-cypress/issues/357).

## 1.0.0-rc.11

### Added

* Show retry count on run details page. [#350](https://github.com/sorry-cypress/sorry-cypress/pull/350) by [@boxofcrates](https://github.com/boxofcrates)

### Changed

* Refactor instance results retrieval - use GQL query resolved. Increate auto-refresh rate to 5 seconds. [#336](https://github.com/sorry-cypress/sorry-cypress/pull/336) by [@anishkargaonkar](https://github.com/anishkargaonkar)

## 1.0.0-rc.10

### Fixed

* Correctly extract `ciBuildId` from Gitlab CI. [#343](https://github.com/sorry-cypress/sorry-cypress/pull/343) by [@boxofcrates](https://github.com/boxofcrates)
* Fix support to projects with slashes. [#340](https://github.com/sorry-cypress/sorry-cypress/pull/340) by [@fsmaia](https://github.com/fsmaia)

## 1.0.0-rc.9

### Fixed

* Successfully fire slack hooks without commit data. [#328](https://github.com/sorry-cypress/sorry-cypress/pull/328) by [@pbeckham](https://github.com/pbeckham)
* Restore generic hooks functionality

### Changed

* Refactor - use `runSingleReporter` and move files [b296289](https://github.com/sorry-cypress/sorry-cypress/commit/b2962892c743219e43fdf289617d73b20dd06b2f)

## 1.0.0-rc.8

### Changed

* Remove mongo `$map` usages to simpler syntax and AWS DocumentDB compatibility. [PR #324](https://github.com/sorry-cypress/sorry-cypress/pull/324).
* Support monorepos for BitBucket hooks. [PR #325](https://github.com/sorry-cypress/sorry-cypress/pull/325).

## 1.0.0-rc.7

### Fixed

* Validate possibly empty results when checking run completion. [Issue #317](https://github.com/sorry-cypress/sorry-cypress/issues/317)

## 1.0.0-rc.6

### Fixed

* Return `application/javascript` for `mjs` files served by dashboard `nginx` server. [Issue #321](https://github.com/sorry-cypress/sorry-cypress/issues/321)

## 1.0.0-rc.5

### Changed

* Use `@graphql-tools/merge` to allow breaking down schema definitions to multiple files
* Remove aggregation stages for `runsFeed` to improve performance

## 1.0.0-rc.4

### Added

* Add slack hook filters and advanced formatting [#309](https://github.com/sorry-cypress/sorry-cypress/pull/309) by [@DeniDoman](https://github.com/DeniDoman)

## 1.0.0-rc.3

### Fixed

* Support auto-detection of `ciBuildId` for major CI providers. [Issue #310](https://github.com/sorry-cypress/sorry-cypress/issues/310)

## 1.0.0-rc.2

### Fixed

* Support cypress 6.7.0

## 1.0.0-rc.1

### Fixed

* Prevent hooks for in-memory driver

## 1.0.0-rc.0

### Added

* Sorry Cypress is now able to detect stale runs and properly report RUN\_FINISH hook using I[nactivity Timeout.](https://github.com/sorry-cypress/gitbook/blob/master/development/broken-reference/README.md) That includes. more complex cases when multiple spec groups involved.
* Optional [Redis](/configuration/persistent#redis-optional) integration via `REDIS_URI` director configuration variable.
* Bitbucket Integration

### Changed

* Webhooks, Github and Slack reporting mechanism was revisited and improved - the new implementation immutable and has a better type support.
* Project Setting UI refactored
* The project now has a [common](https://github.com/sorry-cypress/sorry-cypress/tree/master/packages/common) package, which allows to share utilities, type definitions etc.
* Type definitions and GraphQL schema were updated and improved to allow better reusability, discovered and fixed a few bugs on the way.
* Major refactoring to dashboard files structure and improvements to components composition, polling and type definitions.
* Build process is now a bit more complex and slow because we need to build `common` package as part of every image.
* Node 14 everywhere
* Mongo 4.2
* Suggested development flow doesn't require docker compose anymore.
* Remove example - not used in docs anymore

### Fixed

* Properly detect `RUN_FINISH`
* Remove Github / Bitbucket secrets from queries
* Test execution timer never stops for manually terminated runs [#134](https://github.com/sorry-cypress/sorry-cypress/issues/134)
* "Finished" run changing its state to "started" when new machine is joined after finish [#215](https://github.com/sorry-cypress/sorry-cypress/issues/215)
* Test duration time continuous to count [#245](https://github.com/sorry-cypress/sorry-cypress/issues/245)
* Enhance Generic WebHook [#248](https://github.com/sorry-cypress/sorry-cypress/issues/248)

## Older Versions

[Github Releases](https://github.com/sorry-cypress/sorry-cypress/releases)


# Development Guide

### GitHub Codespaces

Start developing using remote, pre-configured environment within minutes.

Sorry Cypress supports remote development using [GitHub Codespaces.](https://github.com/features/codespaces) All the services are pre-configured to run in a remote, containerized environment and allows starting developing within minutes.

To start, create a new codespace using [sorry-cypress/sorry-cypress](https://github.com/sorry-cypress/sorry-cypress) as a source

![Creating sorry-cypress Codespace](/files/azggbGdL9NWxeTtRjJ3D)

Within the Codespace, open a terminal and run

```
yarn && yarn dev
```

This command will start all the internal services and will expose the ports on localhost:

* 8080 - dashboard
* 1234 - director
* 4000 - API
* 9000 - minio

Open <http://localhost:8080> to see the dashboard in action.

To start sending cypress tests to your dev instance, run:

```
 CYPRESS_API_URL=http://localhost:1234/ && \
 yarn cy2 run --parallel --record --key whatever
```

#### Tips

* Don't use broser-based VS Code to connect to a codespace - it doesn't allow access to sorry-cypress services via `localhost`
* If the services become unavailable via published ports, delete and re-add them in "Ports" tab of VS Code
* Run `yarn killall && yarn dev` to stop and start all the services - sometimes they hang and keep their ports busy

### Local Development

We use yarn workspaces, please use `yarn`.

### Add `.env` configuration to services

Add `.env` file with the following contents:

```
# packages/director/.env
EXECUTION_DRIVER="../execution/mongo/driver"
SCREENSHOTS_DRIVER="../screenshots/minio.driver"
MINIO_ACCESS_KEY='MW32h3gd6HvjBEgTRx'
MINIO_SECRET_KEY=t6NgQWUcEyG2AzaDCVkN6sbWcvDCVkN6sGiZ7
MINIO_ENDPOINT='storage'
MINIO_URL='http://localhost'
MINIO_PORT='9000'
MINIO_USESSL='false'
MINIO_BUCKET=sorry-cypress

# packages/dashboard/.env
GRAPHQL_SCHEMA_URL=http://api.sc.com:4000
```

### Override `localhost` network

Add the following entries to `/etc/hosts` or an equivalent file on Windows

```
127.0.0.1 storage
127.0.0.1 api.sc.com
```

### Start `minio` and `mongo` background services

```
docker-compose -f ./docker-compose.minio.yml up -d storage mongo createbuckets
```

Make sure that associated services are available on the localhost - e.g. `mongo`, `minio`

### Start all the services in dev mode

`yarn dev`

* The dashboard should be available at <http://localhost:8080>
* Director service should be available at <http://localhost:1234>

Send new tests to dashboard using this command:

```bash
CYPRESS_API_URL=http://localhost:1234/ \
cy2 run --record --key whatever --parallel --ci-build-id `date +%s`
```

### Prevent CI

Add `[skip ci]` to commit message to skip running CI.

### Releasing a new version

We use semver standard.

Every commit to master triggers [CI via GH Actions](https://github.com/sorry-cypress/sorry-cypress/tree/master/.github/workflows), which builds new docker images, assign tags and pusher the new images to DockerHub.

After pushing a new tagged please go ahead and create a new Github [release](https://github.com/sorry-cypress/sorry-cypress/releases) with a summary and attributions.

### Releasing `latest` tag

Pushing to master automatically created new docker images with `latest` tags

#### Releasing tagged version e.g. `v1.0.0-beta.4`

1. Run `yarn release` to create a new release.
2. Push to master. Push to master, together with tags `git push origin master --tags`. Pushing to master will trigger CI that will actually update dockerhub.

Pushing a properly formatted (semver) git tag starts release of dockerhub images tagged accordingly. E.g. `v0.5.2` will release dockerhub tags `v0, v0.5, v0.5.2`.

The script does the following behind the scenes:

* Update all `package.json` files (we release all together and do not increase / release individual packages version)
* Commit with message, e.g. `v0.5.2`
* Add git tag, e.g. `git tag v0.5.2`


# Community Content

### Articles

* [Cypress Parallelization on Jenkins using Sorry-Cypress](https://medium.com/@adityahbk/cypress-parallelization-on-jenkins-using-sorry-cypress-197a86ad8ed1) by **Aditya Trivedi**
* [Sorry Cypress In A Kubernetes Jenkins Pipeline](https://crumbhole.com/sorry-cypress-in-a-kubernetes-jenkins-pipeline/) by **Tim Collins**
* [Introducing The Sorry Cypress Helm Chart](https://crumbhole.com/indroducing-the-sorry-cypress-helm-chart/) \*\*\*\* by **Tim Collins**
* [Paralleling Cypress with Sorry Cypress on Render](https://blog.simonireilly.com/posts/sorry-render-cypress) for $7.25/mo by **Simon Reilly**
* [Cypress parallelization tools comparison](https://currents.dev/posts/cypress-parallelization-tools) by **Laerte Neto**
* [Parallelizing Cypress with Jenkins, AWS, and Sorry-Cypress](https://medium.com/geekculture/parallelizing-cypress-with-jenkins-aws-and-sorry-cypress-8241331fe50f) by **Seth Lustke**

### **Videos**

* [AGXP2020 - Dia 02 - Experiências em Portugal, Canadá e Irlanda, TestCafe e Sorry Cypress](https://www.youtube.com/watch?v=sK90Ya46htk\&t=7318s) \*\*\*\* by **Samuel Lucas (Portuguese)**
* [QAGuild live #48: Говорим про Sorry-Cypress/Cypress для тестировщика ](https://www.youtube.com/watch?v=6_JRHLcwFjs)by **Andrew Goldis (Russian)**


# ❤️ Contributions

Thanks for your interest in supporting sorry-cypress! This project is open source and only exists because of community support.

We accept donations on the following platforms

* [GitHub Sponsors](https://github.com/sponsors/agoldis)
* [Open Collective](https://opencollective.com/sorry-cypress)

## Here are additional ways you can contribute

* Add a ⭐️ on [GitHub](https://github.com/sorry-cypress/sorry-cypress)
* Write code and improve the project on [GitHub](https://github.com/sorry-cypress/sorry-cypress)
* Create issues, report bugs and request new features on [GitHub](https://github.com/sorry-cypress/sorry-cypress)
* Improve documentation or translate documentation on [GitHub](https://github.com/sorry-cypress/sorry-cypress.dev)
* Create / improve integration and installation instructions on various cloud platforms
* Share your story and integration details with the community
* Share a message on social networks using #sorry-cypress tag

### Start Using Managed Cypress Tests Dashboard

We've recently launched [https://currents.dev](https://currents.dev/cypress-to-playwright?utm_source=docs-sc) - a managed cypress tests dashboard, which is based on sorry-cypress. By using currents.dev you're supporting sorry-cypress:

* we port features and improvements between projects
* we have resources to hire developers for help
* we are able to invest more time into the project

Thank you!


# Support

Sorry-cypress is being successfully used by many companies of different sizes across the globe.

{% hint style="info" %}
Please consider reading our integration guides for various cloud platforms
{% endhint %}

### Free OSS version - community support (<https://sorry-cypress.dev>)

The following support options are available for self-hosted, free sorry-cypress version:

* Documentation
* Community publications
* [GitHub issues](https://github.com/sorry-cypress/sorry-cypress/issues)
* Public [Slack channel](https://sorry-cypress.slack.com/join/shared_invite/zt-eis1h6jl-tJELaD7q9UGEhMP8WHJOaw#/)

### Paid, cloud version ([https://currents.dev](https://currents.dev/cypress-to-playwright?utm_source=docs-sc))

The following standard [support options](https://currents.dev/#features) is available for paid customers of Currents.dev - cloud-based, managed version of sorry-cypress:

* In-app chat support
* Email
* Customized support plans


# Legal

{% hint style="info" %}
sorry-cypress is and independent open-source project that is **not** associated or related in any manner with Cypress.io, Inc.
{% endhint %}

We refer and use the term "cypress" in this documentation. Based on the context, we refer to:

* `cypress` [MIT licensed](https://github.com/cypress-io/cypress/blob/develop/LICENSE) open-source tests running software , distributed as npm package
* `sorry-cypress` is an [MIT licensed](https://github.com/sorry-cypress/sorry-cypress/blob/master/LICENSE) open source project intended to work with MIT licensed open-source test running software `cypress` , which can be modified and used in accordance with its license
* "Cypress.io", "Cypress" - the company legally known as Cypress.io, Inc.
* "Cypress Dashboard", "Original Cypress" - the commercial product and a trademark of Cypress.io, Inc.


# FAQ

## Is it legal?

Yes, Cypress is an [MIT licensed open source software](https://github.com/cypress-io/cypress/blob/develop/LICENSE).

## Is it production-ready?

Yes. Have been used by dozens of companies around the globe.

## I need help, what do I do?

Check out our [Support](/support) page

## I want to help, how?

Checkout out our [Contribution](/contributions) guide


