name: CI on: push: branches: [main] pull_request: branches: [main] permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} jobs: typecheck: name: Typecheck runs-on: ubuntu-latest timeout-minutes: 15 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 22 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm build - run: pnpm typecheck - run: pnpm run --filter emdash-demo --filter @emdash-cms/demo-cloudflare typecheck - run: pnpm typecheck:templates lint: name: Lint runs-on: ubuntu-latest timeout-minutes: 15 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 22 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm build - run: pnpm lint:json test: name: Tests runs-on: ubuntu-latest timeout-minutes: 15 services: postgres: image: postgres:17 env: POSTGRES_PASSWORD: test POSTGRES_DB: emdash_test ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 22 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm run --filter emdash... build - run: pnpm test:unit env: EMDASH_TEST_PG: postgres://postgres:test@localhost:5432/emdash_test validate-plugins: name: Validate Plugins runs-on: ubuntu-latest timeout-minutes: 15 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 22 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm run --filter emdash... build - name: Validate marketplace plugins run: | CLI="node packages/core/dist/cli/index.mjs" for dir in packages/plugins/*/; do [ -f "$dir/package.json" ] || continue if [ ! -f "$dir/src/sandbox-entry.ts" ] && \ ! grep -q '"./sandbox"' "$dir/package.json" 2>/dev/null; then continue fi name=$(basename "$dir") case "$name" in marketplace-test|sandboxed-test|api-test) continue ;; esac echo "::group::Validating $name" $CLI plugin bundle --validateOnly --dir "$dir" echo "::endgroup::" done test-smoke: name: Smoke Tests runs-on: ubuntu-latest timeout-minutes: 10 services: postgres: image: postgres:17 env: POSTGRES_PASSWORD: test POSTGRES_DB: emdash_smoke ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 22 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm build - run: pnpm --filter emdash exec vitest run --config vitest.smoke.config.ts timeout-minutes: 5 env: DATABASE_URL: postgres://postgres:test@localhost:5432/emdash_smoke test-browser: name: Browser Tests runs-on: ubuntu-latest timeout-minutes: 15 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 22 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm run --filter @emdash-cms/admin... build - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 id: playwright-cache with: path: ~/.cache/ms-playwright key: playwright-${{ hashFiles('pnpm-lock.yaml') }} - run: pnpm exec playwright install --with-deps chromium if: steps.playwright-cache.outputs.cache-hit != 'true' - run: pnpm run --filter @emdash-cms/admin test test-e2e-rollup: name: E2E Tests if: always() needs: [test-e2e] runs-on: ubuntu-latest timeout-minutes: 5 steps: - name: Check E2E shard results run: | if [ "${{ needs.test-e2e.result }}" != "success" ]; then echo "E2E tests failed or were cancelled" exit 1 fi test-e2e: name: E2E tests (${{ matrix.shardIndex }}/${{ matrix.shardTotal }}) runs-on: ubuntu-latest timeout-minutes: 20 strategy: fail-fast: false matrix: shardIndex: [1, 2, 3, 4, 5, 6, 7, 8] shardTotal: [8] steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0 - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 with: node-version: 22 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm run --filter emdash... build - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4 id: playwright-cache with: path: ~/.cache/ms-playwright key: playwright-${{ hashFiles('pnpm-lock.yaml') }} - run: pnpm exec playwright install --with-deps chromium if: steps.playwright-cache.outputs.cache-hit != 'true' - run: pnpm exec playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }} - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 if: failure() with: name: playwright-report-${{ matrix.shardIndex }} path: | playwright-report/ test-results/ retention-days: 7