336 lines
7.4 KiB
Markdown
336 lines
7.4 KiB
Markdown
# Pre-Push Checklist
|
|
|
|
This checklist ensures your changes are ready for CI and won't break the build. Follow this before every `git push`.
|
|
|
|
**Time Budget**: ~2 minutes
|
|
**Success Rate**: Catches 90% of CI failures
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
# Unix/macOS
|
|
./scripts/pre-push-test.sh
|
|
|
|
# Windows PowerShell
|
|
.\scripts\pre-push-test.ps1
|
|
```
|
|
|
|
If all checks pass, you're good to push!
|
|
|
|
---
|
|
|
|
## Detailed Checklist
|
|
|
|
### ☐ Level 0: Static Analysis (< 1 second)
|
|
|
|
#### Code Formatting
|
|
```bash
|
|
cmake --build build --target yaze-format-check
|
|
```
|
|
|
|
**If it fails**:
|
|
```bash
|
|
# Auto-format your code
|
|
cmake --build build --target yaze-format
|
|
|
|
# Verify it passes now
|
|
cmake --build build --target yaze-format-check
|
|
```
|
|
|
|
**What it catches**: Formatting violations, inconsistent style
|
|
|
|
---
|
|
|
|
### ☐ Level 1: Configuration Validation (< 10 seconds)
|
|
|
|
#### CMake Configuration
|
|
```bash
|
|
# Test your preset
|
|
cmake --preset mac-dbg # or lin-dbg, win-dbg
|
|
```
|
|
|
|
**If it fails**:
|
|
- Check `CMakeLists.txt` syntax
|
|
- Verify all required dependencies are available
|
|
- Check `CMakePresets.json` for typos
|
|
|
|
**What it catches**: CMake syntax errors, missing dependencies, invalid presets
|
|
|
|
---
|
|
|
|
### ☐ Level 2: Smoke Compilation (< 2 minutes)
|
|
|
|
#### Quick Compilation Test
|
|
```bash
|
|
./scripts/pre-push-test.sh --smoke-only
|
|
```
|
|
|
|
**What it compiles**:
|
|
- `src/app/rom.cc` (core ROM handling)
|
|
- `src/app/gfx/bitmap.cc` (graphics system)
|
|
- `src/zelda3/overworld/overworld.cc` (game logic)
|
|
- `src/cli/service/resources/resource_catalog.cc` (CLI)
|
|
|
|
**If it fails**:
|
|
- Check for missing `#include` directives
|
|
- Verify header paths are correct
|
|
- Check for platform-specific compilation issues
|
|
- Run full build to see all errors: `cmake --build build -v`
|
|
|
|
**What it catches**: Missing headers, include path issues, preprocessor errors
|
|
|
|
---
|
|
|
|
### ☐ Level 3: Symbol Validation (< 30 seconds)
|
|
|
|
#### Symbol Conflict Detection
|
|
```bash
|
|
./scripts/verify-symbols.sh
|
|
```
|
|
|
|
**If it fails**:
|
|
Look for these common issues:
|
|
|
|
1. **FLAGS symbol conflicts**:
|
|
```
|
|
✗ FLAGS symbol conflict: FLAGS_verbose
|
|
→ libyaze_cli.a
|
|
→ libyaze_app.a
|
|
```
|
|
**Fix**: Define `FLAGS_*` in exactly one `.cc` file, not in headers
|
|
|
|
2. **Duplicate function definitions**:
|
|
```
|
|
⚠ Duplicate symbol: MyClass::MyFunction()
|
|
→ libyaze_foo.a
|
|
→ libyaze_bar.a
|
|
```
|
|
**Fix**: Use `inline` for header-defined functions or move to `.cc` file
|
|
|
|
3. **Template instantiation conflicts**:
|
|
```
|
|
⚠ Duplicate symbol: std::vector<MyType>::resize()
|
|
→ libyaze_foo.a
|
|
→ libyaze_bar.a
|
|
```
|
|
**Fix**: This is usually safe (templates), but if it causes link errors, use explicit instantiation
|
|
|
|
**What it catches**: ODR violations, duplicate symbols, FLAGS conflicts
|
|
|
|
---
|
|
|
|
### ☐ Level 4: Unit Tests (< 30 seconds)
|
|
|
|
#### Run Unit Tests
|
|
```bash
|
|
./build/bin/yaze_test --unit
|
|
```
|
|
|
|
**If it fails**:
|
|
1. Read the failure message carefully
|
|
2. Run the specific failing test:
|
|
```bash
|
|
./build/bin/yaze_test "TestSuite.TestName"
|
|
```
|
|
3. Debug with verbose output:
|
|
```bash
|
|
./build/bin/yaze_test --verbose "TestSuite.TestName"
|
|
```
|
|
4. Fix the issue in your code
|
|
5. Re-run tests
|
|
|
|
**Common issues**:
|
|
- Logic errors in new code
|
|
- Breaking changes to existing APIs
|
|
- Missing test updates after refactoring
|
|
- Platform-specific test failures
|
|
|
|
**What it catches**: Logic errors, API breakage, regressions
|
|
|
|
---
|
|
|
|
## Platform-Specific Checks
|
|
|
|
### macOS Developers
|
|
|
|
**Additional checks**:
|
|
```bash
|
|
# Test Linux-style strict linking (if Docker available)
|
|
docker run --rm -v $(pwd):/workspace yaze-linux-builder \
|
|
./scripts/pre-push-test.sh
|
|
```
|
|
|
|
**Why**: Linux linker is stricter about ODR violations
|
|
|
|
### Linux Developers
|
|
|
|
**Additional checks**:
|
|
```bash
|
|
# Run with verbose warnings
|
|
cmake --preset lin-dbg-v
|
|
cmake --build build -v
|
|
```
|
|
|
|
**Why**: Catches more warnings that might fail on other platforms
|
|
|
|
### Windows Developers
|
|
|
|
**Additional checks**:
|
|
```powershell
|
|
# Test with clang-cl explicitly
|
|
cmake --preset win-dbg -DCMAKE_CXX_COMPILER=clang-cl
|
|
cmake --build build
|
|
```
|
|
|
|
**Why**: Ensures compatibility with CI's clang-cl configuration
|
|
|
|
---
|
|
|
|
## Optional Checks (Recommended)
|
|
|
|
### Integration Tests (2-5 minutes)
|
|
```bash
|
|
./build/bin/yaze_test --integration
|
|
```
|
|
|
|
**When to run**: Before pushing major changes
|
|
|
|
### E2E Tests (5-10 minutes)
|
|
```bash
|
|
./build/bin/yaze_test --e2e
|
|
```
|
|
|
|
**When to run**: Before pushing UI changes
|
|
|
|
### Memory Sanitizer (10-20 minutes)
|
|
```bash
|
|
cmake --preset sanitizer
|
|
cmake --build build
|
|
./build/bin/yaze_test
|
|
```
|
|
|
|
**When to run**: Before pushing memory-related changes
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### "I don't have time for all this!"
|
|
|
|
**Minimum checks** (< 1 minute):
|
|
```bash
|
|
# Just format and unit tests
|
|
cmake --build build --target yaze-format-check && \
|
|
./build/bin/yaze_test --unit
|
|
```
|
|
|
|
### "Tests pass locally but fail in CI"
|
|
|
|
**Common causes**:
|
|
1. **Platform-specific**: Your change works on macOS but breaks Linux/Windows
|
|
- **Solution**: Test with matching CI preset (`ci-linux`, `ci-macos`, `ci-windows`)
|
|
|
|
2. **Symbol conflicts**: Local linker is more permissive than CI
|
|
- **Solution**: Run `./scripts/verify-symbols.sh`
|
|
|
|
3. **Include paths**: Your IDE finds headers that CI doesn't
|
|
- **Solution**: Run smoke compilation test
|
|
|
|
4. **Cached build**: Your local build has stale artifacts
|
|
- **Solution**: Clean rebuild: `rm -rf build && cmake --preset <preset> && cmake --build build`
|
|
|
|
### "Pre-push script is too slow"
|
|
|
|
**Speed it up**:
|
|
```bash
|
|
# Skip symbol checking (30s saved)
|
|
./scripts/pre-push-test.sh --skip-symbols
|
|
|
|
# Skip tests (30s saved)
|
|
./scripts/pre-push-test.sh --skip-tests
|
|
|
|
# Only check configuration (90% faster)
|
|
./scripts/pre-push-test.sh --config-only
|
|
```
|
|
|
|
**Warning**: Skipping checks increases risk of CI failures
|
|
|
|
### "My branch is behind develop"
|
|
|
|
**Update first**:
|
|
```bash
|
|
git fetch origin
|
|
git rebase origin/develop
|
|
# Re-run pre-push checks
|
|
./scripts/pre-push-test.sh
|
|
```
|
|
|
|
---
|
|
|
|
## Emergency Push (Use Sparingly)
|
|
|
|
If you absolutely must push without full validation:
|
|
|
|
1. **Push to a feature branch** (never directly to develop/master):
|
|
```bash
|
|
git push origin feature/my-fix
|
|
```
|
|
|
|
2. **Create a PR immediately** to trigger CI
|
|
|
|
3. **Watch CI closely** and be ready to fix issues
|
|
|
|
4. **Don't merge until CI passes**
|
|
|
|
---
|
|
|
|
## CI-Matching Presets
|
|
|
|
Use these presets to match CI exactly:
|
|
|
|
| Platform | Local Preset | CI Preset | CI Job |
|
|
|----------|-------------|-----------|--------|
|
|
| Ubuntu 22.04 | `lin-dbg` | `ci-linux` | build/test |
|
|
| macOS 14 | `mac-dbg` | `ci-macos` | build/test |
|
|
| Windows 2022 | `win-dbg` | `ci-windows` | build/test |
|
|
|
|
**Usage**:
|
|
```bash
|
|
cmake --preset ci-linux # Exactly matches CI
|
|
cmake --build build
|
|
./build/bin/yaze_test --unit
|
|
```
|
|
|
|
---
|
|
|
|
## Success Metrics
|
|
|
|
After running all checks:
|
|
- ✅ **0 format violations**
|
|
- ✅ **0 CMake errors**
|
|
- ✅ **0 compilation errors**
|
|
- ✅ **0 symbol conflicts**
|
|
- ✅ **0 test failures**
|
|
|
|
**Result**: ~90% chance of passing CI on first try
|
|
|
|
---
|
|
|
|
## Related Documentation
|
|
|
|
- **Testing Strategy**: `docs/internal/testing/testing-strategy.md`
|
|
- **Gap Analysis**: `docs/internal/testing/gap-analysis.md`
|
|
- **Build Quick Reference**: `docs/public/build/quick-reference.md`
|
|
- **Troubleshooting**: `docs/public/build/troubleshooting.md`
|
|
|
|
---
|
|
|
|
## Questions?
|
|
|
|
- Check test output carefully (most errors are self-explanatory)
|
|
- Review recent commits for similar fixes: `git log --oneline --since="7 days ago"`
|
|
- Read error messages completely (don't skim)
|
|
- When in doubt, clean rebuild: `rm -rf build && cmake --preset <preset> && cmake --build build`
|