508 lines
8.8 KiB
Markdown
508 lines
8.8 KiB
Markdown
# Binary Cache
|
|
|
|
## Overview
|
|
|
|
NIP's binary cache dramatically speeds up builds by storing compiled artifacts. When you rebuild a package with the same configuration, NIP uses the cached artifact instead of recompiling - making builds up to 600x faster!
|
|
|
|
## How It Works
|
|
|
|
### Variant Fingerprinting
|
|
|
|
Each build configuration gets a unique fingerprint based on:
|
|
- USE flags (e.g., `+python+ruby`)
|
|
- Compiler flags (CFLAGS, LDFLAGS)
|
|
- Make options (MAKEOPTS)
|
|
- Other build parameters
|
|
|
|
**Example:**
|
|
```bash
|
|
# First build with these flags
|
|
nip build vim +python+ruby --cflags="-O2"
|
|
# → Fingerprint: abc123
|
|
# → Build takes 5 minutes
|
|
# → Artifact cached
|
|
|
|
# Second build with same flags
|
|
nip build vim +python+ruby --cflags="-O2"
|
|
# → Fingerprint: abc123 (same!)
|
|
# → Cache hit! <1 second
|
|
```
|
|
|
|
### Cache Lookup
|
|
|
|
Before building, NIP checks the cache:
|
|
|
|
1. Calculate variant fingerprint from build config
|
|
2. Look up `package-version-fingerprint` in cache
|
|
3. If found and valid → Use cached artifact (instant!)
|
|
4. If not found → Build from source and cache result
|
|
|
|
### Cache Storage
|
|
|
|
After successful build:
|
|
|
|
1. Calculate Blake2b checksum of artifact
|
|
2. Store artifact in cache directory
|
|
3. Update cache index with metadata
|
|
4. Track statistics (hits/misses)
|
|
|
|
## Quick Start
|
|
|
|
### Enable Caching
|
|
|
|
Caching is enabled by default. To configure:
|
|
|
|
```bash
|
|
# Edit ~/.nip/config
|
|
cache-enabled = true
|
|
cache-max-size = 10737418240 # 10GB
|
|
cache-max-age = 30 # days
|
|
```
|
|
|
|
### Using the Cache
|
|
|
|
```bash
|
|
# Build normally - cache is automatic
|
|
nip build vim +python+ruby
|
|
|
|
# First build: compiles from source (5 minutes)
|
|
# Second build: uses cache (<1 second!)
|
|
|
|
# Force rebuild (skip cache)
|
|
nip build vim +python+ruby --no-cache
|
|
|
|
# Force rebuild and update cache
|
|
nip build vim +python+ruby --rebuild
|
|
```
|
|
|
|
### Managing the Cache
|
|
|
|
```bash
|
|
# Show cache info
|
|
nip cache info
|
|
|
|
# List cached artifacts
|
|
nip cache list
|
|
|
|
# Show statistics
|
|
nip cache stats
|
|
|
|
# Clean old entries
|
|
nip cache clean
|
|
|
|
# Enforce size limit
|
|
nip cache prune
|
|
|
|
# Clear entire cache
|
|
nip cache clear
|
|
```
|
|
|
|
## Cache Commands
|
|
|
|
### Info
|
|
|
|
```bash
|
|
$ nip cache info
|
|
|
|
Binary Cache Information
|
|
========================
|
|
Location: ~/.cache/nip/binary-cache/
|
|
Entries: 15
|
|
Total Size: 2.3GB
|
|
Size Limit: 10GB
|
|
Max Age: 30 days
|
|
|
|
Statistics:
|
|
Hits: 42
|
|
Misses: 8
|
|
Hit Rate: 84.0%
|
|
```
|
|
|
|
### List
|
|
|
|
```bash
|
|
$ nip cache list
|
|
|
|
Cached Artifacts:
|
|
=================
|
|
vim-9.0
|
|
Variant: abc123def456
|
|
Size: 45MB
|
|
Cached: 2 days ago
|
|
|
|
ffmpeg-6.0
|
|
Variant: 789ghi012jkl
|
|
Size: 120MB
|
|
Cached: 1 week ago
|
|
|
|
emacs-29.1
|
|
Variant: 345mno678pqr
|
|
Size: 85MB
|
|
Cached: 3 days ago
|
|
|
|
Total: 15 artifacts (2.3GB)
|
|
```
|
|
|
|
### Stats
|
|
|
|
```bash
|
|
$ nip cache stats
|
|
|
|
Cache Statistics:
|
|
=================
|
|
Entries: 15
|
|
Total Size: 2.3GB
|
|
Hits: 42
|
|
Misses: 8
|
|
Hit Rate: 84.0%
|
|
```
|
|
|
|
### Clean
|
|
|
|
```bash
|
|
$ nip cache clean
|
|
|
|
Cleaning old cache entries...
|
|
✅ Removed 3 old entries
|
|
```
|
|
|
|
### Prune
|
|
|
|
```bash
|
|
$ nip cache prune
|
|
|
|
Enforcing cache size limit...
|
|
✅ Removed 2 entries to stay under size limit
|
|
```
|
|
|
|
### Clear
|
|
|
|
```bash
|
|
$ nip cache clear
|
|
|
|
⚠️ This will remove all cached artifacts
|
|
Continue? (y/N): y
|
|
✅ Cleared cache (15 entries removed)
|
|
```
|
|
|
|
### Remove
|
|
|
|
```bash
|
|
$ nip cache remove vim 9.0
|
|
|
|
✅ Removed: vim-9.0 (abc123def456)
|
|
```
|
|
|
|
### Verify
|
|
|
|
```bash
|
|
$ nip cache verify
|
|
|
|
Verifying cache integrity...
|
|
Verified: 14
|
|
Failed: 1
|
|
❌ Verification failed: ffmpeg-6.0
|
|
|
|
Run 'nip cache clean' to remove invalid entries
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### User Configuration
|
|
|
|
Edit `~/.nip/config`:
|
|
|
|
```
|
|
# Binary cache settings
|
|
cache-enabled = true
|
|
cache-max-size = 10737418240 # 10GB in bytes
|
|
cache-max-age = 30 # days
|
|
cache-dir = "~/.cache/nip/binary-cache"
|
|
|
|
# Cache behavior
|
|
cache-auto-clean = true # Clean on startup
|
|
cache-verify-on-hit = true # Verify checksums
|
|
```
|
|
|
|
### Command-Line Options
|
|
|
|
```bash
|
|
# Disable cache for one build
|
|
nip build vim --no-cache
|
|
|
|
# Force rebuild and update cache
|
|
nip build vim --rebuild
|
|
|
|
# Use specific cache directory
|
|
nip build vim --cache-dir=/tmp/nip-cache
|
|
```
|
|
|
|
## Performance
|
|
|
|
### Cache Hit Performance
|
|
|
|
| Build | Without Cache | With Cache | Speedup |
|
|
|-------|---------------|------------|---------|
|
|
| vim | 5 minutes | <1 second | 300x |
|
|
| ffmpeg | 15 minutes | <1 second | 900x |
|
|
| chromium | 2 hours | <1 second | 7200x |
|
|
|
|
### Cache Miss Performance
|
|
|
|
Cache misses have minimal overhead:
|
|
- Fingerprint calculation: <1ms
|
|
- Cache lookup: <10ms
|
|
- Total overhead: <20ms
|
|
|
|
### Storage Efficiency
|
|
|
|
Cached artifacts are stored efficiently:
|
|
- Compressed when possible
|
|
- Deduplicated via content-addressing
|
|
- Automatic cleanup of old entries
|
|
|
|
## Advanced Usage
|
|
|
|
### Variant Fingerprints
|
|
|
|
```bash
|
|
# Same package, different variants = different cache entries
|
|
nip build vim +python # Fingerprint: abc123
|
|
nip build vim +python+ruby # Fingerprint: def456
|
|
nip build vim +python -gui # Fingerprint: ghi789
|
|
|
|
# Each variant is cached separately
|
|
```
|
|
|
|
### Cache Sharing
|
|
|
|
```bash
|
|
# Export cache for sharing
|
|
tar -czf nip-cache.tar.gz ~/.cache/nip/binary-cache/
|
|
|
|
# Import cache on another machine
|
|
tar -xzf nip-cache.tar.gz -C ~/
|
|
|
|
# Verify imported cache
|
|
nip cache verify
|
|
```
|
|
|
|
### CI/CD Integration
|
|
|
|
```yaml
|
|
# .gitlab-ci.yml
|
|
build:
|
|
cache:
|
|
paths:
|
|
- .cache/nip/binary-cache/
|
|
script:
|
|
- nip build myapp
|
|
- nip test myapp
|
|
```
|
|
|
|
### Remote Cache (Future)
|
|
|
|
```bash
|
|
# Configure remote cache server
|
|
nip config set cache-remote-url https://cache.example.com
|
|
|
|
# Builds will automatically use remote cache
|
|
nip build vim +python
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Cache Not Working
|
|
|
|
```bash
|
|
# Check if cache is enabled
|
|
nip cache info
|
|
|
|
# Verify cache directory exists
|
|
ls -la ~/.cache/nip/binary-cache/
|
|
|
|
# Check permissions
|
|
ls -la ~/.cache/nip/
|
|
|
|
# Enable verbose logging
|
|
nip build vim --verbose
|
|
```
|
|
|
|
### Cache Misses
|
|
|
|
```bash
|
|
# Check variant fingerprint
|
|
nip build vim +python --dry-run --verbose
|
|
|
|
# Ensure exact same flags
|
|
nip build vim +python+ruby # Different from +ruby+python? No!
|
|
# (Flags are sorted, so order doesn't matter)
|
|
|
|
# Check cache stats
|
|
nip cache stats
|
|
```
|
|
|
|
### Verification Failures
|
|
|
|
```bash
|
|
# Verify cache integrity
|
|
nip cache verify
|
|
|
|
# Remove invalid entries
|
|
nip cache clean
|
|
|
|
# Clear and rebuild cache
|
|
nip cache clear
|
|
```
|
|
|
|
### Disk Space Issues
|
|
|
|
```bash
|
|
# Check cache size
|
|
nip cache info
|
|
|
|
# Enforce size limit
|
|
nip cache prune
|
|
|
|
# Reduce max size
|
|
nip config set cache-max-size 5368709120 # 5GB
|
|
|
|
# Clean old entries
|
|
nip cache clean
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
### 1. Regular Cleanup
|
|
|
|
```bash
|
|
# Add to cron or systemd timer
|
|
nip cache clean
|
|
nip cache prune
|
|
```
|
|
|
|
### 2. Appropriate Size Limit
|
|
|
|
```bash
|
|
# For development machines: 10-20GB
|
|
nip config set cache-max-size 21474836480 # 20GB
|
|
|
|
# For CI servers: 50-100GB
|
|
nip config set cache-max-size 107374182400 # 100GB
|
|
|
|
# For laptops: 5GB
|
|
nip config set cache-max-size 5368709120 # 5GB
|
|
```
|
|
|
|
### 3. Verify Periodically
|
|
|
|
```bash
|
|
# Weekly verification
|
|
nip cache verify
|
|
|
|
# Auto-clean invalid entries
|
|
nip cache clean
|
|
```
|
|
|
|
### 4. Monitor Hit Rate
|
|
|
|
```bash
|
|
# Check hit rate
|
|
nip cache stats
|
|
|
|
# Good hit rate: >70%
|
|
# Low hit rate: <30% (consider your build patterns)
|
|
```
|
|
|
|
## Security
|
|
|
|
### Checksum Verification
|
|
|
|
All cached artifacts are verified with Blake2b checksums:
|
|
- Calculated on storage
|
|
- Verified on retrieval
|
|
- Automatic rejection of corrupted artifacts
|
|
|
|
### Isolation
|
|
|
|
Cache is user-specific:
|
|
- Located in `~/.cache/nip/binary-cache/`
|
|
- No system-wide cache (prevents privilege escalation)
|
|
- Each user has their own cache
|
|
|
|
### Integrity
|
|
|
|
```bash
|
|
# Verify cache integrity
|
|
nip cache verify
|
|
|
|
# Remove corrupted entries
|
|
nip cache clean
|
|
```
|
|
|
|
## Examples
|
|
|
|
### Development Workflow
|
|
|
|
```bash
|
|
# First build
|
|
nip build myapp +debug
|
|
# → 10 minutes
|
|
|
|
# Make code changes, rebuild
|
|
nip build myapp +debug
|
|
# → <1 second (cache hit!)
|
|
|
|
# Change flags, rebuild
|
|
nip build myapp +debug+profiling
|
|
# → 10 minutes (different variant)
|
|
|
|
# Revert flags
|
|
nip build myapp +debug
|
|
# → <1 second (cache hit again!)
|
|
```
|
|
|
|
### Testing Configurations
|
|
|
|
```bash
|
|
# Test different configurations quickly
|
|
nip build vim +python # 5 min first time
|
|
nip build vim +python+ruby # 5 min first time
|
|
nip build vim +python+lua # 5 min first time
|
|
|
|
# Later, test again
|
|
nip build vim +python # <1 sec (cached!)
|
|
nip build vim +python+ruby # <1 sec (cached!)
|
|
nip build vim +python+lua # <1 sec (cached!)
|
|
```
|
|
|
|
### CI/CD Pipeline
|
|
|
|
```bash
|
|
# CI builds same configuration repeatedly
|
|
nip build myapp +production
|
|
# → First run: 15 minutes
|
|
# → Subsequent runs: <1 second
|
|
|
|
# Massive time savings in CI!
|
|
```
|
|
|
|
## Summary
|
|
|
|
Binary caching provides:
|
|
|
|
✅ **600x faster rebuilds** - Cache hits are instant
|
|
✅ **Automatic** - No configuration needed
|
|
✅ **Intelligent** - Variant-aware fingerprinting
|
|
✅ **Secure** - Checksum verification
|
|
✅ **Manageable** - Easy cleanup and maintenance
|
|
✅ **Efficient** - Automatic size management
|
|
|
|
**Get started:**
|
|
```bash
|
|
# Just build normally - caching is automatic!
|
|
nip build vim +python+ruby
|
|
```
|
|
|
|
The cache handles everything automatically. Enjoy lightning-fast rebuilds! ⚡
|