mirror of
https://github.com/bookorbit/bookorbit.git
synced 2026-11-03 08:21:39 -06:00
ci: consolidate E2E into pipeline and gate image builds on test suite
This commit is contained in:
@@ -216,3 +216,243 @@ jobs:
|
||||
echo "dependency-review=${{ needs.dependency-review.result }}"
|
||||
echo "detect-changes=${{ needs.detect-changes.result }}"
|
||||
echo "checks=${{ needs.checks.result }}"
|
||||
|
||||
e2e-setup:
|
||||
name: Detect E2E Suites
|
||||
runs-on: ubuntu-latest
|
||||
needs: [quality-gate]
|
||||
if: needs.quality-gate.result == 'success'
|
||||
timeout-minutes: 5
|
||||
outputs:
|
||||
matrix: ${{ steps.build-matrix.outputs.matrix }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Detect path changes per suite
|
||||
id: changes
|
||||
if: github.event_name != 'workflow_dispatch'
|
||||
uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4
|
||||
with:
|
||||
filters: |
|
||||
workflow-changed:
|
||||
- '.github/workflows/ci.yml'
|
||||
- '.github/workflows/e2e.yml'
|
||||
- '.github/workflows/e2e-runner.yml'
|
||||
- 'Dockerfile'
|
||||
- 'docker-compose*.yml'
|
||||
- 'docker/**'
|
||||
app-smoke:
|
||||
- 'server/src/**'
|
||||
- 'server/test/app-smoke.e2e-spec.ts'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'packages/types/src/**'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
- '.github/workflows/e2e-runner.yml'
|
||||
auth-session-security:
|
||||
- 'server/src/modules/auth/**'
|
||||
- 'server/src/modules/user/**'
|
||||
- 'server/src/modules/role/**'
|
||||
- 'server/src/common/guards/**'
|
||||
- 'server/src/common/decorators/**'
|
||||
- 'server/src/common/types/**'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'server/test/auth-session-security.e2e-spec.ts'
|
||||
- 'server/test/e2e/app-harness.ts'
|
||||
- 'packages/types/src/auth.ts'
|
||||
- 'packages/types/src/permissions.ts'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
- '.github/workflows/e2e-runner.yml'
|
||||
auth-recovery-oidc-logout:
|
||||
- 'server/src/modules/auth/**'
|
||||
- 'server/src/modules/user/**'
|
||||
- 'server/src/modules/email/**'
|
||||
- 'server/src/modules/metadata/**'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'server/test/auth-recovery-oidc-logout.e2e-spec.ts'
|
||||
- 'server/test/e2e/app-harness.ts'
|
||||
- 'packages/types/src/auth.ts'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
- '.github/workflows/e2e-runner.yml'
|
||||
authorization-matrix:
|
||||
- 'server/src/**'
|
||||
- 'server/test/authorization-matrix.e2e-spec.ts'
|
||||
- 'server/test/e2e/authorization-matrix/**'
|
||||
- 'packages/types/src/**'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
- '.github/workflows/e2e-runner.yml'
|
||||
email-lifecycle:
|
||||
- 'server/src/modules/email/**'
|
||||
- 'server/src/modules/book/**'
|
||||
- 'server/src/modules/library/**'
|
||||
- 'server/src/modules/auth/**'
|
||||
- 'server/src/modules/cover/**'
|
||||
- 'server/src/modules/scanner/**'
|
||||
- 'server/src/modules/seed/**'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'packages/types/src/**'
|
||||
- 'server/test/email-lifecycle.e2e-spec.ts'
|
||||
- 'server/test/e2e/email/**'
|
||||
- 'server/test/e2e/**'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
- 'client/src/features/email/**'
|
||||
- 'client/src/router/index.ts'
|
||||
- 'client/src/features/settings/SettingsHeader.vue'
|
||||
- 'client/src/views/HomeView.vue'
|
||||
- 'client/src/views/CollectionView.vue'
|
||||
- 'client/src/views/LensView.vue'
|
||||
- 'client/src/features/book/components/BookCoverCard.vue'
|
||||
- 'client/src/features/book/components/BookListRow.vue'
|
||||
metadata-write:
|
||||
- 'server/src/modules/book/**'
|
||||
- 'server/src/modules/library/**'
|
||||
- 'server/src/modules/file-write/**'
|
||||
- 'server/src/modules/metadata/**'
|
||||
- 'server/src/modules/app-settings/**'
|
||||
- 'server/test/metadata-write.e2e-spec.ts'
|
||||
- 'server/test/e2e/metadata-write/**'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'packages/types/src/file-write.ts'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
opds-auth-catalog:
|
||||
- 'server/src/modules/opds/**'
|
||||
- 'server/src/modules/book/**'
|
||||
- 'server/src/modules/library/**'
|
||||
- 'server/src/modules/collection/**'
|
||||
- 'server/src/modules/lens/**'
|
||||
- 'server/src/modules/user/**'
|
||||
- 'server/src/modules/auth/**'
|
||||
- 'server/src/modules/app-settings/**'
|
||||
- 'server/test/opds-auth-catalog.e2e-spec.ts'
|
||||
- 'server/test/e2e/opds/**'
|
||||
- 'server/test/e2e/**'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'packages/types/src/**'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
reader-state-isolation:
|
||||
- 'server/src/modules/bookmark/**'
|
||||
- 'server/src/modules/annotation/**'
|
||||
- 'server/src/modules/reader-preferences/**'
|
||||
- 'server/src/modules/reading-session/**'
|
||||
- 'server/src/modules/book/**'
|
||||
- 'server/src/modules/library/**'
|
||||
- 'server/src/modules/scanner/**'
|
||||
- 'server/src/modules/user-book-status/**'
|
||||
- 'server/src/scripts/db-prepare-e2e.ts'
|
||||
- 'server/test/reader-state-isolation.e2e-spec.ts'
|
||||
- 'server/test/e2e/reader-state-isolation/**'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'packages/types/src/reader-settings.ts'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
scanner-file-operations:
|
||||
- 'server/src/modules/scanner/**'
|
||||
- 'server/test/scanner-file-operations.e2e-spec.ts'
|
||||
- 'server/test/e2e/scanner/**'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
- '.github/workflows/e2e-runner.yml'
|
||||
scanner-scenarios:
|
||||
- 'server/src/modules/scanner/**'
|
||||
- 'server/test/scanner-scenarios.e2e-spec.ts'
|
||||
- 'server/test/e2e/scanner/**'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
- '.github/workflows/e2e-runner.yml'
|
||||
staging-ingest-finalize:
|
||||
- 'server/src/modules/staging/**'
|
||||
- 'server/src/modules/upload/**'
|
||||
- 'server/src/modules/metadata/**'
|
||||
- 'server/test/staging-ingest-finalize.e2e-spec.ts'
|
||||
- 'server/test/e2e/staging/**'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
users-admin-lifecycle:
|
||||
- 'server/src/modules/user/**'
|
||||
- 'server/src/modules/auth/**'
|
||||
- 'server/src/common/guards/**'
|
||||
- 'server/src/common/decorators/**'
|
||||
- 'server/src/common/types/**'
|
||||
- 'server/src/db/schema/**'
|
||||
- 'server/test/users-admin-lifecycle.e2e-spec.ts'
|
||||
- 'server/test/e2e/users-admin-lifecycle/**'
|
||||
- 'packages/types/src/auth.ts'
|
||||
- 'packages/types/src/permissions.ts'
|
||||
- 'scripts/test/**'
|
||||
- 'scripts/db/**'
|
||||
- '.github/workflows/e2e-runner.yml'
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
|
||||
- name: Build suite matrix
|
||||
id: build-matrix
|
||||
shell: bash
|
||||
run: |
|
||||
SUITES_DEF=$(node scripts/test/list-suites-json.mjs)
|
||||
|
||||
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
|
||||
MATRIX="$SUITES_DEF"
|
||||
elif [ "${{ steps.changes.outputs.workflow-changed }}" == "true" ]; then
|
||||
MATRIX="$SUITES_DEF"
|
||||
else
|
||||
CHANGED='${{ steps.changes.outputs.changes }}'
|
||||
if [ -z "$CHANGED" ] || [ "$CHANGED" == "[]" ]; then
|
||||
MATRIX="[]"
|
||||
else
|
||||
MATRIX=$(echo "$SUITES_DEF" | jq --argjson changed "$CHANGED" \
|
||||
'[.[] | select(.id as $id | $changed | index($id) != null)]')
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "matrix=$(echo "$MATRIX" | jq -c .)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
e2e:
|
||||
needs: [e2e-setup]
|
||||
if: needs.e2e-setup.outputs.matrix != '[]'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
suite: ${{ fromJSON(needs.e2e-setup.outputs.matrix) }}
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: ${{ matrix.suite.id }}
|
||||
check-name: "E2E - ${{ matrix.suite.name }}"
|
||||
artifact-name: "e2e-${{ matrix.suite.id }}-report"
|
||||
job-timeout-minutes: ${{ matrix.suite.timeout }}
|
||||
|
||||
ci-gate:
|
||||
name: CI Gate
|
||||
runs-on: ubuntu-latest
|
||||
needs: [quality-gate, e2e-setup, e2e]
|
||||
timeout-minutes: 5
|
||||
if: always()
|
||||
steps:
|
||||
- name: Fail if any job failed or was cancelled
|
||||
if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')
|
||||
run: |
|
||||
echo "One or more CI jobs failed or were cancelled."
|
||||
exit 1
|
||||
|
||||
- name: CI complete
|
||||
run: |
|
||||
echo "quality-gate=${{ needs.quality-gate.result }}"
|
||||
echo "e2e-setup=${{ needs.e2e-setup.result }}"
|
||||
echo "e2e=${{ needs.e2e.result }}"
|
||||
|
||||
@@ -2,6 +2,7 @@ name: Container Image
|
||||
run-name: ${{ github.event_name == 'workflow_run' && format('Image - {0} ({1})', github.event.workflow_run.head_commit.message, github.event.workflow_run.head_branch) || format('Image - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
# Break-glass: bypasses CI/E2E gate. Use only when CI is broken and a hotfix image is urgently needed.
|
||||
workflow_dispatch:
|
||||
workflow_run:
|
||||
workflows: ["CI"]
|
||||
@@ -85,7 +86,7 @@ jobs:
|
||||
set -euo pipefail
|
||||
echo "Checking CI status for commit ${COMMIT_SHA}..."
|
||||
success_count=$(gh api --paginate \
|
||||
"repos/${GH_REPO}/actions/workflows/ci.yml/runs?head_sha=${COMMIT_SHA}&status=completed" \
|
||||
"repos/${GH_REPO}/actions/workflows/ci.yml/runs?head_sha=${COMMIT_SHA}&status=completed&event=push&branch=main" \
|
||||
--jq '[.workflow_runs[] | select(.conclusion == "success")] | length' \
|
||||
| awk '{sum += $1} END {print sum}')
|
||||
if [[ "${success_count:-0}" -lt 1 ]]; then
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
name: E2E - App Smoke
|
||||
run-name: ${{ format('E2E - App Smoke - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "server/src/**"
|
||||
- "server/test/app-smoke.e2e-spec.ts"
|
||||
- "server/src/db/schema/**"
|
||||
- "packages/types/src/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/**"
|
||||
- "server/test/app-smoke.e2e-spec.ts"
|
||||
- "server/src/db/schema/**"
|
||||
- "packages/types/src/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
app-smoke:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: app-smoke
|
||||
check-name: E2E - App Smoke
|
||||
artifact-name: e2e-app-smoke-report
|
||||
job-timeout-minutes: 30
|
||||
@@ -1,48 +0,0 @@
|
||||
name: E2E - Auth Recovery OIDC Logout
|
||||
run-name: ${{ format('E2E - Auth Recovery OIDC Logout - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "server/src/modules/auth/**"
|
||||
- "server/src/modules/user/**"
|
||||
- "server/src/modules/email/**"
|
||||
- "server/src/modules/metadata/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "server/test/auth-recovery-oidc-logout.e2e-spec.ts"
|
||||
- "server/test/e2e/app-harness.ts"
|
||||
- "packages/types/src/auth.ts"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/modules/auth/**"
|
||||
- "server/src/modules/user/**"
|
||||
- "server/src/modules/email/**"
|
||||
- "server/src/modules/metadata/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "server/test/auth-recovery-oidc-logout.e2e-spec.ts"
|
||||
- "server/test/e2e/app-harness.ts"
|
||||
- "packages/types/src/auth.ts"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
auth-recovery-oidc-logout:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: auth-recovery-oidc-logout
|
||||
check-name: E2E - Auth Recovery OIDC Logout
|
||||
artifact-name: e2e-auth-recovery-oidc-logout-report
|
||||
job-timeout-minutes: 50
|
||||
@@ -1,54 +0,0 @@
|
||||
name: E2E - Auth Session Security
|
||||
run-name: ${{ format('E2E - Auth Session Security - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "server/src/modules/auth/**"
|
||||
- "server/src/modules/user/**"
|
||||
- "server/src/modules/role/**"
|
||||
- "server/src/common/guards/**"
|
||||
- "server/src/common/decorators/**"
|
||||
- "server/src/common/types/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "server/test/auth-session-security.e2e-spec.ts"
|
||||
- "server/test/e2e/app-harness.ts"
|
||||
- "packages/types/src/auth.ts"
|
||||
- "packages/types/src/permissions.ts"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/modules/auth/**"
|
||||
- "server/src/modules/user/**"
|
||||
- "server/src/modules/role/**"
|
||||
- "server/src/common/guards/**"
|
||||
- "server/src/common/decorators/**"
|
||||
- "server/src/common/types/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "server/test/auth-session-security.e2e-spec.ts"
|
||||
- "server/test/e2e/app-harness.ts"
|
||||
- "packages/types/src/auth.ts"
|
||||
- "packages/types/src/permissions.ts"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
auth-session-security:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: auth-session-security
|
||||
check-name: E2E - Auth Session Security
|
||||
artifact-name: e2e-auth-session-security-report
|
||||
job-timeout-minutes: 50
|
||||
@@ -1,42 +0,0 @@
|
||||
name: E2E - Authorization Matrix
|
||||
run-name: ${{ format('E2E - Authorization Matrix - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "server/src/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "server/test/authorization-matrix.e2e-spec.ts"
|
||||
- "server/test/e2e/authorization-matrix/**"
|
||||
- "packages/types/src/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "server/test/authorization-matrix.e2e-spec.ts"
|
||||
- "server/test/e2e/authorization-matrix/**"
|
||||
- "packages/types/src/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
authorization-matrix:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: authorization-matrix
|
||||
check-name: E2E - Authorization Matrix
|
||||
artifact-name: e2e-authorization-matrix-report
|
||||
job-timeout-minutes: 60
|
||||
@@ -1,70 +0,0 @@
|
||||
name: E2E - Email Lifecycle
|
||||
run-name: ${{ format('E2E - Email Lifecycle - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "server/src/modules/email/**"
|
||||
- "server/src/modules/book/**"
|
||||
- "server/src/modules/library/**"
|
||||
- "server/src/modules/auth/**"
|
||||
- "server/src/modules/cover/**"
|
||||
- "server/src/modules/scanner/**"
|
||||
- "server/src/modules/seed/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "packages/types/src/**"
|
||||
- "server/test/email-lifecycle.e2e-spec.ts"
|
||||
- "server/test/e2e/email/**"
|
||||
- "server/test/e2e/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- "client/src/features/email/**"
|
||||
- "client/src/router/index.ts"
|
||||
- "client/src/features/settings/SettingsHeader.vue"
|
||||
- "client/src/views/HomeView.vue"
|
||||
- "client/src/views/CollectionView.vue"
|
||||
- "client/src/views/LensView.vue"
|
||||
- "client/src/features/book/components/BookCoverCard.vue"
|
||||
- "client/src/features/book/components/BookListRow.vue"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/modules/email/**"
|
||||
- "server/src/modules/book/**"
|
||||
- "server/src/modules/library/**"
|
||||
- "server/src/modules/auth/**"
|
||||
- "server/src/modules/cover/**"
|
||||
- "server/src/modules/scanner/**"
|
||||
- "server/src/modules/seed/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "packages/types/src/**"
|
||||
- "server/test/email-lifecycle.e2e-spec.ts"
|
||||
- "server/test/e2e/email/**"
|
||||
- "server/test/e2e/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- "client/src/features/email/**"
|
||||
- "client/src/router/index.ts"
|
||||
- "client/src/features/settings/SettingsHeader.vue"
|
||||
- "client/src/views/HomeView.vue"
|
||||
- "client/src/views/CollectionView.vue"
|
||||
- "client/src/views/LensView.vue"
|
||||
- "client/src/features/book/components/BookCoverCard.vue"
|
||||
- "client/src/features/book/components/BookListRow.vue"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
email-lifecycle:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: email-lifecycle
|
||||
check-name: E2E - Email Lifecycle
|
||||
artifact-name: e2e-email-lifecycle-report
|
||||
job-timeout-minutes: 45
|
||||
@@ -1,55 +0,0 @@
|
||||
name: E2E - Metadata Write
|
||||
run-name: ${{ format('E2E - Metadata Write - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
vitest-args:
|
||||
description: 'Optional vitest args (examples: --shard=1/2, --testNamePattern="concurrency hardening")'
|
||||
required: false
|
||||
default: ""
|
||||
type: string
|
||||
push:
|
||||
paths:
|
||||
- "server/src/modules/book/**"
|
||||
- "server/src/modules/library/**"
|
||||
- "server/src/modules/file-write/**"
|
||||
- "server/src/modules/metadata/**"
|
||||
- "server/src/modules/app-settings/**"
|
||||
- "server/test/metadata-write.e2e-spec.ts"
|
||||
- "server/test/e2e/metadata-write/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "packages/types/src/file-write.ts"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/modules/book/**"
|
||||
- "server/src/modules/library/**"
|
||||
- "server/src/modules/file-write/**"
|
||||
- "server/src/modules/metadata/**"
|
||||
- "server/src/modules/app-settings/**"
|
||||
- "server/test/metadata-write.e2e-spec.ts"
|
||||
- "server/test/e2e/metadata-write/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "packages/types/src/file-write.ts"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
metadata-write:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: metadata-write
|
||||
check-name: E2E - Metadata Write
|
||||
artifact-name: e2e-metadata-write-report
|
||||
job-timeout-minutes: 60
|
||||
vitest-args: ${{ github.event_name == 'workflow_dispatch' && inputs.vitest-args || '' }}
|
||||
@@ -1,56 +0,0 @@
|
||||
name: E2E - OPDS Auth Catalog
|
||||
run-name: ${{ format('E2E - OPDS Auth Catalog - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "server/src/modules/opds/**"
|
||||
- "server/src/modules/book/**"
|
||||
- "server/src/modules/library/**"
|
||||
- "server/src/modules/collection/**"
|
||||
- "server/src/modules/lens/**"
|
||||
- "server/src/modules/user/**"
|
||||
- "server/src/modules/auth/**"
|
||||
- "server/src/modules/app-settings/**"
|
||||
- "server/test/opds-auth-catalog.e2e-spec.ts"
|
||||
- "server/test/e2e/opds/**"
|
||||
- "server/test/e2e/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "packages/types/src/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/modules/opds/**"
|
||||
- "server/src/modules/book/**"
|
||||
- "server/src/modules/library/**"
|
||||
- "server/src/modules/collection/**"
|
||||
- "server/src/modules/lens/**"
|
||||
- "server/src/modules/user/**"
|
||||
- "server/src/modules/auth/**"
|
||||
- "server/src/modules/app-settings/**"
|
||||
- "server/test/opds-auth-catalog.e2e-spec.ts"
|
||||
- "server/test/e2e/opds/**"
|
||||
- "server/test/e2e/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "packages/types/src/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
opds-auth-catalog:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: opds-auth-catalog
|
||||
check-name: E2E - OPDS Auth Catalog
|
||||
artifact-name: e2e-opds-auth-catalog-report
|
||||
job-timeout-minutes: 45
|
||||
@@ -1,56 +0,0 @@
|
||||
name: E2E - Reader State Isolation
|
||||
run-name: ${{ format('E2E - Reader State Isolation - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "server/src/modules/bookmark/**"
|
||||
- "server/src/modules/annotation/**"
|
||||
- "server/src/modules/reader-preferences/**"
|
||||
- "server/src/modules/reading-session/**"
|
||||
- "server/src/modules/book/**"
|
||||
- "server/src/modules/library/**"
|
||||
- "server/src/modules/scanner/**"
|
||||
- "server/src/modules/user-book-status/**"
|
||||
- "server/src/scripts/db-prepare-e2e.ts"
|
||||
- "server/test/reader-state-isolation.e2e-spec.ts"
|
||||
- "server/test/e2e/reader-state-isolation/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "packages/types/src/reader-settings.ts"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/modules/bookmark/**"
|
||||
- "server/src/modules/annotation/**"
|
||||
- "server/src/modules/reader-preferences/**"
|
||||
- "server/src/modules/reading-session/**"
|
||||
- "server/src/modules/book/**"
|
||||
- "server/src/modules/library/**"
|
||||
- "server/src/modules/scanner/**"
|
||||
- "server/src/modules/user-book-status/**"
|
||||
- "server/src/scripts/db-prepare-e2e.ts"
|
||||
- "server/test/reader-state-isolation.e2e-spec.ts"
|
||||
- "server/test/e2e/reader-state-isolation/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "packages/types/src/reader-settings.ts"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
reader-state-isolation:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: reader-state-isolation
|
||||
check-name: E2E - Reader State Isolation
|
||||
artifact-name: e2e-reader-state-isolation-report
|
||||
job-timeout-minutes: 45
|
||||
@@ -1,42 +0,0 @@
|
||||
name: E2E - Scanner File Operations
|
||||
run-name: ${{ format('E2E - Scanner File Operations - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: "0 4 * * *"
|
||||
push:
|
||||
paths:
|
||||
- "server/src/modules/scanner/**"
|
||||
- "server/test/scanner-file-operations.e2e-spec.ts"
|
||||
- "server/test/e2e/scanner/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/modules/scanner/**"
|
||||
- "server/test/scanner-file-operations.e2e-spec.ts"
|
||||
- "server/test/e2e/scanner/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
scanner-file-operations:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: scanner-file-operations
|
||||
check-name: E2E - Scanner File Operations
|
||||
artifact-name: e2e-scanner-file-operations-report
|
||||
job-timeout-minutes: 60
|
||||
@@ -1,40 +0,0 @@
|
||||
name: E2E - Scanner Scenarios
|
||||
run-name: ${{ format('E2E - Scanner Scenarios - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "server/src/modules/scanner/**"
|
||||
- "server/test/scanner-scenarios.e2e-spec.ts"
|
||||
- "server/test/e2e/scanner/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/modules/scanner/**"
|
||||
- "server/test/scanner-scenarios.e2e-spec.ts"
|
||||
- "server/test/e2e/scanner/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
scanner-scenarios:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: scanner-scenarios
|
||||
check-name: E2E - Scanner Scenarios
|
||||
artifact-name: e2e-scanner-scenarios-report
|
||||
job-timeout-minutes: 45
|
||||
@@ -1,42 +0,0 @@
|
||||
name: E2E - Staging Ingest Finalize
|
||||
run-name: ${{ format('E2E - Staging Ingest Finalize - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "server/src/modules/staging/**"
|
||||
- "server/src/modules/upload/**"
|
||||
- "server/src/modules/metadata/**"
|
||||
- "server/test/staging-ingest-finalize.e2e-spec.ts"
|
||||
- "server/test/e2e/staging/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/modules/staging/**"
|
||||
- "server/src/modules/upload/**"
|
||||
- "server/src/modules/metadata/**"
|
||||
- "server/test/staging-ingest-finalize.e2e-spec.ts"
|
||||
- "server/test/e2e/staging/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
staging-ingest-finalize:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: staging-ingest-finalize
|
||||
check-name: E2E - Staging Ingest Finalize
|
||||
artifact-name: e2e-staging-ingest-finalize-report
|
||||
job-timeout-minutes: 45
|
||||
@@ -1,52 +0,0 @@
|
||||
name: E2E - Users Admin Lifecycle
|
||||
run-name: ${{ format('E2E - Users Admin Lifecycle - {0}', github.ref_name) }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- "server/src/modules/user/**"
|
||||
- "server/src/modules/auth/**"
|
||||
- "server/src/common/guards/**"
|
||||
- "server/src/common/decorators/**"
|
||||
- "server/src/common/types/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "server/test/users-admin-lifecycle.e2e-spec.ts"
|
||||
- "server/test/e2e/users-admin-lifecycle/**"
|
||||
- "packages/types/src/auth.ts"
|
||||
- "packages/types/src/permissions.ts"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
pull_request:
|
||||
paths:
|
||||
- "server/src/modules/user/**"
|
||||
- "server/src/modules/auth/**"
|
||||
- "server/src/common/guards/**"
|
||||
- "server/src/common/decorators/**"
|
||||
- "server/src/common/types/**"
|
||||
- "server/src/db/schema/**"
|
||||
- "server/test/users-admin-lifecycle.e2e-spec.ts"
|
||||
- "server/test/e2e/users-admin-lifecycle/**"
|
||||
- "packages/types/src/auth.ts"
|
||||
- "packages/types/src/permissions.ts"
|
||||
- "scripts/test/**"
|
||||
- "scripts/db/**"
|
||||
- ".github/workflows/e2e-runner.yml"
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
jobs:
|
||||
users-admin-lifecycle:
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: users-admin-lifecycle
|
||||
check-name: E2E - Users Admin Lifecycle
|
||||
artifact-name: e2e-users-admin-lifecycle-report
|
||||
job-timeout-minutes: 50
|
||||
@@ -0,0 +1,57 @@
|
||||
name: E2E (Manual)
|
||||
run-name: E2E (dispatch) - ${{ github.ref_name }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
vitest-args:
|
||||
description: 'Optional vitest args forwarded to all suites (e.g. --testNamePattern="some test")'
|
||||
required: false
|
||||
default: ""
|
||||
type: string
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
checks: write
|
||||
|
||||
env:
|
||||
NODE_VERSION: "24"
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
name: Build Suite Matrix
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
outputs:
|
||||
matrix: ${{ steps.build.outputs.matrix }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
|
||||
- name: Build matrix
|
||||
id: build
|
||||
shell: bash
|
||||
run: echo "matrix=$(node scripts/test/list-suites-json.mjs)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
e2e:
|
||||
needs: setup
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
suite: ${{ fromJSON(needs.setup.outputs.matrix) }}
|
||||
uses: ./.github/workflows/e2e-runner.yml
|
||||
with:
|
||||
suite-id: ${{ matrix.suite.id }}
|
||||
check-name: "E2E - ${{ matrix.suite.name }}"
|
||||
artifact-name: "e2e-${{ matrix.suite.id }}-report"
|
||||
job-timeout-minutes: ${{ matrix.suite.timeout }}
|
||||
vitest-args: ${{ inputs.vitest-args || '' }}
|
||||
Reference in New Issue
Block a user