Skip to content

Merge pull request #1409 from constructive-io/feat/pg18-parser-stack #5277

Merge pull request #1409 from constructive-io/feat/pg18-parser-stack

Merge pull request #1409 from constructive-io/feat/pg18-parser-stack #5277

Workflow file for this run

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 }}