mirror of
https://github.com/nexu-io/open-design.git
synced 2026-10-27 09:51:12 +01:00
* test(e2e): harden coverage and runtime isolation * test(e2e): gate prerelease on full functional suite * test(daemon): enforce prerelease coverage * test(daemon): stabilize full-suite fixtures Generated-By: looper 0.11.8 (runner=fixer, agent=codex) * test(e2e): preserve interaction regression coverage Keep deck navigation subject to Playwright actionability checks and restore the current rail updater/composer stacking witness as an explicit expected failure. Generated-By: looper 0.11.8 (runner=fixer, agent=codex) * fix(ci): close conformance validation gaps Generated-By: looper 0.11.8 (runner=fixer, agent=codex) * test(e2e): restore MCP snippet style guard Restore the browser-computed style witness that was over-deleted when the OAuth flow moved to Integrations, and navigate through the current Settings MCP server entry.\n\nGenerated-By: looper 0.11.8 (runner=fixer, agent=codex) * fix(ci): close directive and job-boundary gaps Compare normalized MUST_FIX directives as sets so identical multi-item rounds remain weak debates, and bound workflow topology assertions to their immediate sibling jobs.\n\nGenerated-By: looper 0.11.8 (runner=fixer, agent=codex)
281 lines
8.9 KiB
YAML
281 lines
8.9 KiB
YAML
name: functional-e2e
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
ref:
|
|
description: "Exact git ref to validate. Prerelease passes its resolved build commit."
|
|
required: true
|
|
type: string
|
|
suite:
|
|
description: "UI suite to run"
|
|
required: false
|
|
default: full
|
|
type: string
|
|
workflow_dispatch:
|
|
inputs:
|
|
ref:
|
|
description: "Optional git ref to validate. Empty uses the dispatched ref."
|
|
required: false
|
|
default: ""
|
|
type: string
|
|
suite:
|
|
description: "UI suite to run"
|
|
required: true
|
|
default: p0
|
|
type: choice
|
|
options:
|
|
- p0
|
|
- p0p1
|
|
- full
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: functional-e2e-${{ inputs.ref || github.ref || github.run_id }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
validate_inputs:
|
|
name: Validate inputs
|
|
runs-on: ubuntu-24.04
|
|
|
|
steps:
|
|
- name: Validate suite
|
|
env:
|
|
SUITE: ${{ inputs.suite }}
|
|
run: |
|
|
case "$SUITE" in
|
|
p0|p0p1|full) ;;
|
|
*)
|
|
echo "Unsupported suite: $SUITE. Expected p0, p0p1, or full." >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
p0_runners:
|
|
name: Resolve UI runner profiles
|
|
needs: [validate_inputs]
|
|
if: ${{ github.repository == 'nexu-io/open-design' }}
|
|
runs-on: ubuntu-24.04
|
|
outputs:
|
|
runs_on: ${{ steps.runners.outputs.runs_on }}
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v6.0.2
|
|
with:
|
|
ref: ${{ inputs.ref || github.sha }}
|
|
|
|
- name: Resolve runner profiles
|
|
id: runners
|
|
env:
|
|
OD_CI_RUNNER_MODE: ${{ vars.OD_CI_RUNNER_MODE }}
|
|
run: python3 .github/scripts/runners.py
|
|
|
|
ui_p0:
|
|
name: UI P0 (${{ matrix.name }})
|
|
needs: [validate_inputs, p0_runners]
|
|
if: ${{ github.repository == 'nexu-io/open-design' && inputs.suite != 'full' }}
|
|
runs-on: ${{ fromJSON(needs.p0_runners.outputs.runs_on).ui_p0 }}
|
|
timeout-minutes: 45
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- name: entry-settings
|
|
shard: entry-settings
|
|
- name: project-workspace
|
|
shard: project-workspace
|
|
- name: project-workspace-editor
|
|
shard: project-workspace-editor
|
|
- name: project-collab
|
|
shard: project-collab
|
|
- name: project-runtime
|
|
shard: project-runtime
|
|
- name: workspace-restoration
|
|
shard: workspace-restoration
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v6.0.2
|
|
with:
|
|
ref: ${{ inputs.ref || github.sha }}
|
|
|
|
- name: Configure CI parallelism
|
|
uses: ./.github/actions/configure-ci-parallelism
|
|
|
|
- name: Setup workspace
|
|
uses: ./.github/actions/setup-workspace
|
|
with:
|
|
runner-labels: ${{ toJSON(fromJSON(needs.p0_runners.outputs.runs_on).ui_p0) }}
|
|
|
|
- name: Setup Playwright
|
|
uses: ./.github/actions/setup-playwright
|
|
with:
|
|
package-json-path: e2e/package.json
|
|
install-command: pnpm -C e2e exec playwright install --with-deps chromium
|
|
runner-labels: ${{ toJSON(fromJSON(needs.p0_runners.outputs.runs_on).ui_p0) }}
|
|
|
|
- name: Prebuild workspace type declarations
|
|
run: |
|
|
pnpm --filter @open-design/daemon build
|
|
pnpm --filter @open-design/desktop build
|
|
pnpm --filter @open-design/web build:sidecar
|
|
|
|
- name: Clean Playwright state
|
|
run: pnpm -C e2e exec tsx scripts/playwright.ts clean
|
|
|
|
- name: Run UI P0 domain
|
|
run: pnpm -C e2e exec tsx scripts/playwright.ts run-ui-group ${{ matrix.shard }}
|
|
|
|
- name: Preserve project-runtime domain artifact
|
|
if: ${{ success() && matrix.shard == 'project-runtime' }}
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: functional-e2e-${{ github.run_id }}-p0-${{ matrix.name }}-domain
|
|
path: |
|
|
e2e/ui/reports/playwright-html-report
|
|
e2e/ui/reports/test-results
|
|
e2e/ui/reports/results.json
|
|
e2e/ui/test-results
|
|
if-no-files-found: ignore
|
|
retention-days: 7
|
|
|
|
- name: Run UI critical extras
|
|
if: ${{ matrix.shard == 'project-runtime' }}
|
|
run: pnpm -C e2e exec tsx scripts/playwright.ts run-ui-group critical-extras
|
|
|
|
- name: Upload Playwright debug artifact
|
|
if: ${{ always() }}
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: functional-e2e-${{ github.run_id }}-p0-${{ matrix.name }}
|
|
path: |
|
|
e2e/ui/reports/playwright-html-report
|
|
e2e/ui/reports/test-results
|
|
e2e/ui/reports/results.json
|
|
e2e/ui/test-results
|
|
if-no-files-found: ignore
|
|
retention-days: 7
|
|
|
|
ui_extended:
|
|
name: UI P1 (${{ matrix.name }})
|
|
needs: [validate_inputs]
|
|
if: ${{ github.repository == 'nexu-io/open-design' && inputs.suite == 'p0p1' }}
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 45
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- name: P1 shard 1
|
|
part: p1
|
|
command: pnpm -C e2e exec playwright test -c playwright.config.ts ui --grep '\[P1\]' --grep-invert '@merge-extra' --shard=1/2
|
|
- name: P1 shard 2
|
|
part: p1
|
|
command: pnpm -C e2e exec playwright test -c playwright.config.ts ui --grep '\[P1\]' --grep-invert '@merge-extra' --shard=2/2
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v6.0.2
|
|
with:
|
|
ref: ${{ inputs.ref || github.sha }}
|
|
|
|
- name: Setup workspace
|
|
uses: ./.github/actions/setup-workspace
|
|
|
|
- name: Setup Playwright
|
|
uses: ./.github/actions/setup-playwright
|
|
with:
|
|
package-json-path: e2e/package.json
|
|
install-command: pnpm -C e2e exec playwright install --with-deps chromium
|
|
|
|
- name: Prebuild workspace type declarations
|
|
run: |
|
|
pnpm --filter @open-design/daemon build
|
|
pnpm --filter @open-design/desktop build
|
|
pnpm --filter @open-design/web build:sidecar
|
|
|
|
- name: Clean Playwright state
|
|
run: pnpm -C e2e exec tsx scripts/playwright.ts clean
|
|
|
|
- name: Run UI P1 shard
|
|
run: ${{ matrix.command }}
|
|
|
|
- name: Upload Playwright debug artifact
|
|
if: ${{ always() }}
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: functional-e2e-${{ github.run_id }}-${{ matrix.part }}-${{ matrix.name }}
|
|
path: |
|
|
e2e/ui/reports/playwright-html-report
|
|
e2e/ui/reports/test-results
|
|
e2e/ui/reports/results.json
|
|
e2e/ui/test-results
|
|
if-no-files-found: ignore
|
|
retention-days: 7
|
|
|
|
ui_full:
|
|
name: Full UI (shard ${{ matrix.shard }}/12)
|
|
needs: [validate_inputs, p0_runners]
|
|
if: ${{ github.repository == 'nexu-io/open-design' && inputs.suite == 'full' }}
|
|
runs-on: ${{ fromJSON(needs.p0_runners.outputs.runs_on).ui_hot }}
|
|
timeout-minutes: 20
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v6.0.2
|
|
with:
|
|
ref: ${{ inputs.ref || github.sha }}
|
|
|
|
- name: Configure CI parallelism
|
|
uses: ./.github/actions/configure-ci-parallelism
|
|
|
|
- name: Setup workspace
|
|
uses: ./.github/actions/setup-workspace
|
|
with:
|
|
runner-labels: ${{ toJSON(fromJSON(needs.p0_runners.outputs.runs_on).ui_hot) }}
|
|
|
|
- name: Setup Playwright
|
|
uses: ./.github/actions/setup-playwright
|
|
with:
|
|
package-json-path: e2e/package.json
|
|
install-command: pnpm -C e2e exec playwright install --with-deps chromium
|
|
runner-labels: ${{ toJSON(fromJSON(needs.p0_runners.outputs.runs_on).ui_hot) }}
|
|
|
|
- name: Prebuild workspace type declarations
|
|
run: |
|
|
pnpm --filter @open-design/daemon build
|
|
pnpm --filter @open-design/desktop build
|
|
pnpm --filter @open-design/web build:sidecar
|
|
|
|
- name: Clean Playwright state
|
|
run: pnpm -C e2e exec tsx scripts/playwright.ts clean
|
|
|
|
- name: Run full UI shard
|
|
# Worker count comes from configure-ci-parallelism (nproc/2, so two
|
|
# on the four-core ui_hot profile); fully-parallel stays on for
|
|
# test-granularity sharding.
|
|
env:
|
|
OD_PLAYWRIGHT_FULLY_PARALLEL: "1"
|
|
run: pnpm -C e2e exec playwright test -c playwright.config.ts ui --shard=${{ matrix.shard }}/12
|
|
|
|
- name: Upload full UI shard artifact
|
|
if: ${{ always() }}
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: ui-full-${{ github.run_id }}-shard-${{ matrix.shard }}-of-12
|
|
path: |
|
|
e2e/ui/reports/playwright-html-report
|
|
e2e/ui/reports/test-results
|
|
e2e/ui/reports/results.json
|
|
e2e/ui/test-results
|
|
if-no-files-found: ignore
|
|
retention-days: 7
|