Skip to content

Commit

Permalink
chore: [DHIS2-17375] optimise Cypress triggers and refine parallel ex…
Browse files Browse the repository at this point in the history
…ecution in GitHub Actions (#1507)

* chore: optimize Cypress triggers and refine parallel execution in GitHub Actions

* chore: debug ci
  • Loading branch information
adeldhis2 authored Jun 3, 2024
1 parent 568a465 commit 6962afc
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 12 deletions.
61 changes: 49 additions & 12 deletions .github/workflows/dhis2-verify-lib.yml
Original file line number Diff line number Diff line change
@@ -1,20 +1,35 @@
name: 'dhis2: verify (lib)'

on: push
on:
push:
pull_request:
types: [labeled]

concurrency:
group: ${{ github.workflow}}-${{ github.ref }}
group: ${{ github.workflow }}-${{ github.ref }}

env:
GIT_AUTHOR_NAME: '@dhis2-bot'
GIT_AUTHOR_EMAIL: '[email protected]'
GIT_COMMITTER_NAME: '@dhis2-bot'
GIT_COMMITTER_EMAIL: '[email protected]'
NPM_TOKEN: ${{secrets.DHIS2_BOT_NPM_TOKEN}}
GH_TOKEN: ${{secrets.DHIS2_BOT_GITHUB_TOKEN}}
NPM_TOKEN: ${{ secrets.DHIS2_BOT_NPM_TOKEN }}
GH_TOKEN: ${{ secrets.DHIS2_BOT_GITHUB_TOKEN }}
D2_VERBOSE: true

jobs:
setup-matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.specs }}
steps:
- uses: actions/checkout@v3
- name: Generate test matrix
id: set-matrix
run: |
node cypress/support/generateTestMatrix.js > matrix.json
echo "::set-output name=specs::$(cat matrix.json)"
build:
runs-on: ubuntu-latest
steps:
Expand Down Expand Up @@ -84,12 +99,14 @@ jobs:
e2e:
runs-on: ubuntu-latest
if: "!github.event.push.repository.fork && github.actor != 'dependabot[bot]'"
needs: [build]
needs: [build, setup-matrix]

strategy:
fail-fast: false
matrix:
containers: [1, 2, 3, 4]
spec-group: ${{ fromJson(needs.setup-matrix.outputs.matrix) }}
env:
SHOULD_RECORD: ${{ contains(github.event.head_commit.message, '[e2e record]') || contains(join(github.event.pull_request.labels.*.name), 'e2e record') }}

steps:
- name: Checkout
Expand All @@ -108,17 +125,37 @@ jobs:
- name: Increase FS watchers
run: echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

- name: Set Cypress Record Environment Variables
if: env.SHOULD_RECORD == 'true'
run: |
echo "CYPRESS_GROUP=e2e-${{ matrix.spec-group.id }}" >> $GITHUB_ENV
echo "CYPRESS_TAG=${{ github.event_name }}" >> $GITHUB_ENV
echo "CYPRESS_CI_BUILD_ID=${{ github.run_id }}" >> $GITHUB_ENV
- name: Debug Environment Variables
run: |
echo "SHOULD_RECORD=${{ env.SHOULD_RECORD }}"
echo "CI Build ID=${{ github.run_id }}"
echo "Group ID=e2e-${{ matrix.spec-group.id }}"
echo "Spec=${{ join(matrix.spec-group.tests, ',') }}"
echo "Record=${{ env.SHOULD_RECORD }}"
echo "Parallel=${{ env.SHOULD_RECORD }}"
echo "Computed Group=${{ env.SHOULD_RECORD == 'true' && env.CYPRESS_GROUP || '' }}"
echo "Computed Tag=${{ env.SHOULD_RECORD == 'true' && env.CYPRESS_TAG || '' }}"
echo "Computed CI Build ID=${{ env.SHOULD_RECORD == 'true' && env.CYPRESS_CI_BUILD_ID || '' }}"
- name: End-to-End tests
uses: cypress-io/github-action@v6
with:
# This should be a command that starts the server to test against.
start: 'yarn cy:start:legacy'
wait-on: 'http://localhost:5000'
wait-on-timeout: 300
record: true
parallel: true
group: 'e2e'
tag: ${{ github.event_name }}
record: ${{ env.SHOULD_RECORD }}
parallel: ${{ env.SHOULD_RECORD }}
group: ${{ env.SHOULD_RECORD == 'true' && env.CYPRESS_GROUP || '' }}
tag: ${{ env.SHOULD_RECORD == 'true' && env.CYPRESS_TAG || '' }}
ci-build-id: ${{ env.SHOULD_RECORD == 'true' && env.CYPRESS_CI_BUILD_ID || '' }}
spec: ${{ join(matrix.spec-group.tests, ',') }}
env:
BROWSER: none
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }}
Expand All @@ -133,7 +170,7 @@ jobs:
steps:
- uses: actions/checkout@v2
with:
token: ${{env.GH_TOKEN}}
token: ${{ env.GH_TOKEN }}
- uses: actions/setup-node@v3
with:
node-version: 20.x
Expand Down
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,15 @@ yarn start
yarn start --no-manager-cache
```

## Conditional E2E Test Recording

To record e2e tests in Cypress Cloud, you can use one of the following methods based on your needs:

- **Commit Message**: Include `[e2e record]` in your commit messages to activate recording.
- **GitHub Labels**: Apply the `e2e record` label to your pull request to trigger recording.

This setup helps in managing Cypress Cloud credits more efficiently, ensuring recordings are only made when explicitly required.

## Reporting an issue or opening a PR

See [CONTRIBUTING.md](CONTRIBUTING.md)
35 changes: 35 additions & 0 deletions cypress/support/generateTestMatrix.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const fs = require('fs')
const path = require('path')

const getAllFiles = (dirPath, arrayOfFiles = []) => {
const files = fs.readdirSync(dirPath)

files.forEach((file) => {
if (fs.statSync(path.join(dirPath, file)).isDirectory()) {
arrayOfFiles = getAllFiles(path.join(dirPath, file), arrayOfFiles)
} else if (path.extname(file) === '.feature') {
arrayOfFiles.push(path.join(dirPath, file))
}
})

return arrayOfFiles
}

const createGroups = (files, numberOfGroups = 7) => {
const groups = []
for (let i = 0; i < numberOfGroups; i++) {
groups.push([])
}

files.forEach((file, index) => {
groups[index % numberOfGroups].push(file)
})

return groups.map((group, index) => ({ id: index + 1, tests: group }))
}

const cypressSpecsPath = '../'
const specs = getAllFiles(cypressSpecsPath)
const groupedSpecs = createGroups(specs)

console.log(JSON.stringify(groupedSpecs))

0 comments on commit 6962afc

Please sign in to comment.