Skip to content

CI/CD

CI runs on GitLab CI with a multi-file include: layout:

.gitlab-ci.yml # orchestrator: stages, cache, defaults
.gitlab/ci/
prepare.yml
format.yml
lint.yml
typecheck-*.yml
test-*.yml
build-*.yml
deploy-*.yml
prepare → lint → typecheck → test → build

During the scaffold phase, deploy jobs are disabled in .gitlab-ci.yml. Job files under .gitlab/ci/deploy-*.yml are kept for later — uncomment the includes when Cloudflare CI variables are configured.

StageJobs
preparepnpm install --frozen-lockfile with pnpm store cache
lintpnpm format:check, pnpm lint:check
typecheckPer-app tsgo --noEmit / astro check for docs
testVitest smoke tests (web, api) + Playwright e2e
buildVite web build, Storybook static, Astro docs
deployDisabled until Cloudflare setup

All lint, typecheck, test, and build jobs should pass before merge.

GitLab cache keys on pnpm-lock.yaml. Store path: .pnpm-store/ inside the project directory.

Toptal GitLab shared runners are enabled for this repository. Jobs use node:24-alpine with corepack enable and the pinned pnpm version from packageManager. Use .nvmrc locally to match the CI Node version.

See Deployment for required Cloudflare CI variables.