element-web/.github/workflows/cypress.yaml

254 lines
12 KiB
YAML
Raw Normal View History

# 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:
2022-12-12 12:24:14 +01:00
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."
secrets:
CYPRESS_RECORD_KEY:
required: true
TCMS_USERNAME:
required: true
TCMS_PASSWORD:
required: true
concurrency:
2023-04-05 18:45:45 +02:00
group: ${{ github.workflow }}-${{ github.event.workflow_run.head_branch || github.run_id }}
2023-02-23 09:42:07 +01:00
cancel-in-progress: ${{ github.event.workflow_run.event == 'pull_request' }}
jobs:
2022-12-12 12:24:14 +01:00
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' }}
2022-12-12 12:24:14 +01:00
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
2022-12-12 12:24:14 +01:00
with:
authToken: ${{ secrets.GITHUB_TOKEN }}
state: pending
2023-04-05 18:45:45 +02:00
context: ${{ github.workflow }} / cypress
2022-12-12 12:24:14 +01:00
sha: ${{ github.event.workflow_run.head_sha }}
target_url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
2022-12-12 12:24:14 +01:00
- id: prdetails
2023-04-05 18:48:27 +02:00
if: github.event.workflow_run.event == 'pull_request' || github.event.workflow_run.event == 'merge_group'
uses: matrix-org/pr-details-action@v1.3
2022-12-12 12:24:14 +01:00
with:
owner: ${{ github.event.workflow_run.head_repository.owner.login }}
branch: ${{ github.event.workflow_run.head_branch }}
2022-12-12 12:24:14 +01:00
- name: Get commit details
id: commit
2023-04-05 18:48:27 +02:00
if: github.event.workflow_run.event == 'pull_request' || github.event.workflow_run.event == 'merge_group'
2022-12-12 12:24:14 +01:00
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);
# Percy is disabled while we're figuring out https://github.com/vector-im/wat-internal/issues/36
# and https://github.com/vector-im/wat-internal/issues/56. We're hoping to turn it back on or switch
# to an alternative in the future.
# # Only run Percy when it is demanded or we are running the daily build
# - name: Enable 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
2022-12-12 12:24:14 +01:00
- name: Generate unique ID 💎
id: uuid
run: echo "value=sha-$GITHUB_SHA-time-$(date +"%s")" >> $GITHUB_OUTPUT
2022-12-12 12:24:14 +01:00
tests:
name: "Run Tests (${{ matrix.crypto }} crypto)"
2022-12-12 12:24:14 +01:00
needs: prepare
runs-on: ubuntu-latest
permissions:
actions: read
issues: read
pull-requests: read
environment: Cypress
strategy:
fail-fast: false
matrix:
# Naive segmentation of tests
segment: ["a-i", "j-p", "q-s", "t-z"]
# Run tests using both crypto stacks
crypto: [legacy, rust]
2022-12-12 12:24:14 +01:00
steps:
- uses: browser-actions/setup-chrome@803ef6dfb4fdf22089c9563225d95e4a515820a0 # v1
- run: echo "BROWSER_PATH=$(which chrome)" >> $GITHUB_ENV
2022-12-12 12:24:14 +01:00
# 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
2022-12-12 12:24:14 +01:00
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
2023-05-05 14:06:45 +02:00
#
# Note that (in the absence of a `react-sdk-repository` input),
# we check out from the default repository, which is (for this workflow) the
2023-05-05 14:06:45 +02:00
# *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: matrix.crypto == 'rust'
run: |
echo "CYPRESS_RUST_CRYPTO=1" >> "$GITHUB_ENV"
2022-12-12 12:24:14 +01:00
- name: Run Cypress tests
uses: cypress-io/github-action@ebe8b24c4428922d0f793a5c4c96853a633180e3 # v6.6.0
2022-12-12 12:24:14 +01:00
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
2022-12-12 12:24:14 +01:00
wait-on: "http://localhost:8080"
record: true
parallel: false
2023-11-09 10:37:33 +01:00
command-prefix: "yarn percy exec --parallel --"
ci-build-id: ${{ needs.prepare.outputs.uuid }}-${{ matrix.crypto }}
spec: cypress/e2e/[${{ matrix.segment }}]*/**
2022-12-12 12:24:14 +01:00
env:
# pass the Dashboard record key as an environment variable
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
2022-12-12 12:24:14 +01:00
# Use existing chromium rather than downloading another
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true
2022-12-12 12:24:14 +01:00
# pass GitHub token to allow accurately detecting a build vs a re-run build
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
2022-12-12 12:24:14 +01:00
# make Node's os.tmpdir() return something where we actually have permissions
TMPDIR: ${{ runner.temp }}
2022-12-12 12:24:14 +01:00
# 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 }}
2023-01-13 11:35:45 +01:00
CYPRESS_PULL_REQUEST_ID: ${{ needs.prepare.outputs.pr_id }}
CYPRESS_PULL_REQUEST_URL: https://github.com/${{ github.repository }}/pull/${{ needs.prepare.outputs.pr_id }}
2022-12-12 12:24:14 +01:00
# pass the Percy token as an environment variable
PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }}
# only run percy on legacy crypto (for now)
PERCY_ENABLE: ${{ matrix.crypto == 'legacy' && needs.prepare.outputs.percy_enable || 0 }}
PERCY_BROWSER_EXECUTABLE: ${{ steps.setup-chrome.outputs.chrome-path }}
2022-12-12 12:24:14 +01:00
# 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 }}
2022-12-12 12:24:14 +01:00
PERCY_PARALLEL_NONCE: ${{ needs.prepare.outputs.uuid }}
# We manually finalize the build in the report stage
PERCY_PARALLEL_TOTAL: -1
- name: 📤 Upload results artifact
2022-12-12 12:24:14 +01:00
if: failure()
uses: actions/upload-artifact@v3
with:
name: cypress-results-${{ matrix.crypto }}-crypto
2022-12-12 12:24:14 +01:00
path: |
matrix-react-sdk/cypress/screenshots
matrix-react-sdk/cypress/videos
matrix-react-sdk/cypress/synapselogs
matrix-react-sdk/cypress/results/cypresslogs
2022-12-12 12:24:14 +01:00
report:
name: Finalize results
needs:
- prepare
- tests
2022-12-12 12:24:14 +01:00
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:
2023-02-23 12:34:20 +01:00
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
2022-12-12 12:24:14 +01:00
with:
authToken: ${{ secrets.GITHUB_TOKEN }}
state: ${{ needs.tests.result == 'success' && 'success' || 'failure' }}
2023-04-05 18:45:45 +02:00
context: ${{ github.workflow }} / cypress
2022-12-12 12:24:14 +01:00
sha: ${{ github.event.workflow_run.head_sha }}
target_url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}