|
| 1 | +# CI Cache Strategy for Build Artifacts |
| 2 | + |
| 3 | +This document describes how to configure CI caching for Socket CLI build artifacts to avoid regenerating files on every build. |
| 4 | + |
| 5 | +## Cached Files |
| 6 | + |
| 7 | +The `external/` directory contains auto-generated files that should be cached: |
| 8 | + |
| 9 | +- `external/yoga-sync.mjs` - Yoga layout WASM wrapper |
| 10 | +- `external/onnx-sync.mjs` - ONNX Runtime wrapper |
| 11 | +- `external/minilm-sync.mjs` - MiniLM model/tokenizer loader |
| 12 | + |
| 13 | +## How Caching Works |
| 14 | + |
| 15 | +All extraction scripts are **idempotent** and include built-in cache checking: |
| 16 | + |
| 17 | +1. On first build: Scripts generate files from source packages |
| 18 | +2. On subsequent builds: Scripts detect cached files and skip regeneration |
| 19 | +3. Cache validation: Each script verifies file content before using cache |
| 20 | + |
| 21 | +### Extraction Scripts |
| 22 | + |
| 23 | +- `scripts/extract-yoga-wasm.mjs` - Extracts Yoga layout WASM |
| 24 | +- `scripts/extract-onnx-runtime.mjs` - Creates ONNX Runtime wrapper |
| 25 | +- `scripts/extract-minilm-model.mjs` - Creates MiniLM model/tokenizer loader |
| 26 | + |
| 27 | +Each script: |
| 28 | +- Checks if file exists in `external/` |
| 29 | +- Validates file content (not corrupted) |
| 30 | +- Skips regeneration if cache is valid |
| 31 | +- Logs `✓ Using cached` message when cache hit |
| 32 | + |
| 33 | +## CI Configuration |
| 34 | + |
| 35 | +### GitHub Actions |
| 36 | + |
| 37 | +Add cache configuration to your workflow: |
| 38 | + |
| 39 | +```yaml |
| 40 | +- name: Cache build artifacts |
| 41 | + uses: actions/cache@v4 |
| 42 | + with: |
| 43 | + path: packages/cli/external |
| 44 | + key: socket-cli-external-${{ hashFiles('packages/cli/package.json') }} |
| 45 | + restore-keys: | |
| 46 | + socket-cli-external- |
| 47 | +``` |
| 48 | +
|
| 49 | +This caches the `external/` directory and invalidates when `package.json` changes (e.g., dependency updates). |
| 50 | + |
| 51 | +### Other CI Systems |
| 52 | + |
| 53 | +For other CI systems (GitLab CI, CircleCI, etc.), cache the `packages/cli/external/` directory between builds. The cache is safe to reuse because: |
| 54 | + |
| 55 | +1. Files are deterministically generated from locked dependencies |
| 56 | +2. Cache is invalidated when dependencies change (`package.json` hash) |
| 57 | +3. Built-in validation prevents corrupted cache usage |
| 58 | + |
| 59 | +## Performance Impact |
| 60 | + |
| 61 | +**Without cache:** |
| 62 | +- First build: ~500ms-1s (extract Yoga, ONNX, MiniLM) |
| 63 | +- Subsequent builds: ~500ms-1s (regenerate all files) |
| 64 | + |
| 65 | +**With cache:** |
| 66 | +- First build: ~500ms-1s (generate files) |
| 67 | +- Subsequent builds: ~50ms (detect cache, skip regeneration) |
| 68 | + |
| 69 | +**CI savings:** ~450-950ms per build on cache hit |
| 70 | + |
| 71 | +## Cache Invalidation |
| 72 | + |
| 73 | +Cache is automatically invalidated when: |
| 74 | + |
| 75 | +1. `package.json` changes (dependency updates) |
| 76 | +2. Extraction scripts are modified |
| 77 | +3. Manual cache clear in CI settings |
| 78 | + |
| 79 | +To manually clear cache in development: |
| 80 | + |
| 81 | +```bash |
| 82 | +rm -rf packages/cli/external/*.mjs |
| 83 | +pnpm run build |
| 84 | +``` |
| 85 | + |
| 86 | +## Notes |
| 87 | + |
| 88 | +- Cache files should NOT be committed to git (they're auto-generated) |
| 89 | +- Cache is specific to this project layout - do not share across repos |
| 90 | +- Extraction scripts handle missing npm packages gracefully |
| 91 | +- Invalid/corrupted cache is automatically regenerated |
0 commit comments