Files
plunk/.github/workflows/ci.yml
T

210 lines
6.2 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: CI
on:
push:
branches:
- next
pull_request:
branches:
- next
jobs:
test:
name: Test Suite
runs-on: ubuntu-latest
# Service containers for database, Redis, and Minio
services:
postgres:
image: postgres:16-alpine
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: plunk_test
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
redis:
image: redis:7-alpine
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 6379:6379
minio:
image: minio/minio:edge-cicd
env:
MINIO_ROOT_USER: plunk
MINIO_ROOT_PASSWORD: plunkminiopass
ports:
- 9000:9000
options: >-
--health-cmd "curl -f http://localhost:9000/minio/health/live || exit 1"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Tune Postgres for ephemeral CI workload
env:
PGPASSWORD: postgres
run: |
# synchronous_commit=off is the biggest single I/O win and is safe to lose
# data on crash for a throwaway CI database.
# synchronous_commit is dynamic — applies on reload. max_connections would
# require a restart, so we leave it at the default of 100 and cap workers
# at 4 × connection_limit=20 = 80 to stay under that budget.
psql -h localhost -U postgres -d plunk_test -c "ALTER SYSTEM SET synchronous_commit = 'off';"
psql -h localhost -U postgres -d plunk_test -c "SELECT pg_reload_conf();"
- name: Setup environment variables
run: |
cat > .env << EOF
NODE_ENV=test
# Database
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/plunk_test
DIRECT_DATABASE_URL=postgresql://postgres:postgres@localhost:5432/plunk_test
# Redis
REDIS_URL=redis://localhost:6379
# Security
JWT_SECRET=test-jwt-secret-for-ci-only
# S3 (Minio)
S3_ENDPOINT=http://localhost:9000
S3_ACCESS_KEY_ID=plunk
S3_ACCESS_KEY_SECRET=plunkminiopass
S3_BUCKET=uploads
S3_PUBLIC_URL=http://localhost:9000/uploads
S3_FORCE_PATH_STYLE=true
# Application URLs (not needed for tests but required by schema)
API_URI=http://localhost:8080
DASHBOARD_URI=http://localhost:3000
LANDING_URI=http://localhost:4000
WIKI_URI=http://localhost:1000
# AWS SES (mock values for tests)
AWS_SES_REGION=us-east-1
AWS_SES_ACCESS_KEY_ID=mock
AWS_SES_SECRET_ACCESS_KEY=mock
SES_CONFIGURATION_SET=test
SES_CONFIGURATION_SET_NO_TRACKING=test-no-tracking
EOF
- name: Build shared packages
run: yarn build --filter="@plunk/db" --filter="@plunk/types" --filter="@plunk/shared"
- name: Generate Prisma Client
run: yarn workspace @plunk/db db:generate
env:
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/plunk_test
DIRECT_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/plunk_test
- name: Run database migrations
run: yarn workspace @plunk/db migrate:prod
env:
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/plunk_test
DIRECT_DATABASE_URL: postgresql://postgres:postgres@localhost:5432/plunk_test
- name: Create MinIO bucket
run: |
docker run --rm --network host \
--entrypoint /bin/sh minio/mc:latest \
-c "mc alias set local http://localhost:9000 plunk plunkminiopass && \
mc mb local/uploads --ignore-existing"
- name: Run tests
run: yarn test:run
env:
NODE_ENV: test
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: |
coverage/
**/*.test.ts.log
retention-days: 7
lint:
name: Lint & Type Check
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'yarn'
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Setup minimal env (for build)
run: |
cat > .env << EOF
NODE_ENV=development
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/plunk
DIRECT_DATABASE_URL=postgresql://postgres:postgres@localhost:5432/plunk
REDIS_URL=redis://localhost:6379
JWT_SECRET=test
# S3 (minimal - not needed but schema may require)
S3_ENDPOINT=http://localhost:9000
S3_ACCESS_KEY_ID=mock
S3_ACCESS_KEY_SECRET=mock
S3_BUCKET=uploads
S3_PUBLIC_URL=http://localhost:9000/uploads
S3_FORCE_PATH_STYLE=true
# Application URLs
API_URI=http://localhost:8080
DASHBOARD_URI=http://localhost:3000
LANDING_URI=http://localhost:4000
WIKI_URI=http://localhost:1000
# AWS SES (mock)
AWS_SES_REGION=us-east-1
AWS_SES_ACCESS_KEY_ID=mock
AWS_SES_SECRET_ACCESS_KEY=mock
SES_CONFIGURATION_SET=test
SES_CONFIGURATION_SET_NO_TRACKING=test
EOF
- name: Build shared packages
run: yarn build --filter="@plunk/db" --filter="@plunk/types" --filter="@plunk/shared"
- name: Run linter
run: yarn lint
- name: Type check
run: yarn build --filter="api" --filter="web" --filter="landing" --filter="wiki" || true