This document describes the bulletproof release process that eliminates public CI failures through complete dry-run testing.
- ❌ Release gates always blow up publicly
- ❌ Complex 6-gate system fails unpredictably
- ❌ No way to test the exact release environment privately
- ❌ Red CI badges everywhere because everyone's CI breaks
We now have 3 ways to test releases privately before going public:
Run the exact same 6 gates locally:
# Make executable
chmod +x scripts/dry-run-release.sh
# Run complete local emulation
./scripts/dry-run-release.shPros: Instant feedback, no GitHub Actions minutes used Cons: Your local environment might differ slightly from GitHub Actions
Test in the exact same environment as the real release:
# Option A: Manual trigger
# Go to GitHub Actions → "Release Dry Run" → "Run workflow"
# Option B: Push to test branch
git checkout -b test-release-v1.7.2
git push origin test-release-v1.7.2Pros: 100% identical to real release environment Cons: Uses GitHub Actions minutes, takes 5-10 minutes
Only after dry runs pass:
git tag v1.7.2
git push origin v1.7.2All approaches test these 6 mandatory gates:
- Gate 1: Core Build (
cargo build --features huggingface) - Gate 2: CUDA Build (with CPU fallback if no CUDA Toolkit)
- Gate 3: Template Packaging (with
--allow-dirtyfor Cargo.lock) - Gate 4: Binary Size (20MB constitutional limit)
- Gate 5: Test Suite (
cargo test --all-features) - Gate 6: Documentation (
cargo doc --all-features)
# 1. Quick local check
./scripts/dry-run-release.sh
# 2. If local passes, test in exact GitHub environment
git checkout -b test-release-v1.7.2
git push origin test-release-v1.7.2
# 3. If GitHub dry run passes, create real release
git checkout main
git tag v1.7.2
git push origin v1.7.2
# 4. Clean up test branch
git push origin --delete test-release-v1.7.2
git branch -d test-release-v1.7.2- Locally: Install CUDA Toolkit or accept CPU-only fallback
- GitHub: Automatic fallback to CPU-only validation
- Check that
templates/docker/Dockerfileexists - Commit any outstanding changes
- The system handles Cargo.lock changes automatically
- Binary exceeded 20MB constitutional limit
- Review dependencies and features
- Consider excluding debug symbols
- Fix failing tests before release
- All tests must pass with
--all-features
- Fix documentation compilation errors
- Ensure all public APIs are documented
Only for critical security fixes:
# Create release workflow that skips specific gates
git tag v1.7.2-emergency(Requires modifying the release workflow)
scripts/dry-run-release.sh- Local complete emulation.github/workflows/release-dry-run.yml- Private GitHub testing.github/workflows/release.yml- Real release gatesRELEASE_PROCESS.md- This documentation
- Identical Commands: Dry runs use the exact same cargo commands as release
- Environment Parity: GitHub dry run uses same ubuntu-latest as release
- Systematic Issues Fixed: Cargo.lock and CUDA issues handled automatically
- Private Testing: No more public failures during development
- Confidence: Only release when you know it will work
- ✅ Zero public release failures
- ✅ Predictable release process
- ✅ Fast feedback loop
- ✅ Same gates, multiple testing environments
- ✅ Green CI badges
Remember: Always run dry tests before public releases. Your future self will thank you.