CI Cache Optimizer
Expert in reducing CI/CD build times through dependency caching, Docker layer caching, and build pipeline optimization.
Activation Triggers
Activate on: "CI cache", "build speed", "dependency caching", "Docker layer cache", "turbo remote cache", "GitHub Actions cache", "pnpm store cache", "slow builds", "CI optimization"
NOT for: Pipeline creation → github-actions-pipeline-builder | Deployment strategy → blue-green-deployment-orchestrator | Docker builds → docker-multi-stage-optimizer
Quick Start
- Profile the build — measure time per step to find the bottleneck (usually dependency install or Docker builds)
- Cache dependencies — restore package manager cache (pnpm store, pip cache, Go module cache)
- Cache Docker layers — use BuildKit cache or GitHub Actions Docker cache
- Cache build outputs — Turborepo remote cache, Next.js build cache, compiled artifacts
- Parallelize — split test suites, build independent packages concurrently
Core Capabilities
| Domain |
Technologies |
| Dependency Cache |
pnpm store, npm cache, pip cache, Go module cache, Cargo registry |
| Docker Cache |
BuildKit inline cache, GitHub Actions gha cache, registry cache |
| Build Cache |
Turborepo remote cache, Nx Cloud, Gradle build cache, ccache |
| CI Platforms |
GitHub Actions, GitLab CI, CircleCI, Buildkite |
| Analysis |
GitHub Actions timing, CI Insights, custom duration metrics |
Architecture Patterns
GitHub Actions Dependency Cache (pnpm)
# .github/workflows/ci.yml
- uses: pnpm/action-setup@v4
with:
version: 9
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm' # Built-in pnpm cache support
# Turbo remote cache for monorepo build outputs
- name: Build
run: pnpm turbo build --cache-dir=.turbo
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
Docker Layer Cache Strategies
# Strategy 1: GitHub Actions cache backend (fastest for GHA)
- uses: docker/build-push-action@v6
with:
context: .
push: true
tags: myapp:latest
cache-from: type=gha
cache-to: type=gha,mode=max
# Strategy 2: Registry cache (works across CI providers)
- uses: docker/build-push-action@v6
with:
context: .
push: true
tags: registry.io/myapp:latest
cache-from: type=registry,ref=registry.io/myapp:cache
cache-to: type=registry,ref=registry.io/myapp:cache,mode=max
Cache Hierarchy (What to Cache, in Priority Order)
Priority 1 — Dependency install (biggest time save):
├─ pnpm store: ~/.local/share/pnpm/store
├─ pip cache: ~/.cache/pip
├─ Go modules: ~/go/pkg/mod
└─ Cargo registry: ~/.cargo/registry
Priority 2 — Build outputs (incremental builds):
├─ Turbo remote cache: .turbo/
├─ Next.js: .next/cache
├─ TypeScript: tsconfig.tsbuildinfo
└─ Webpack: node_modules/.cache
Priority 3 — Docker layers (image builds):
├─ BuildKit cache mounts
├─ Docker layer cache (gha or registry)
└─ Multi-stage build ordering
Priority 4 — Test artifacts (expensive to regenerate):
├─ Playwright browsers: ~/.cache/ms-playwright
├─ Cypress: ~/.cache/Cypress
└─ Snapshot baselines
Anti-Patterns
- Caching node_modules directly — fragile and large. Cache the pnpm/npm store instead; the install step uses the cached store and is near-instant.
- No cache key versioning — stale caches cause mysterious failures. Include lockfile hash in the cache key:
key: deps-${{ hashFiles('pnpm-lock.yaml') }}.
- Caching everything — caching small files that are fast to regenerate wastes time on cache download. Only cache what saves more time than the restore cost.
- Missing restore-keys fallback — if the exact cache key misses, the build starts cold. Use
restore-keys with prefix matching for partial cache hits.
- Not profiling first — adding caching without knowing the bottleneck. Measure step durations first; the slowest step gets caching priority.
Quality Checklist
[ ] CI build time profiled and bottleneck identified
[ ] Dependency cache uses lockfile hash as cache key
[ ] Fallback restore-keys configured for partial hits
[ ] Docker builds use BuildKit with cache-from/cache-to
[ ] Turbo/Nx remote cache enabled for monorepo builds
[ ] Test browser binaries cached (Playwright, Cypress)
[ ] Cache size monitored (GitHub Actions: 10GB limit)
[ ] Stale caches cleaned via retention or key rotation
[ ] Parallel jobs configured for independent packages
[ ] Build time target set (e.g., < 5 minutes for PR checks)
[ ] Cache hit rate tracked (> 80% target)
[ ] Before/after metrics documented for optimization efforts
1---2name: ci-cache-optimizer3description: CI/CD caching optimizer for dependency caching, Docker layer caching, and build speed improvements. Activate on: CI cache, build speed, dependency caching, Docker layer cache, turbo remote cache, GitHub Actions cache, pnpm store cache. NOT for: CI/CD pipeline creation (use github-actions-pipeline-builder), deployment strategy (use blue-green-deployment-orchestrator), Docker image building (use docker-multi-stage-optimizer).4license: Apache-2.05---6
7# CI Cache Optimizer
8
9Expert in reducing CI/CD build times through dependency caching, Docker layer caching, and build pipeline optimization.
10
11## Activation Triggers
12
13**Activate on:** "CI cache", "build speed", "dependency caching", "Docker layer cache", "turbo remote cache", "GitHub Actions cache", "pnpm store cache", "slow builds", "CI optimization"
14
15**NOT for:** Pipeline creation → `github-actions-pipeline-builder` | Deployment strategy → `blue-green-deployment-orchestrator` | Docker builds → `docker-multi-stage-optimizer`
16
17## Quick Start
18
191. **Profile the build** — measure time per step to find the bottleneck (usually dependency install or Docker builds)
202. **Cache dependencies** — restore package manager cache (pnpm store, pip cache, Go module cache)
213. **Cache Docker layers** — use BuildKit cache or GitHub Actions Docker cache
224. **Cache build outputs** — Turborepo remote cache, Next.js build cache, compiled artifacts
235. **Parallelize** — split test suites, build independent packages concurrently
24
25## Core Capabilities
26
27| Domain | Technologies |
28|--------|-------------|
29| **Dependency Cache** | pnpm store, npm cache, pip cache, Go module cache, Cargo registry |
30| **Docker Cache** | BuildKit inline cache, GitHub Actions gha cache, registry cache |
31| **Build Cache** | Turborepo remote cache, Nx Cloud, Gradle build cache, ccache |
32| **CI Platforms** | GitHub Actions, GitLab CI, CircleCI, Buildkite |
33| **Analysis** | GitHub Actions timing, CI Insights, custom duration metrics |
34
35## Architecture Patterns
36
37### GitHub Actions Dependency Cache (pnpm)
38
39```yaml
40# .github/workflows/ci.yml
41- uses: pnpm/action-setup@v4
42 with:
43 version: 9
44
45- uses: actions/setup-node@v4
46 with:
47 node-version: 22
48 cache: 'pnpm' # Built-in pnpm cache support
49
50# Turbo remote cache for monorepo build outputs
51- name: Build
52 run: pnpm turbo build --cache-dir=.turbo
53 env:
54 TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
55 TURBO_TEAM: ${{ vars.TURBO_TEAM }}
56```
57
58### Docker Layer Cache Strategies
59
60```yaml
61# Strategy 1: GitHub Actions cache backend (fastest for GHA)
62- uses: docker/build-push-action@v6
63 with:
64 context: .
65 push: true
66 tags: myapp:latest
67 cache-from: type=gha
68 cache-to: type=gha,mode=max
69
70# Strategy 2: Registry cache (works across CI providers)
71- uses: docker/build-push-action@v6
72 with:
73 context: .
74 push: true
75 tags: registry.io/myapp:latest
76 cache-from: type=registry,ref=registry.io/myapp:cache
77 cache-to: type=registry,ref=registry.io/myapp:cache,mode=max
78```
79
80### Cache Hierarchy (What to Cache, in Priority Order)
81
82```
83Priority 1 — Dependency install (biggest time save):
84 ├─ pnpm store: ~/.local/share/pnpm/store
85 ├─ pip cache: ~/.cache/pip
86 ├─ Go modules: ~/go/pkg/mod
87 └─ Cargo registry: ~/.cargo/registry
88
89Priority 2 — Build outputs (incremental builds):
90 ├─ Turbo remote cache: .turbo/
91 ├─ Next.js: .next/cache
92 ├─ TypeScript: tsconfig.tsbuildinfo
93 └─ Webpack: node_modules/.cache
94
95Priority 3 — Docker layers (image builds):
96 ├─ BuildKit cache mounts
97 ├─ Docker layer cache (gha or registry)
98 └─ Multi-stage build ordering
99
100Priority 4 — Test artifacts (expensive to regenerate):
101 ├─ Playwright browsers: ~/.cache/ms-playwright
102 ├─ Cypress: ~/.cache/Cypress
103 └─ Snapshot baselines
104```
105
106## Anti-Patterns
107
1081. **Caching node_modules directly** — fragile and large. Cache the pnpm/npm store instead; the install step uses the cached store and is near-instant.
1092. **No cache key versioning** — stale caches cause mysterious failures. Include lockfile hash in the cache key: `key: deps-${{ hashFiles('pnpm-lock.yaml') }}`.
1103. **Caching everything** — caching small files that are fast to regenerate wastes time on cache download. Only cache what saves more time than the restore cost.
1114. **Missing restore-keys fallback** — if the exact cache key misses, the build starts cold. Use `restore-keys` with prefix matching for partial cache hits.
1125. **Not profiling first** — adding caching without knowing the bottleneck. Measure step durations first; the slowest step gets caching priority.
113
114## Quality Checklist
115
116```
117[ ] CI build time profiled and bottleneck identified
118[ ] Dependency cache uses lockfile hash as cache key
119[ ] Fallback restore-keys configured for partial hits
120[ ] Docker builds use BuildKit with cache-from/cache-to
121[ ] Turbo/Nx remote cache enabled for monorepo builds
122[ ] Test browser binaries cached (Playwright, Cypress)
123[ ] Cache size monitored (GitHub Actions: 10GB limit)
124[ ] Stale caches cleaned via retention or key rotation
125[ ] Parallel jobs configured for independent packages
126[ ] Build time target set (e.g., < 5 minutes for PR checks)
127[ ] Cache hit rate tracked (> 80% target)
128[ ] Before/after metrics documented for optimization efforts
129```