mirror of
https://github.com/home-assistant/frontend.git
synced 2026-08-17 18:42:40 +01:00
396 lines
12 KiB
YAML
396 lines
12 KiB
YAML
name: E2E Tests
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- dev
|
|
- master
|
|
pull_request:
|
|
branches:
|
|
- dev
|
|
- master
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
NODE_OPTIONS: --max_old_space_size=6144
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
prepare-dependencies:
|
|
name: Prepare dependencies
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Check out files from GitHub
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Prepare dependencies
|
|
uses: ./.github/actions/prepare-dependencies
|
|
|
|
prepare-container-dependencies:
|
|
name: Prepare container dependencies
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: mcr.microsoft.com/playwright:v1.62.1-noble
|
|
options: --user 1001
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
steps:
|
|
- name: Check out files from GitHub
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Prepare dependencies
|
|
uses: ./.github/actions/prepare-dependencies
|
|
with:
|
|
node-modules-cache-key: node-modules-container-v1
|
|
|
|
# ── Build the demo once and share it across test jobs via artifact ──────────
|
|
build-demo:
|
|
name: Build demo
|
|
needs: prepare-dependencies
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Check out files from GitHub
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Setup Node with shared dependencies
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-modules-cache: true
|
|
|
|
- name: Build demo
|
|
uses: ./.github/actions/build
|
|
with:
|
|
target: build-demo-e2e
|
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
is-test: true
|
|
|
|
- name: Upload demo build
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: demo-dist
|
|
path: demo/dist/
|
|
if-no-files-found: error
|
|
retention-days: 3
|
|
|
|
# ── Build the e2e test app and share it via artifact ────────────────────────
|
|
build-e2e-test-app:
|
|
name: Build e2e test app
|
|
needs: prepare-dependencies
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Check out files from GitHub
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Setup Node with shared dependencies
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-modules-cache: true
|
|
|
|
- name: Build e2e test app
|
|
uses: ./.github/actions/build
|
|
with:
|
|
target: build-e2e-test-app-e2e
|
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
is-test: true
|
|
|
|
- name: Upload e2e test app build
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: e2e-test-app-dist
|
|
path: test/e2e/app/dist/
|
|
if-no-files-found: error
|
|
retention-days: 3
|
|
|
|
# ── Build the gallery and share it via artifact ─────────────────────────────
|
|
build-gallery:
|
|
name: Build gallery
|
|
needs: prepare-dependencies
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Check out files from GitHub
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Setup Node with shared dependencies
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-modules-cache: true
|
|
|
|
- name: Build gallery
|
|
uses: ./.github/actions/build
|
|
with:
|
|
target: build-gallery
|
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Upload gallery build
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: gallery-dist
|
|
path: gallery/dist/
|
|
if-no-files-found: error
|
|
retention-days: 3
|
|
|
|
# ── Run Playwright tests against Chromium ──────────────────────────────────
|
|
e2e-demo:
|
|
name: E2E demo (${{ matrix.shardIndex }}/${{ matrix.shardTotal }})
|
|
needs:
|
|
- build-demo
|
|
- prepare-container-dependencies
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: mcr.microsoft.com/playwright:v1.62.1-noble
|
|
options: --user 1001 --ipc=host
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
timeout-minutes: 20
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
shardIndex:
|
|
- 1
|
|
- 2
|
|
shardTotal:
|
|
- 2
|
|
steps:
|
|
- name: Check out files from GitHub
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Setup Node with shared dependencies
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-modules-cache: true
|
|
node-modules-cache-key: node-modules-container-v1
|
|
|
|
- name: Download demo build
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
name: demo-dist
|
|
path: demo/dist/
|
|
|
|
- name: Run Playwright demo tests
|
|
run: yarn test:e2e:demo --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
|
|
timeout-minutes: 15
|
|
|
|
- name: Upload demo blob report
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
if: always()
|
|
with:
|
|
name: blob-report-demo-${{ matrix.shardIndex }}
|
|
path: test/e2e/reports/demo/
|
|
if-no-files-found: warn
|
|
retention-days: 3
|
|
|
|
e2e-app:
|
|
name: E2E app (${{ matrix.shardIndex }}/${{ matrix.shardTotal }})
|
|
needs:
|
|
- build-e2e-test-app
|
|
- prepare-container-dependencies
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: mcr.microsoft.com/playwright:v1.62.1-noble
|
|
options: --user 1001 --ipc=host
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
timeout-minutes: 20
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
shardIndex:
|
|
- 1
|
|
- 2
|
|
- 3
|
|
- 4
|
|
shardTotal:
|
|
- 4
|
|
steps:
|
|
- name: Check out files from GitHub
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Setup Node with shared dependencies
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-modules-cache: true
|
|
node-modules-cache-key: node-modules-container-v1
|
|
|
|
- name: Download e2e test app build
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
name: e2e-test-app-dist
|
|
path: test/e2e/app/dist/
|
|
|
|
- name: Run Playwright app tests
|
|
run: yarn test:e2e:app --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
|
|
timeout-minutes: 15
|
|
|
|
- name: Upload app blob report
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
if: always()
|
|
with:
|
|
name: blob-report-app-${{ matrix.shardIndex }}
|
|
path: test/e2e/reports/app/
|
|
if-no-files-found: warn
|
|
retention-days: 3
|
|
|
|
e2e-gallery:
|
|
name: E2E gallery (${{ matrix.shardIndex }}/${{ matrix.shardTotal }})
|
|
needs:
|
|
- build-gallery
|
|
- prepare-container-dependencies
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: mcr.microsoft.com/playwright:v1.62.1-noble
|
|
options: --user 1001 --ipc=host
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
timeout-minutes: 20
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
shardIndex:
|
|
- 1
|
|
- 2
|
|
- 3
|
|
- 4
|
|
shardTotal:
|
|
- 4
|
|
steps:
|
|
- name: Check out files from GitHub
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Setup Node with shared dependencies
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-modules-cache: true
|
|
node-modules-cache-key: node-modules-container-v1
|
|
|
|
- name: Download gallery build
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
name: gallery-dist
|
|
path: gallery/dist/
|
|
|
|
- name: Run Playwright gallery tests
|
|
run: yarn test:e2e:gallery --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}
|
|
timeout-minutes: 15
|
|
|
|
- name: Upload gallery blob report
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
if: always()
|
|
with:
|
|
name: blob-report-gallery-${{ matrix.shardIndex }}
|
|
path: test/e2e/reports/gallery/
|
|
if-no-files-found: warn
|
|
retention-days: 3
|
|
|
|
report:
|
|
name: Report
|
|
needs:
|
|
- e2e-demo
|
|
- e2e-app
|
|
- e2e-gallery
|
|
runs-on: ubuntu-latest
|
|
if: ${{ always() }}
|
|
permissions:
|
|
contents: read
|
|
pull-requests: write
|
|
steps:
|
|
- name: Check out files from GitHub
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- name: Setup Node with shared dependencies
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
node-modules-cache: true
|
|
|
|
- name: Download demo blob reports
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
continue-on-error: true
|
|
with:
|
|
pattern: blob-report-demo-*
|
|
path: test/e2e/reports/demo/
|
|
|
|
- name: Download app blob reports
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
continue-on-error: true
|
|
with:
|
|
pattern: blob-report-app-*
|
|
path: test/e2e/reports/app/
|
|
|
|
- name: Download gallery blob reports
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
continue-on-error: true
|
|
with:
|
|
pattern: blob-report-gallery-*
|
|
path: test/e2e/reports/gallery/
|
|
|
|
- name: Stage blobs for merge
|
|
run: node test/e2e/collect-blob-reports.mjs
|
|
|
|
- name: Merge blob reports
|
|
run: npx playwright merge-reports -c test/e2e/playwright.merge.config.ts test/e2e/reports/blob
|
|
|
|
- name: Upload merged HTML report
|
|
id: upload-report
|
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
with:
|
|
name: playwright-report
|
|
path: test/e2e/reports/combined/
|
|
retention-days: 14
|
|
|
|
- name: Post report to PR
|
|
if: >-
|
|
github.event_name == 'pull_request' &&
|
|
(needs.e2e-demo.result == 'failure' ||
|
|
needs.e2e-app.result == 'failure' ||
|
|
needs.e2e-gallery.result == 'failure')
|
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
|
with:
|
|
script: |
|
|
const { default: postReportComment } = await import(
|
|
`${process.env.GITHUB_WORKSPACE}/test/e2e/post-report-comment.mjs`
|
|
);
|
|
await postReportComment({ github, context, core });
|
|
|
|
- name: Check suite results
|
|
run: |
|
|
failed=0
|
|
for suite in \
|
|
"demo:${{ needs.e2e-demo.result }}" \
|
|
"app:${{ needs.e2e-app.result }}" \
|
|
"gallery:${{ needs.e2e-gallery.result }}"; do
|
|
name="${suite%%:*}"
|
|
result="${suite#*:}"
|
|
echo "E2E ${name}: ${result}"
|
|
if [ "$result" != "success" ]; then
|
|
failed=1
|
|
fi
|
|
done
|
|
exit "$failed"
|