variables: - &node_image 'node:22-alpine' - &enable_pnpm 'corepack enable' when: - event: [push, pull_request, manual] # Turbo remote cache (turbo.mosaicstack.dev) is configured via Woodpecker # repository-level environment variables (TURBO_API, TURBO_TEAM, TURBO_TOKEN). # This avoids from_secret which is blocked on pull_request events. # If the env vars aren't set, turbo falls back to local cache only. steps: install: image: *node_image commands: - corepack enable - apk add --no-cache python3 make g++ - pnpm install --frozen-lockfile typecheck: image: *node_image commands: - *enable_pnpm - pnpm typecheck depends_on: - install # lint, format, and test are independent — run in parallel after typecheck lint: image: *node_image commands: - *enable_pnpm - pnpm lint depends_on: - typecheck format: image: *node_image commands: - *enable_pnpm - pnpm format:check depends_on: - typecheck test: image: *node_image environment: # Avoid the namespace-level Woodpecker DB service named "postgres". # The Kubernetes backend exposes service containers by step name. DATABASE_URL: postgresql://mosaic:mosaic@ci-postgres:5432/mosaic commands: - *enable_pnpm # Install postgresql-client for pg_isready - apk add --no-cache postgresql-client # Wait up to 60s for CI postgres to be ready; fail fast if it never comes up. - | ready=0 for i in $(seq 1 60); do if pg_isready -h ci-postgres -p 5432 -U mosaic; then ready=1 break fi echo "Waiting for ci-postgres ($i/60)..." sleep 1 done if [ "$ready" -ne 1 ]; then echo "ci-postgres did not become ready" >&2 exit 1 fi # Run migrations (DATABASE_URL is set in environment above) - pnpm --filter @mosaicstack/db run db:migrate # Run all tests - pnpm test depends_on: - typecheck services: ci-postgres: image: pgvector/pgvector:pg17 environment: POSTGRES_USER: mosaic POSTGRES_PASSWORD: mosaic POSTGRES_DB: mosaic