3.0 KiB
Cache & CI/CD Integration
APOPHIS includes an incremental test cache that speeds up test runs by skipping unchanged routes. This document covers cache invalidation strategies and CI/CD integration.
How the Cache Works
The cache stores generated test commands per route in .apophis-cache.json:
{
"version": 1,
"entries": {
"a1b2c3d4": {
"routeHash": "a1b2c3d4",
"schemaHash": "e5f6g7h8",
"path": "/users",
"method": "GET",
"commands": [{ "params": {}, "headers": {} }],
"timestamp": 1704067200000
}
}
}
Each entry is keyed by a hash of the route's path, method, and schema. If the schema changes, the entry is automatically invalidated.
Environment Behavior
| Environment | Cache | Reason |
|---|---|---|
production |
Disabled | No file I/O, no cache hits needed |
test |
Disabled | Tests should be deterministic, no cache pollution |
development |
Enabled | Speeds up iterative testing |
| default | Enabled | Backward compatible |
Cache Invalidation
1. Automatic Invalidation
The cache is automatically invalidated when:
- A route's schema changes (detected via schema hash mismatch)
- The cache file is corrupted or has the wrong version
2. CI/CD Hints via Environment Variable
Set APOPHIS_CHANGED_ROUTES to invalidate specific routes on the next test run. The cache is checked during contract() and stateful() test runs:
# Exact path
APOPHIS_CHANGED_ROUTES=/users
# Multiple paths (comma-separated)
APOPHIS_CHANGED_ROUTES=/users,/items,/orders
# Method prefix
APOPHIS_CHANGED_ROUTES=GET /users,POST /orders
# Wildcards
APOPHIS_CHANGED_ROUTES=/api/*,/admin/**
Patterns support:
- Exact path:
/users - Method prefix:
GET /users - Single wildcard:
/api/*(matches one segment) - Double wildcard:
/api/**(matches any depth)
3. CI/CD Hints via File
Create .apophis-hints.json in your project root:
{
"changed": [
"/users",
"GET /items",
"/api/**"
]
}
This is useful when your CI system can write a file but setting env vars is awkward.
CI/CD Examples
GitHub Actions
See docs/examples/github-actions.yml for a complete workflow.
Key steps:
- Run tests with cache
- If tests fail, re-run without cache to rule out cache issues
- On main branch, clear cache after deployment
GitLab CI
See docs/examples/gitlab-ci.yml for a complete pipeline.
Best Practices
- Commit the cache file? No —
.apophis-cache.jsonshould be in.gitignore - Cache in CI? Yes — cache
.apophis-cache.jsonbetween runs for faster builds - Invalidate on deploy? Yes — set
APOPHIS_CHANGED_ROUTESfrom your deployment diff - Debug cache issues? Set
APOPHIS_LOG_LEVEL=debugto see cache hits/misses
Logging
Cache operations are logged at the info level:
[apophis] Invalidated 3 cached route(s) from CI/CD hints
Set APOPHIS_LOG_LEVEL=debug to see detailed cache operations.