Zeno

CI/CD Pipelines

Continuous integration and deployment pipelines

Zeno includes a comprehensive CI pipeline that runs on every push and pull request.

CI Pipeline

The CI pipeline runs these steps in order:

  1. Lint — Code quality checks with Ultracite
  2. Type Check — TypeScript validation
  3. Build — Build all packages
  4. Unit Tests — Run Vitest tests
  5. E2E Tests — Run Playwright tests

It can be run locally with:

pnpm ci

Or force a rebuild without caches with:

pnpm ci:force

Or generate a dependency graph in turbo-graph.html with:

pnpm ci:graph

It is defined in package.json:

package.json
{
  "scripts": {
    "ci": "pnpm run lint && turbo run types:check build test e2e",
    "ci:force": "turbo run types:check build test e2e --force",
    "ci:graph": "turbo run types:check build test e2e --graph=turbo-graph.html",
  }
}

Turborepo Tasks

The pipeline order and dependencies are defined in turbo.json.

GitHub Actions

Zeno includes a GitHub Actions workflow for CI/CD. It can be found in .github/workflows/turbo.yml.

Caching

Turborepo caches task outputs for faster builds:

  • Local cache in .turbo/
  • Remote cache available with Vercel

Enable remote caching locally with:

npx turbo login
npx turbo link

Enable remote caching within Github Actions by editing and uncommenting the following lines in .github/workflows/turbo.yml:

.github/workflows/turbo.yml
  env:
    TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
    TURBO_TEAM: ${{ vars.TURBO_TEAM }}
    TURBO_CACHE: remote:rw

E2E in CI

Playwright tests in CI have special settings:

  • HTML reporter for artifacts
  • 3 retries on failure
  • 30-second timeout (120s locally)
  • Trace collection on first retry for debugging
packages/e2e/playwright.config.ts
{
  forbidOnly: !!process.env.CI,
  retries: process.env.CI ? 3 : 0,
  reporter: process.env.CI ? "html" : "list",
  timeout: process.env.CI ? 30_000 : 120_000,
}