Merge pull request #1409 from constructive-io/feat/pg18-parser-stack #5277
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI tests | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - v1 | |
| paths-ignore: | |
| - '**.md' | |
| - '**/*.md' | |
| - '.agents/skills/**' | |
| - 'docs/**' | |
| pull_request: | |
| branches: | |
| - main | |
| - v1 | |
| paths-ignore: | |
| - '**.md' | |
| - '**/*.md' | |
| - '.agents/skills/**' | |
| - 'docs/**' | |
| workflow_dispatch: | |
| workflow_call: | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }}-tests | |
| cancel-in-progress: true | |
| # --------------------------------------------------------------------------- | |
| # Build-once, test-many architecture with tiered service containers. | |
| # | |
| # Phase 1 – build: single job installs deps + builds the monorepo once. | |
| # Phase 2 – fan-out: test jobs download the build artifact and run tests. | |
| # | |
| # The build artifact is a tar archive to preserve symlinks and all files. | |
| # Test jobs extract the tar and run pnpm install to restore node_modules. | |
| # | |
| # Service tiers (avoids spinning up unneeded containers): | |
| # unit-tests → no services (pure JS/TS) | |
| # pg-tests → PostgreSQL only | |
| # integration-tests → PostgreSQL + MinIO | |
| # ai-tests → PostgreSQL + Ollama | |
| # --------------------------------------------------------------------------- | |
| jobs: | |
| # ========================================================================= | |
| # BUILD (single job – runs once, shared by all test jobs) | |
| # ========================================================================= | |
| build: | |
| if: github.event.pull_request.draft != true | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Configure Git (for tests) | |
| run: | | |
| git config --global user.name "CI Test User" | |
| git config --global user.email "ci@example.com" | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 10 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install | |
| - name: Build | |
| run: pnpm run build | |
| - name: Create build archive | |
| run: tar -czf /tmp/workspace.tar.gz --exclude='.git' --exclude='node_modules' . | |
| - name: Upload workspace | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: workspace-build | |
| path: /tmp/workspace.tar.gz | |
| retention-days: 1 | |
| # ========================================================================= | |
| # TIER 1 – Unit tests (no services needed) | |
| # ========================================================================= | |
| unit-tests: | |
| needs: build | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - batch: uploads | |
| packages: 'uploads/mime-bytes uploads/uuid-hash uploads/uuid-stream uploads/etag-hash uploads/etag-stream uploads/stream-to-etag uploads/content-type-stream uploads/upload-names' | |
| - batch: packages-core | |
| packages: 'packages/url-domains postgres/query-builder packages/csrf packages/oauth packages/12factor-env packages/orm' | |
| - batch: packages-services | |
| packages: 'packages/postmaster packages/smtppostmaster packages/csv-to-pg packages/cli postgres/pgsql-client postgres/pg-ast' | |
| - batch: graphql | |
| packages: 'graphql/query graphql/codegen' | |
| - batch: pglite | |
| packages: 'postgres/pglite-adapter postgres/pglite-test examples/pglite-socket' | |
| steps: | |
| - name: Download workspace | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: workspace-build | |
| - name: Extract workspace | |
| run: tar -xzf workspace.tar.gz && rm workspace.tar.gz | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 10 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Test ${{ matrix.batch }} | |
| run: | | |
| for pkg in ${{ matrix.packages }}; do | |
| echo "::group::Testing $pkg" | |
| (cd ./$pkg && pnpm test) | |
| echo "::endgroup::" | |
| done | |
| # ========================================================================= | |
| # TIER 2 – PostgreSQL-only tests | |
| # ========================================================================= | |
| pg-tests: | |
| needs: build | |
| runs-on: blacksmith-2vcpu-ubuntu-2404 | |
| timeout-minutes: 15 | |
| strategy: | |
| fail-fast: false | |
| # Each package's actual `pnpm test` step runs only a few seconds, while | |
| # every matrix job pays ~50s of fixed overhead (service container init | |
| # dominates). Batch packages into a few jobs that run tests sequentially | |
| # against one shared Postgres container to amortize that overhead. | |
| matrix: | |
| include: | |
| - batch: pg-core | |
| packages: 'pgpm/core pgpm/cli jobs/knative-job-service packages/client packages/safegres postgres/pg-codegen' | |
| - batch: pg-postgres | |
| packages: 'postgres/pgsql-test postgres/drizzle-orm-test postgres/introspectron graphile/graphile-test graphile/graphile-connection-filter graphile/graphile-postgis' | |
| - batch: pg-graphql | |
| packages: 'graphile/graphile-search graphile/graphile-ltree graphile/graphile-bulk-mutations graphile/graphile-function-bindings graphql/orm-test graphql/test graphql/playwright-test' | |
| env: | |
| PGHOST: localhost | |
| PGPORT: 5432 | |
| PGUSER: postgres | |
| PGPASSWORD: password | |
| # packages/client reads TEST_DATABASE_URL; harmless for the others. | |
| TEST_DATABASE_URL: postgres://postgres:password@localhost:5432/postgres | |
| # Pin an explicit heap cap: on smaller runners Node's memory-derived | |
| # default can land near ~2GB and OOM Jest. | |
| NODE_OPTIONS: '--max-old-space-size=4096' | |
| services: | |
| pg_db: | |
| image: ghcr.io/constructive-io/docker/postgres-plus:18 | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: password | |
| options: >- | |
| --health-cmd "pg_isready -U postgres" | |
| --health-interval 3s | |
| --health-timeout 5s | |
| --health-retries 10 | |
| ports: | |
| - 5432:5432 | |
| steps: | |
| - name: Download workspace | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: workspace-build | |
| - name: Extract workspace | |
| run: tar -xzf workspace.tar.gz && rm workspace.tar.gz | |
| - name: Configure Git (for tests) | |
| run: | | |
| git config --global user.name "CI Test User" | |
| git config --global user.email "ci@example.com" | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 10 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| # Durability is irrelevant for throwaway CI databases. Disabling fsync | |
| # and synchronous commit avoids checkpoint I/O stalls on CI runners. | |
| - name: Tune Postgres for CI (disable durability) | |
| run: pnpm --filter pgpm exec node dist/index.js tune --yes | |
| - name: Seed app_user | |
| run: | | |
| pnpm --filter pgpm exec node dist/index.js admin-users bootstrap --yes | |
| pnpm --filter pgpm exec node dist/index.js admin-users add --test --yes | |
| - name: Install pgpm fixture modules | |
| run: pnpm fixtures:install | |
| - name: Test ${{ matrix.batch }} | |
| run: | | |
| for pkg in ${{ matrix.packages }}; do | |
| echo "::group::Testing $pkg" | |
| (cd ./$pkg && pnpm test) | |
| echo "::endgroup::" | |
| done | |
| # ========================================================================= | |
| # TIER 3 – Integration tests (PostgreSQL + MinIO) | |
| # ========================================================================= | |
| integration-tests: | |
| needs: build | |
| runs-on: blacksmith-2vcpu-ubuntu-2404 | |
| timeout-minutes: 15 | |
| strategy: | |
| fail-fast: false | |
| # Batched to amortize per-job fixed overhead (service container init | |
| # dominates) — see the pg-tests tier for rationale. | |
| matrix: | |
| include: | |
| - batch: integration-graphql | |
| packages: 'graphql/server-test graphql/server graphql/env pgpm/env' | |
| - batch: integration-uploads | |
| packages: 'uploads/s3-streamer packages/upload-client packages/bucket-provisioner graphile/graphile-settings graphile/graphile-presigned-url-plugin graphile/graphile-bucket-provisioner-plugin' | |
| env: | |
| PGHOST: localhost | |
| PGPORT: 5432 | |
| PGUSER: postgres | |
| PGPASSWORD: password | |
| CDN_ENDPOINT: http://localhost:9000 | |
| AWS_ACCESS_KEY: minioadmin | |
| AWS_SECRET_KEY: minioadmin | |
| AWS_REGION: us-east-1 | |
| # uploads/s3-streamer reads BUCKET_NAME; harmless for the others. | |
| BUCKET_NAME: test-bucket | |
| # Pin an explicit heap cap: on smaller runners Node's memory-derived | |
| # default can land near ~2GB and OOM Jest. | |
| NODE_OPTIONS: '--max-old-space-size=4096' | |
| services: | |
| pg_db: | |
| image: ghcr.io/constructive-io/docker/postgres-plus:18 | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: password | |
| options: >- | |
| --health-cmd "pg_isready -U postgres" | |
| --health-interval 3s | |
| --health-timeout 5s | |
| --health-retries 10 | |
| ports: | |
| - 5432:5432 | |
| minio_cdn: | |
| image: minio/minio:edge-cicd | |
| env: | |
| MINIO_ROOT_USER: minioadmin | |
| MINIO_ROOT_PASSWORD: minioadmin | |
| ports: | |
| - 9000:9000 | |
| - 9001:9001 | |
| options: >- | |
| --health-cmd "curl -f http://localhost:9000/minio/health/live || exit 1" | |
| --health-interval 3s | |
| --health-timeout 5s | |
| --health-retries 10 | |
| steps: | |
| - name: Download workspace | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: workspace-build | |
| - name: Extract workspace | |
| run: tar -xzf workspace.tar.gz && rm workspace.tar.gz | |
| - name: Configure Git (for tests) | |
| run: | | |
| git config --global user.name "CI Test User" | |
| git config --global user.email "ci@example.com" | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 10 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| # Durability is irrelevant for throwaway CI databases. Disabling fsync | |
| # and synchronous commit avoids checkpoint I/O stalls on CI runners. | |
| - name: Tune Postgres for CI (disable durability) | |
| run: pnpm --filter pgpm exec node dist/index.js tune --yes | |
| - name: Seed app_user | |
| run: | | |
| pnpm --filter pgpm exec node dist/index.js admin-users bootstrap --yes | |
| pnpm --filter pgpm exec node dist/index.js admin-users add --test --yes | |
| - name: Install pgpm fixture modules | |
| run: pnpm fixtures:install | |
| - name: Test ${{ matrix.batch }} | |
| run: | | |
| for pkg in ${{ matrix.packages }}; do | |
| echo "::group::Testing $pkg" | |
| (cd ./$pkg && pnpm test) | |
| echo "::endgroup::" | |
| done | |
| # ========================================================================= | |
| # TIER 4 – AI integration tests (PostgreSQL + Ollama) | |
| # ========================================================================= | |
| ai-tests: | |
| needs: build | |
| runs-on: blacksmith-2vcpu-ubuntu-2404 | |
| timeout-minutes: 15 | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - package: graphile/graphile-llm | |
| env: {} | |
| env: | |
| PGHOST: localhost | |
| PGPORT: 5432 | |
| PGUSER: postgres | |
| PGPASSWORD: password | |
| # Pin an explicit heap cap: on smaller runners Node's memory-derived | |
| # default can land near ~2GB and OOM Jest. | |
| NODE_OPTIONS: '--max-old-space-size=4096' | |
| services: | |
| pg_db: | |
| image: ghcr.io/constructive-io/docker/postgres-plus:18 | |
| env: | |
| POSTGRES_USER: postgres | |
| POSTGRES_PASSWORD: password | |
| options: >- | |
| --health-cmd "pg_isready -U postgres" | |
| --health-interval 3s | |
| --health-timeout 5s | |
| --health-retries 10 | |
| ports: | |
| - 5432:5432 | |
| steps: | |
| - name: Download workspace | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: workspace-build | |
| - name: Extract workspace | |
| run: tar -xzf workspace.tar.gz && rm workspace.tar.gz | |
| - name: Configure Git (for tests) | |
| run: | | |
| git config --global user.name "CI Test User" | |
| git config --global user.email "ci@example.com" | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 10 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| # Durability is irrelevant for throwaway CI databases. Disabling fsync | |
| # and synchronous commit avoids checkpoint I/O stalls on CI runners. | |
| - name: Tune Postgres for CI (disable durability) | |
| run: pnpm --filter pgpm exec node dist/index.js tune --yes | |
| - name: Seed app_user | |
| run: | | |
| pnpm --filter pgpm exec node dist/index.js admin-users bootstrap --yes | |
| pnpm --filter pgpm exec node dist/index.js admin-users add --test --yes | |
| - name: Install Ollama | |
| run: | | |
| curl -fsSL https://ollama.com/install.sh | sh | |
| ollama serve & | |
| sleep 3 | |
| ollama pull nomic-embed-text | |
| - name: Test ${{ matrix.package }} | |
| run: cd ./${{ matrix.package }} && pnpm test | |
| env: ${{ matrix.env }} |