mermaid/.github/workflows/e2e.yml

168 lines
5.8 KiB
YAML
Raw Normal View History

2024-01-19 14:34:25 +01:00
# We use github cache to save snapshots between runs.
# For PRs and MergeQueues, the target commit is used, and for push events, github.event.previous is used.
# If a snapshot for a given Hash is not found, we checkout that commit, run the tests and cache the snapshots.
# These are then downloaded before running the E2E, providing the reference snapshots.
# If there are any errors, the diff image is uploaded to artifacts, and the user is notified.
2021-01-28 22:39:17 +01:00
name: E2E
2021-01-28 22:36:18 +01:00
2023-07-02 06:33:31 +02:00
on:
push:
2024-01-19 15:15:55 +01:00
branches-ignore:
- 'gh-readonly-queue/**'
2023-07-02 06:33:31 +02:00
pull_request:
merge_group:
2021-01-28 22:36:18 +01:00
permissions:
contents: read
2024-01-19 11:20:40 +01:00
env:
2024-01-19 14:34:25 +01:00
# For PRs and MergeQueues, the target commit is used, and for push events, github.event.previous is used.
2024-01-23 19:19:52 +01:00
targetHash: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || (github.event.before == '0000000000000000000000000000000000000000' && 'develop' || github.event.before) }}
2024-01-19 11:20:40 +01:00
2021-01-28 22:36:18 +01:00
jobs:
2024-01-19 07:36:53 +01:00
cache:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 18.x
- name: Cache snapshots
id: cache-snapshot
uses: actions/cache@v4
with:
save-always: true
path: ./cypress/snapshots
2024-01-19 11:20:40 +01:00
key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
2024-01-19 07:36:53 +01:00
2024-01-19 14:34:25 +01:00
# If a snapshot for a given Hash is not found, we checkout that commit, run the tests and cache the snapshots.
2024-01-19 07:36:53 +01:00
- name: Switch to base branch
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
uses: actions/checkout@v4
with:
2024-01-19 11:20:40 +01:00
ref: ${{ env.targetHash }}
2024-01-19 07:47:20 +01:00
2024-01-19 07:36:53 +01:00
- name: Cypress run
uses: cypress-io/github-action@v4
id: cypress-snapshot-gen
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
with:
start: pnpm run dev
wait-on: 'http://localhost:9000'
browser: chrome
2024-01-19 07:47:20 +01:00
2023-07-02 06:44:35 +02:00
e2e:
2021-01-28 22:36:18 +01:00
runs-on: ubuntu-latest
2024-01-19 07:36:53 +01:00
needs: cache
2021-01-28 22:36:18 +01:00
strategy:
2022-09-21 07:06:38 +02:00
fail-fast: false
2021-01-28 22:36:18 +01:00
matrix:
2022-10-10 14:13:50 +02:00
node-version: [18.x]
2022-09-21 07:12:27 +02:00
containers: [1, 2, 3, 4]
2021-01-28 22:36:18 +01:00
steps:
- uses: actions/checkout@v4
2021-01-28 22:36:18 +01:00
- uses: pnpm/action-setup@v2
# uses version from "packageManager" field in package.json
2022-09-21 07:06:38 +02:00
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
2021-01-28 22:36:18 +01:00
2024-01-19 14:34:25 +01:00
# These cached snapshots are downloaded, providing the reference snapshots.
2024-01-19 07:36:53 +01:00
- name: Cache snapshots
id: cache-snapshot
uses: actions/cache/restore@v3
with:
path: ./cypress/snapshots
2024-01-19 11:20:40 +01:00
key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
2024-01-19 07:36:53 +01:00
2022-09-21 07:06:38 +02:00
# Install NPM dependencies, cache them correctly
# and run all Cypress tests
- name: Cypress run
uses: cypress-io/github-action@v4
2023-01-15 20:53:42 +01:00
id: cypress
# If CYPRESS_RECORD_KEY is set, run in parallel on all containers
# Otherwise (e.g. if running from fork), we run on a single container only
if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }}
2022-09-21 07:06:38 +02:00
with:
2023-06-17 14:24:13 +02:00
start: pnpm run dev:coverage
2022-09-21 07:06:38 +02:00
wait-on: 'http://localhost:9000'
2024-01-19 07:36:53 +01:00
browser: chrome
# Disable recording if we don't have an API key
# e.g. if this action was run from a fork
record: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
parallel: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
env:
2022-09-21 07:06:38 +02:00
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
2023-06-17 14:24:13 +02:00
VITEST_COVERAGE: true
2023-07-07 12:26:30 +02:00
CYPRESS_COMMIT: ${{ github.sha }}
2024-01-19 07:36:53 +01:00
2023-06-17 14:24:13 +02:00
- name: Upload Coverage to Codecov
uses: codecov/codecov-action@v3
# Run step only pushes to develop and pull_requests
if: ${{ steps.cypress.conclusion == 'success' && (github.event_name == 'pull_request' || github.ref == 'refs/heads/develop')}}
2023-06-17 14:04:19 +02:00
with:
2023-06-17 14:14:27 +02:00
files: coverage/cypress/lcov.info
2023-06-17 14:04:19 +02:00
flags: e2e
name: mermaid-codecov
2023-07-02 09:52:00 +02:00
fail_ci_if_error: false
2023-06-17 14:04:19 +02:00
verbose: true
2023-07-03 17:31:04 +02:00
token: 6845cc80-77ee-4e17-85a1-026cd95e0766
2024-01-19 07:36:53 +01:00
2024-01-19 14:34:25 +01:00
# We upload the artifacts into numbered archives to prevent overwriting
2023-01-15 20:53:42 +01:00
- name: Upload Artifacts
2024-01-19 10:12:51 +01:00
uses: actions/upload-artifact@v4
2024-01-19 14:34:25 +01:00
if: ${{ always() }}
2023-01-15 20:53:42 +01:00
with:
2024-01-19 11:48:07 +01:00
name: snapshots-${{ matrix.containers }}
2024-01-19 10:12:51 +01:00
retention-days: 1
2024-01-19 11:20:40 +01:00
path: ./cypress/snapshots
2024-01-19 10:12:51 +01:00
combineArtifacts:
needs: e2e
runs-on: ubuntu-latest
2024-01-19 11:54:42 +01:00
if: ${{ always() }}
2024-01-19 10:12:51 +01:00
steps:
2024-01-19 14:34:25 +01:00
# Download all snapshot artifacts and merge them into a single folder
2024-01-19 10:16:21 +01:00
- name: Download All Artifacts
uses: actions/download-artifact@v4
with:
path: snapshots
2024-01-19 11:48:07 +01:00
pattern: snapshots-*
2024-01-19 10:16:21 +01:00
merge-multiple: true
2024-01-19 14:34:25 +01:00
# For successful push events, we save the snapshots cache
2024-01-19 11:48:07 +01:00
- name: Save snapshots cache
id: cache-upload
2024-01-19 14:34:25 +01:00
if: ${{ github.event_name == 'push' && needs.e2e.result != 'failure' }}
2024-01-19 11:48:07 +01:00
uses: actions/cache/save@v3
with:
2024-01-19 14:34:25 +01:00
path: ./snapshots
2024-01-19 11:48:07 +01:00
key: ${{ runner.os }}-snapshots-${{ github.event.after }}
2024-01-19 14:34:25 +01:00
- name: Flatten images to a folder
if: ${{ needs.e2e.result == 'failure' }}
2024-01-19 11:48:07 +01:00
run: |
2024-01-19 10:16:21 +01:00
mkdir errors
cd snapshots
2024-01-19 11:48:07 +01:00
find . -mindepth 2 -type d -name "*__diff_output__*" -exec sh -c 'mv "$0"/*.png ../errors/' {} \;
2024-01-19 14:34:25 +01:00
2024-01-19 11:48:07 +01:00
- name: Upload Error snapshots
2024-01-19 14:34:25 +01:00
if: ${{ needs.e2e.result == 'failure' }}
2024-01-19 10:16:21 +01:00
uses: actions/upload-artifact@v4
2024-01-19 11:00:18 +01:00
id: upload-artifacts
2024-01-19 10:16:21 +01:00
with:
name: error-snapshots
retention-days: 10
path: errors/
2024-01-19 14:34:25 +01:00
2024-01-19 11:00:18 +01:00
- name: Notify Users
2024-01-19 14:34:25 +01:00
if: ${{ needs.e2e.result == 'failure' }}
2024-01-19 11:00:18 +01:00
run: |
2024-01-19 11:53:26 +01:00
echo "::error title=Visual tests failed::You can view images that failed by downloading the error-snapshots artifact: ${{ steps.upload-artifacts.outputs.artifact-url }}"