DEV Community

Aurore T
Aurore T

Posted on • Edited on

GitHub Action, Cypress and Percy parallelisation setup

Recently, I moved our Cypress test suite over to GitHub Action, and I had trouble finding a full example of how to run Cypress and Percy together using parallelisation to run the tests quicker. Here is an example of how to do this.

I will assume if you ended up here, you know what all of those tools do.

Full example

In your repo, in .github/workflows/main.yml:

name: End-to-end tests
on:
  pull_request:
    branches:
      - develop
jobs:
  cypress-run:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        containers: [1, 2, 3, 4, 5, 6]
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup node
        uses: actions/setup-node@v1
        with:
          node-version: '10.x'
          registry-url: 'https://registry.npmjs.org'
      - name: Install dependencies
        run: npm ci
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
      - name: Cypress run
        uses: cypress-io/github-action@v1
        with:
          install: false
          start: npm start
          wait-on: 'http://localhost:8080/'
          record: true
          parallel: true
          command-prefix: 'percy exec -- npx'
        env:
          CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
          PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }}
          PERCY_PARALLEL_TOTAL: 6
          PERCY_PARALLEL_NONCE: '${{ github.event_name }}-${{ github.sha }}'
          PERCY_TARGET_BRANCH: 'develop'
          PERCY_BRANCH: ${{ github.head_ref }}
          COMMIT_INFO_BRANCH: ${{ github.head_ref }}
Enter fullscreen mode Exit fullscreen mode

For any environment variables, use GitHub secrets to save them and access them in the GitHub action.

Breaking it down

  • Running test on pull request to the develop branch
name: End-to-end tests
on:
  pull_request:
    branches:
      - develop
Enter fullscreen mode Exit fullscreen mode
  • Start the job and runs it on 6 ubuntu machines. In case of errors, do not cancel other actions (fail-fast: false)
jobs:
  cypress-run:
  runs-on: ubuntu-latest
  strategy:
    fail-fast: false
    matrix:
      containers: [1, 2, 3, 4, 5, 6]
Enter fullscreen mode Exit fullscreen mode
  • Checkout the repo
steps:
  - name: Checkout
    uses: actions/checkout@v2       
Enter fullscreen mode Exit fullscreen mode
  • Set up node 10.x
- name: Setup node
  uses: actions/setup-node@v1
  with:
    node-version: '10.x'
    registry-url: 'https://registry.npmjs.org'
Enter fullscreen mode Exit fullscreen mode
  • Install npm dependencies with NPM TOKEN for private repo
- name: Install dependencies
  run: npm ci
    env:
      NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
Enter fullscreen mode Exit fullscreen mode
  • For running the cypress test, we are using the Cypress GitHub action. Here is the cypress doc which is pretty good but here is a breakdown as well:
    • Cypress action configuration
      • install: false Do not install dependencies as we've done it ourselves
      • start: npm start Command to run to start the app
      • wait-on: 'http://localhost:8080/' wait for the app to be started on this url to start testing
      • record: true Record the test in Cypress dashboard
      • parallel: true Runs the test in parallel
      • command-prefix: 'percy exec -- npx' Command to be prefixed to the cypress command run by the action
    • Environment variables
      • CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }: Cypress record key
      • PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }: Percy token
      • PERCY_PARALLEL_TOTAL: 6: The number of server used for parallelisation
      • PERCY_PARALLEL_NONCE: '${{ github.event_name }}-${{ github.sha }}': Unique ID for Percy to link builds on each machine together
      • PERCY_TARGET_BRANCH: 'develop' Target branch used by Percy to compare against
      • PERCY_BRANCH: ${{ github.head_ref }} Name to display in Percy for the branch this is being run for
      • COMMIT_INFO_BRANCH: ${{ github.head_ref }} Name to display in Cypress for the branch this is being run for
- name: Cypress run
  uses: cypress-io/github-action@v1
  with:
    install: false
    start: npm start
    wait-on: 'http://localhost:8080/'
    record: true
    parallel: true
    command-prefix: 'percy exec -- npx'
  env:
    CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
    PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }}
    PERCY_PARALLEL_TOTAL: 6
    PERCY_PARALLEL_NONCE: '${{ github.event_name }}-${{ github.sha }}'
    PERCY_TARGET_BRANCH: 'develop'
    PERCY_BRANCH: ${{ github.head_ref }}
    COMMIT_INFO_BRANCH: ${{ github.head_ref }}
Enter fullscreen mode Exit fullscreen mode

I hope this is useful, comment below if you have any questions.
Happy testing ๐ŸŽ‰

Top comments (8)

Collapse
 
mohsenny profile image
Mohsen

Hey Aurore, thanks for the great article. We have the exact same setup:

  • Parallelised Cypress tests
  • Percy for visual tests
  • Github Actions But the problem is that it seems not all Percy snapshots are taken. I've passed the exact same PERCY_PARALLEL_TOTAL and PERCY_PARALLEL_NONCE but to n oavail.

Might have you any guesses what the issue could be? I'm wondering if you've encountered the same issue in the past.

Collapse
 
digitaledawn profile image
Aurore T

Hey Mohsen! Thank you! The only thing that comes to mind, is that PERCY_PARALLEL_TOTAL number you entered doesn't match how many servers or containers you are using. I just fixed a mistake in the article, where it didn't match either.
If your matrix contains 6 containers, PERCY_PARALLEL_TOTAL should be 6.

I can't think of any else. Have you contacted Percy? I find they are very helpful.

Collapse
 
justtrey profile image
just-trey • Edited

I have something similar I am working on and this literally is a big piece of what part 2 or my post was going to be. I am going to link to yours instead. thanks for the insight and inspiration!

Collapse
 
digitaledawn profile image
Aurore T

Oh thanks! Glad it's useful :)

Collapse
 
mongopark profile image
Ola' John Ajiboye

Thanks so much for this. Exactly what I was looking for!

Collapse
 
digitaledawn profile image
Aurore T

Glad it helps!

Collapse
 
devsrihari4 profile image
devsrihari4

Nice artilce. What is the difference using containers: [1, 2, 3] and machines: [1, 2, 3]? Thank you!

Collapse
 
digitaledawn profile image
Aurore T

Thanks! I am not sure. I've never used machines: [1, 2, 3]. Have you checked GitHub action documentation?