Skip to content

Merge pull request #1155 from constructive-io/schema-update/20260513-… #4543

Merge pull request #1155 from constructive-io/schema-update/20260513-…

Merge pull request #1155 from constructive-io/schema-update/20260513-… #4543

Workflow file for this run

name: CI tests
on:
push:
branches:
- main
- v1
pull_request:
branches:
- main
- v1
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
# ---------------------------------------------------------------------------
jobs:
# =========================================================================
# BUILD (single job – runs once, shared by all test jobs)
# =========================================================================
build:
runs-on: blacksmith-4vcpu-ubuntu-2404
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: blacksmith-2vcpu-ubuntu-2404
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 packages/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'
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-4vcpu-ubuntu-2404
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
include:
- package: pgpm/core
env: {}
- package: pgpm/cli
env: {}
- package: packages/client
env:
TEST_DATABASE_URL: postgres://postgres:password@localhost:5432/postgres
- package: packages/safegres
env: {}
- package: postgres/pg-codegen
env: {}
- package: postgres/pgsql-test
env: {}
- package: postgres/drizzle-orm-test
env: {}
- package: postgres/introspectron
env: {}
- package: graphile/graphile-test
env: {}
- package: graphile/graphile-connection-filter
env: {}
- package: graphile/graphile-postgis
env: {}
- package: graphile/graphile-search
env: {}
- package: graphile/graphile-ltree
env: {}
- package: graphile/graphile-bulk-mutations
env: {}
- package: graphql/orm-test
env: {}
- package: graphql/test
env: {}
- package: graphql/playwright-test
env: {}
- package: jobs/knative-job-service
env: {}
env:
PGHOST: localhost
PGPORT: 5432
PGUSER: postgres
PGPASSWORD: password
services:
pg_db:
image: ghcr.io/constructive-io/docker/postgres-plus:18
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
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
- 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: Test ${{ matrix.package }}
run: cd ./${{ matrix.package }} && pnpm test
env: ${{ matrix.env }}
# =========================================================================
# TIER 3 – Integration tests (PostgreSQL + MinIO)
# =========================================================================
integration-tests:
needs: build
runs-on: blacksmith-4vcpu-ubuntu-2404
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
include:
- package: pgpm/env
env: {}
- package: uploads/s3-streamer
env:
BUCKET_NAME: test-bucket
- package: packages/upload-client
env: {}
- package: packages/bucket-provisioner
env: {}
- package: graphile/graphile-settings
env: {}
- package: graphile/graphile-presigned-url-plugin
env: {}
- package: graphile/graphile-bucket-provisioner-plugin
env: {}
- package: graphql/server-test
env: {}
- package: graphql/env
env: {}
- package: graphql/server
env: {}
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
services:
pg_db:
image: ghcr.io/constructive-io/docker/postgres-plus:18
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
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 10s
--health-timeout 5s
--health-retries 5
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
- 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: Test ${{ matrix.package }}
run: cd ./${{ matrix.package }} && pnpm test
env: ${{ matrix.env }}