Skip to content

docs: add PostgreSQL pool lifecycle architecture document #4453

docs: add PostgreSQL pool lifecycle architecture document

docs: add PostgreSQL pool lifecycle architecture document #4453

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
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
strategy:
fail-fast: false
matrix:
include:
- package: uploads/mime-bytes
env: {}
- package: uploads/uuid-hash
env: {}
- package: uploads/uuid-stream
env: {}
- package: uploads/etag-hash
env: {}
- package: uploads/etag-stream
env: {}
- package: uploads/stream-to-etag
env: {}
- package: uploads/content-type-stream
env: {}
- package: uploads/upload-names
env: {}
- package: packages/url-domains
env: {}
- package: packages/query-builder
env: {}
- package: packages/csrf
env: {}
- package: packages/oauth
env: {}
- package: packages/12factor-env
env: {}
- package: packages/orm
env: {}
- package: packages/postmaster
env: {}
- package: packages/smtppostmaster
env: {}
- package: packages/csv-to-pg
env: {}
- package: postgres/pgsql-client
env: {}
- package: postgres/pg-ast
env: {}
- package: graphql/query
env: {}
- package: graphql/codegen
env: {}
- package: packages/cli
env: {}
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.package }}
run: cd ./${{ matrix.package }} && pnpm test
env: ${{ matrix.env }}
# =========================================================================
# TIER 2 – PostgreSQL-only tests
# =========================================================================
pg-tests:
needs: build
runs-on: blacksmith-4vcpu-ubuntu-2404
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: 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
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 }}