End-to-End Testing

Run Cypress Tests using Docker on Azure DevOps Kubernetes Agents

Running E2E tests during a CI/CD Pipeline

Manas Peçenek
adessoTurkey

--

Cypress is an end-to-end testing framework for web test automation. It enables front-end developers and test automation engineers to write automated web tests. It is a life-saving tool and helps developers quite a lot. And it is really easy to use, even easier when you decide to run Cypress tests via Docker. This feature helps us automate Cypress during a Continuous Integration process. All you have to do is run a simple Docker command inside a pipeline and let it do all the work.

In this article, I will demonstrate how to implement a pipeline that uses a Kubernetes agent running Cypress tests using Docker. There will be 7 steps:

1- Create a PAT in Azure DevOps

Sign in to your organization (https://dev.azure.com/{yourorganization}). And go to Personal Access Tokens section.

Click on “New Token”

For our purpose, it is enough to give Agent Pools(Read&Manage) and Auditing(Read Audit Logs) permissions. Save the token.

2- Create an Agent Pool by clicking on “Add Pool”

3- Create the image for the agent

Build your image docker build -t {your-registry-name}/agent/azure-agent:v1.0 .

NOTE: Put start.sh and Dockerfile into the same location

start.sh

Before building your image, check the architecture of your Kubernetes nodes to configure FROM --platform=... ubuntu:18.04 section.

Note: If you want a docker ubuntu image in which you can run docker and systemctl commands, you can check petschenek/ubuntu-20.04-dind and petschenek/ubuntu-22.04-dind images.

4- Create the deployment on the Kubernetes cluster

Here, I want to explain some details about this deployment YAML. First, I created an emptyDir volume inside the pod. The filesystems of the containers that are going to be created inside the pod should be a normal filesystem, not a copy-on-write filesystem like AUFS and BTRFS. And since we cannot run AUFS on top of AUFS, I mounted “/var/lib/docker” on a normal filesystem with the help of emptyDir volume. Then I added “privileged: true” security context for docker to run successfully. Then the rest is easy. I just passed relevant information into the ado-agent-1 container as environment variables. Just for simplicity, I put the values of the environment variables in plain text but you should not do that :). Use at least Kubernetes secrets to store those values.

5- Check whether the agent is listening for jobs

You can check the pod logs where you should see “Listening for jobs” at the end:

and check the agent pool where agent-1 should be online:

6- Create the Azure Pipeline

You can also add the “baseUrl: http://{project-url}:{port}” and “video: true” options to the cypress.json file directly and remove the section where these values are passed as environment variables to the docker container.

7- Run the pipeline and observe the results

Check the test results

Download the screenshots and videos

CONCLUSION:

As can be seen, we can run Cypress tests via Docker inside a Kubernetes pod. This gives us flexibility because we do not need to install a bunch of packages for Cypress to run and do not face dependency issues.

RESOURCES:

https://linuxize.com/post/how-to-install-node-js-on-ubuntu-18.04/

--

--