Cypress End to End Tests #12
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Triggers after the layered build has finished, taking the artifact and running cypress on it | |
# | |
# Also called by a workflow in matrix-js-sdk. | |
# | |
name: Cypress End to End Tests | |
on: | |
workflow_run: | |
workflows: ["Element Web - Build"] | |
types: | |
- completed | |
# support calls from other workflows | |
workflow_call: | |
inputs: | |
react-sdk-repository: | |
type: string | |
required: true | |
description: "The name of the github repository to check out and build." | |
rust-crypto: | |
type: boolean | |
required: false | |
description: "Enable Rust cryptography for the cypress run." | |
secrets: | |
CYPRESS_RECORD_KEY: | |
required: true | |
TCMS_USERNAME: | |
required: true | |
TCMS_PASSWORD: | |
required: true | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.workflow_run.head_branch || github.run_id }} | |
cancel-in-progress: ${{ github.event.workflow_run.event == 'pull_request' }} | |
jobs: | |
prepare: | |
name: Prepare | |
if: github.event.workflow_run.conclusion == 'success' | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
issues: read | |
statuses: write | |
pull-requests: read | |
outputs: | |
uuid: ${{ steps.uuid.outputs.value }} | |
pr_id: ${{ steps.prdetails.outputs.pr_id }} | |
commit_message: ${{ steps.commit.outputs.message }} | |
commit_author: ${{ steps.commit.outputs.author }} | |
commit_email: ${{ steps.commit.outputs.email }} | |
percy_enable: ${{ steps.percy.outputs.value || '0' }} | |
kiwi_enable: ${{ steps.kiwi.outputs.value || '1' }} | |
steps: | |
# We create the status here and then update it to success/failure in the `report` stage | |
# This provides an easy link to this workflow_run from the PR before Cypress is done. | |
- uses: Sibz/github-status-action@faaa4d96fecf273bd762985e0e7f9f933c774918 # v1 | |
with: | |
authToken: ${{ secrets.GITHUB_TOKEN }} | |
state: pending | |
context: ${{ github.workflow }} / cypress | |
sha: ${{ github.event.workflow_run.head_sha }} | |
target_url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
- id: prdetails | |
if: github.event.workflow_run.event == 'pull_request' || github.event.workflow_run.event == 'merge_group' | |
uses: matrix-org/pr-details-action@v1.3 | |
with: | |
owner: ${{ github.event.workflow_run.head_repository.owner.login }} | |
branch: ${{ github.event.workflow_run.head_branch }} | |
- name: Get commit details | |
id: commit | |
if: github.event.workflow_run.event == 'pull_request' || github.event.workflow_run.event == 'merge_group' | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
const response = await github.rest.git.getCommit({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
commit_sha: "${{ github.event.workflow_run.head_sha }}", | |
}); | |
core.setOutput("message", response.data.message); | |
core.setOutput("author", response.data.author.name); | |
core.setOutput("email", response.data.author.email); | |
# Only run Percy when it is demanded or we are running the daily build | |
- name: Enable Percy if X-Needs-Percy | |
id: percy | |
if: | | |
github.event.workflow_run.event == 'schedule' || | |
( | |
github.event.workflow_run.event == 'merge_group' && | |
contains(fromJSON(steps.prdetails.outputs.data).labels.*.name, 'X-Needs-Percy') | |
) | |
run: echo "value=1" >> $GITHUB_OUTPUT | |
# Only export to kiwi when it is demanded or on develop | |
- name: Disable Kiwi if not needed | |
id: kiwi | |
if: | | |
github.event.workflow_run.event == 'pull_request' && | |
!contains(fromJSON(steps.prdetails.outputs.data).labels.*.name, 'X-Send-Kiwi') | |
run: echo "value=0" >> $GITHUB_OUTPUT | |
- name: Generate unique ID 💎 | |
id: uuid | |
run: echo "value=sha-$GITHUB_SHA-time-$(date +"%s")" >> $GITHUB_OUTPUT | |
tests: | |
name: "Run Tests" | |
needs: prepare | |
runs-on: ubuntu-latest | |
permissions: | |
actions: read | |
issues: read | |
pull-requests: read | |
environment: Cypress | |
strategy: | |
fail-fast: false | |
matrix: | |
# Run 4 instances in Parallel | |
runner: [1, 2, 3, 4] | |
steps: | |
- uses: browser-actions/setup-chrome@c485fa3bab6be59dce18dbc18ef6ab7cbc8ff5f1 | |
- run: echo "BROWSER_PATH=$(which chrome)" >> $GITHUB_ENV | |
# There's a 'download artifact' action, but it hasn't been updated for the workflow_run action | |
# (https://github.com/actions/download-artifact/issues/60) so instead we get this mess: | |
- name: 📥 Download artifact | |
uses: dawidd6/action-download-artifact@246dbf436b23d7c49e21a7ab8204ca9ecd1fe615 # v2 | |
with: | |
run_id: ${{ github.event.workflow_run.id }} | |
name: previewbuild | |
path: webapp | |
# The workflow_run.head_sha is the sha of the head commit but the element-web was built using a simulated | |
# merge commit - https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request | |
# so use the sha from the tarball for the checkout of the cypress tests | |
# to make sure we get a matching set of code and tests. | |
- name: Grab sha from webapp | |
id: sha | |
run: | | |
echo "sha=$(cat webapp/sha)" >> $GITHUB_OUTPUT | |
- uses: actions/checkout@v4 | |
with: | |
# XXX: We're checking out untrusted code in a secure context | |
# We need to be careful to not trust anything this code outputs/may do | |
# | |
# Note that (in the absence of a `react-sdk-repository` input), | |
# we check out from the default repository, which is (for this workflow) the | |
# *target* repository for the pull request. | |
# | |
ref: ${{ steps.sha.outputs.sha }} | |
persist-credentials: false | |
path: matrix-react-sdk | |
repository: ${{ inputs.react-sdk-repository || github.repository }} | |
# Enable rust crypto if the calling workflow requests it | |
- name: Enable rust crypto | |
if: inputs.rust-crypto | |
run: | | |
echo "CYPRESS_RUST_CRYPTO=1" >> "$GITHUB_ENV" | |
- name: Run Cypress tests | |
uses: cypress-io/github-action@2558ee6af05072a19de2ce92cb68b38616132726 | |
with: | |
working-directory: matrix-react-sdk | |
# The built-in Electron runner seems to grind to a halt trying to run the tests, so use chrome. | |
browser: ${{ steps.setup-chrome.outputs.chrome-path }} | |
headed: true | |
start: npx serve -p 8080 -L ../webapp | |
wait-on: "http://localhost:8080" | |
record: true | |
parallel: true | |
command: "yarn percy exec --parallel -- npx cypress-cloud run" | |
ci-build-id: ${{ needs.prepare.outputs.uuid }} | |
env: | |
# pass the Dashboard record key as an environment variable | |
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} | |
CURRENTS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} | |
CURRENTS_PROJECT_ID: ${{ github.repository }} | |
CURRENTS_API_URL: ${{ vars.CURRENTS_API_URL }} | |
# Use existing chromium rather than downloading another | |
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true | |
# pass GitHub token to allow accurately detecting a build vs a re-run build | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
# make Node's os.tmpdir() return something where we actually have permissions | |
TMPDIR: ${{ runner.temp }} | |
# tell Cypress more details about the context of this run | |
COMMIT_INFO_BRANCH: ${{ github.event.workflow_run.head_branch }} | |
COMMIT_INFO_SHA: ${{ github.event.workflow_run.head_sha }} | |
COMMIT_INFO_REMOTE: ${{ github.repositoryUrl }} | |
COMMIT_INFO_MESSAGE: ${{ needs.prepare.outputs.commit_message }} | |
COMMIT_INFO_AUTHOR: ${{ needs.prepare.outputs.commit_author }} | |
COMMIT_INFO_EMAIL: ${{ needs.prepare.outputs.commit_email }} | |
CYPRESS_PULL_REQUEST_ID: ${{ needs.prepare.outputs.pr_id }} | |
CYPRESS_PULL_REQUEST_URL: https://github.com/${{ github.repository }}/pull/${{ needs.prepare.outputs.pr_id }} | |
# pass the Percy token as an environment variable | |
PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }} | |
PERCY_ENABLE: ${{ needs.prepare.outputs.percy_enable }} | |
PERCY_BROWSER_EXECUTABLE: ${{ steps.setup-chrome.outputs.chrome-path }} | |
# tell Percy more details about the context of this run | |
PERCY_BRANCH: ${{ github.event.workflow_run.head_branch }} | |
PERCY_COMMIT: ${{ github.event.workflow_run.head_sha }} | |
PERCY_PULL_REQUEST: ${{ needs.prepare.outputs.pr_id }} | |
PERCY_PARALLEL_NONCE: ${{ needs.prepare.outputs.uuid }} | |
# We manually finalize the build in the report stage | |
PERCY_PARALLEL_TOTAL: -1 | |
- name: Upload Artifact | |
if: failure() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: cypress-results | |
path: | | |
matrix-react-sdk/cypress/screenshots | |
matrix-react-sdk/cypress/videos | |
matrix-react-sdk/cypress/synapselogs | |
matrix-react-sdk/cypress/results/cypresslogs | |
- name: Upload reports | |
if: always() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: cypress-junit | |
path: matrix-react-sdk/cypress/results/junit | |
report: | |
name: Report results | |
needs: | |
- prepare | |
- tests | |
runs-on: ubuntu-latest | |
if: always() | |
permissions: | |
statuses: write | |
steps: | |
- name: Finalize Percy | |
if: needs.prepare.outputs.percy_enable == '1' | |
run: npx -p @percy/cli percy build:finalize | |
env: | |
PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }} | |
PERCY_PARALLEL_NONCE: ${{ needs.prepare.outputs.uuid }} | |
- name: Skip Percy required check | |
if: needs.prepare.outputs.percy_enable != '1' | |
uses: Sibz/github-status-action@faaa4d96fecf273bd762985e0e7f9f933c774918 # v1 | |
with: | |
authToken: ${{ secrets.GITHUB_TOKEN }} | |
state: success | |
description: Percy skipped | |
context: percy/matrix-react-sdk | |
sha: ${{ github.event.workflow_run.head_sha }} | |
target_url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
- uses: Sibz/github-status-action@faaa4d96fecf273bd762985e0e7f9f933c774918 # v1 | |
with: | |
authToken: ${{ secrets.GITHUB_TOKEN }} | |
state: ${{ needs.tests.result == 'success' && 'success' || 'failure' }} | |
context: ${{ github.workflow }} / cypress | |
sha: ${{ github.event.workflow_run.head_sha }} | |
target_url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
kiwi: | |
name: Report results to kiwi | |
needs: | |
- prepare | |
- tests | |
environment: Kiwi | |
runs-on: ubuntu-latest | |
if: ${{ needs.prepare.outputs.kiwi_enable == '1' }} | |
steps: | |
- name: Download all zip files | |
uses: actions/download-artifact@v3 | |
with: | |
name: cypress-junit | |
- name: Upload to kiwi | |
uses: vector-im/kiwitcms-upload-action@main | |
with: | |
file-pattern: results-*.xml | |
kiwi-username: ${{ secrets.TCMS_USERNAME }} | |
kiwi-password: ${{ secrets.TCMS_PASSWORD }} | |
product: "Element Web" | |
product-version: ${{ github.event.workflow_run.head_branch }} | |
build-id: ${{ github.event.workflow_run.head_sha }} | |
suite-name: "Cypress E2E" | |
summary-template: "$name" |