Files
agent-skills/skills/turborepo/references/ci/patterns.md
Jason Woltje f5792c40be feat: Complete fleet — 94 skills across 10+ domains
Pulled ALL skills from 15 source repositories:
- anthropics/skills: 16 (docs, design, MCP, testing)
- obra/superpowers: 14 (TDD, debugging, agents, planning)
- coreyhaines31/marketingskills: 25 (marketing, CRO, SEO, growth)
- better-auth/skills: 5 (auth patterns)
- vercel-labs/agent-skills: 5 (React, design, Vercel)
- antfu/skills: 16 (Vue, Vite, Vitest, pnpm, Turborepo)
- Plus 13 individual skills from various repos

Mosaic Stack is not limited to coding — the Orchestrator and
subagents serve coding, business, design, marketing, writing,
logistics, analysis, and more.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 16:27:42 -06:00

2.5 KiB

CI Optimization Patterns

Strategies for efficient CI/CD with Turborepo.

PR vs Main Branch Builds

PR Builds: Only Affected

Test only what changed in the PR:

- name: Test (PR)
  if: github.event_name == 'pull_request'
  run: turbo run build test --affected

Main Branch: Full Build

Ensure complete validation on merge:

- name: Test (Main)
  if: github.ref == 'refs/heads/main'
  run: turbo run build test

Custom Git Ranges with --filter

For advanced scenarios, use --filter with git refs:

# Changes since specific commit
turbo run test --filter="...[abc123]"

# Changes between refs
turbo run test --filter="...[main...HEAD]"

# Changes in last 3 commits
turbo run test --filter="...[HEAD~3]"

Caching Strategies

Best performance - shared across all CI runs and developers:

env:
  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
  TURBO_TEAM: ${{ vars.TURBO_TEAM }}

actions/cache Fallback

When remote cache isn't available:

- uses: actions/cache@v4
  with:
    path: .turbo
    key: turbo-${{ runner.os }}-${{ github.sha }}
    restore-keys: |
      turbo-${{ runner.os }}-${{ github.ref }}-
      turbo-${{ runner.os }}-

Limitations:

  • Cache is branch-scoped
  • PRs restore from base branch cache
  • Less efficient than remote cache

Matrix Builds

Test across Node versions:

strategy:
  matrix:
    node: [18, 20, 22]

steps:
  - uses: actions/setup-node@v4
    with:
      node-version: ${{ matrix.node }}

  - run: turbo run test

Parallelizing Across Jobs

Split tasks into separate jobs:

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - run: turbo run lint --affected

  test:
    runs-on: ubuntu-latest
    steps:
      - run: turbo run test --affected

  build:
    runs-on: ubuntu-latest
    needs: [lint, test]
    steps:
      - run: turbo run build

Cache Considerations

When parallelizing:

  • Each job has separate cache writes
  • Remote cache handles this automatically
  • With actions/cache, use unique keys per job to avoid conflicts
- uses: actions/cache@v4
  with:
    path: .turbo
    key: turbo-${{ runner.os }}-${{ github.job }}-${{ github.sha }}

Conditional Tasks

Skip expensive tasks on draft PRs:

- name: E2E Tests
  if: github.event.pull_request.draft == false
  run: turbo run test:e2e --affected

Or require label for full test:

- name: Full Test Suite
  if: contains(github.event.pull_request.labels.*.name, 'full-test')
  run: turbo run test