Pre-push validation checklist (cargo fmt, clippy with zero warnings, feature flag testing, test suite), CI monitoring, merge process, and release quality gates. Use when preparing to push code, validating changes before PR, running CI checks, merging PRs, or preparing releases.
Resources
2Install
npx skillscat add pmcfadin/cqlite/ci-cd-validation-merge-workflow Install via the SkillsCat registry.
CI/CD Validation & Merge Workflow
This skill provides guidance on validation workflows, CI/CD processes, and merge procedures for cqlite.
When to Use This Skill
- Running pre-push validation
- Preparing pull requests
- Monitoring CI pipeline
- Merging changes
- Preparing releases
- Troubleshooting CI failures
Pre-Push Validation Checklist
See validation-checklist.md for complete steps.
Quick Validation
# Run all pre-push checks
./scripts/ci/validate-cleanup.shManual Step-by-Step
1. Format Code
cargo fmt --all
git add -u
git commit -m "style: cargo fmt" || echo "No formatting needed"2. Clippy (Zero Warnings)
# MUST pass with -D warnings (warnings = errors)
cargo clippy --package cqlite-core --lib --all-features -- -D warningsRequirements:
- Zero warnings
- Fix all issues before proceeding
- No
#[allow(clippy::...)]without justification
3. Build (Minimal Features)
# M1 scope: reading only, no default features
cargo build --package cqlite-core --no-default-features --features=all-compressionMust succeed - tests feature gate correctness.
4. Build (All Features)
# Full feature set
cargo build --package cqlite-core --all-featuresMust succeed - tests complete build.
5. Run Tests (Library)
# Run all library tests
cargo test --package cqlite-core --lib --all-featuresTrack test count - should not decrease unexpectedly.
6. Run Integration Tests
# Run integration tests
cargo test --test '*'Must pass - validates end-to-end functionality.
7. Coverage Check
# Generate coverage report
cargo tarpaulin --out Html --output-dir coverage/Target: ≥90% coverage (PRD requirement)
Feature Flag Testing
M1 Feature Gates
Core reading (minimal):
cargo build --package cqlite-core \
--no-default-features \
--features=all-compressionWith benchmarks:
cargo build --package cqlite-core \
--no-default-features \
--features=all-compression,benchmarksAll features:
cargo build --package cqlite-core --all-featuresValidate Feature Combinations
# Test feature matrix
for features in "all-compression" "all-compression,benchmarks" "all-features"; do
echo "Testing: $features"
cargo test --package cqlite-core --no-default-features --features=$features
doneCI Pipeline
GitHub Actions Workflow
Located: .github/workflows/rust.yml
Jobs:
Format Check
- Runs
cargo fmt -- --check - Fast fail if unformatted
- Runs
Clippy
- Runs with
-D warnings - Zero warnings required
- Runs with
Build Matrix
- Minimal features
- All features
- Multiple Rust versions (stable, nightly)
Test Matrix
- Linux, macOS, Windows
- Unit + integration tests
Coverage
- Generates with tarpaulin
- Uploads to Codecov
- Gates on 90% threshold
Monitoring CI
View Status
# List recent runs
gh run list --branch <branch-name> --limit 5
# View specific run
gh run view <run-id>
# Watch live
gh run watch <run-id>Check Failures
# Download logs
gh run view <run-id> --log
# Download failed job logs
gh run view <run-id> --log-failedMerge Process
See merge-process.md for detailed workflow.
Prerequisites
Before merging:
- ✅ All CI checks green (10/10)
- ✅ Code review approved
- ✅ Branch up to date with main
- ✅ No conflicts
- ✅ Coverage ≥90%
Merge Methods
Squash merge (default for cleanup):
gh pr merge <pr-number> --squash --delete-branchMerge commit (for feature branches):
gh pr merge <pr-number> --merge --delete-branchRebase (for clean history):
gh pr merge <pr-number> --rebase --delete-branchCommit Message Format
<type>(<scope>): <subject>
<body>
<footer>Types:
feat: New featurefix: Bug fixrefactor: Code refactoringperf: Performance improvementtest: Test additions/changesdocs: Documentationstyle: Formattingchore: Build/toolingcleanup: Dead code removal
Example:
feat(parser): add support for duration CQL type
Implement deserialization for duration type consisting of
three VInts (months, days, nanoseconds).
- Add Duration variant to CqlType enum
- Implement parse_duration() with VInt handling
- Add property tests for edge cases
Closes #123Error Handling
Clippy Failures
Common issues:
# Unused imports
cargo clippy --fix
# Unnecessary clones
# Review each and remove if safe
# Dead code warnings
# Expected for cleanup issues - documentTest Failures
Debugging:
# Run single test with output
cargo test --test test_name -- --nocapture
# Run with backtrace
RUST_BACKTRACE=1 cargo test test_name
# Run with logging
RUST_LOG=debug cargo test test_nameBuild Failures
Feature flag issues:
# Check feature dependencies in Cargo.toml
[features]
default = ["all-compression"]
all-compression = ["lz4", "snap", "flate2"]
benchmarks = [] # NOT in defaultDependency issues:
# Clean and rebuild
cargo clean
cargo buildCoverage Failures
Below 90%:
- Identify uncovered lines
- Add unit tests for uncovered code
- Add property tests for edge cases
- Document why coverage can't reach 90% (if applicable)
Release Process
Pre-Release Checklist
All tests pass
cargo test --all-featuresBenchmarks run
cargo bench --features=benchmarksDocumentation builds
cargo doc --no-deps --all-featuresExamples work
cargo run --example basic_usageUpdate CHANGELOG.md
## [0.1.0] - 2025-10-21 ### Added - Initial release - Cassandra 5.0 SSTable parsing - All CQL types supportedUpdate version
# Cargo.toml [package] version = "0.1.0"
Creating Release
# Tag version
git tag -a v0.1.0 -m "Release v0.1.0"
git push origin v0.1.0
# Create GitHub release
gh release create v0.1.0 \
--title "v0.1.0 - Initial Release" \
--notes-file RELEASE_NOTES.md \
--draft # Remove --draft when readyPRD Alignment
Milestone M1 (Core Reading Library):
- 95% test coverage requirement
- Zero clippy warnings
- All CQL types validated
Milestone M6 (Performance & Release):
- Benchmarks vs native tools
- Release packaging
- 90% codecov gate (stricter than M1)
Common Scenarios
Scenario 1: Pre-Push Validation
# Quick check before push
cargo fmt --all
cargo clippy --package cqlite-core --lib --all-features -- -D warnings
cargo test --package cqlite-core --lib
# If all pass:
git push origin feature/my-branchScenario 2: CI Failure Investigation
# Check CI logs
gh run view --log
# Reproduce locally
cargo test --package cqlite-core --lib --features=all-compression
# Fix and push
git commit --amend
git push --force-with-lease origin feature/my-branchScenario 3: Merge Blocked by Coverage
# Generate coverage report
cargo tarpaulin --out Html
# Open report
open tarpaulin-report.html
# Identify uncovered code
# Add tests
# Re-run coverageAutomation
Pre-Commit Hook
# .git/hooks/pre-commit
#!/bin/bash
set -e
echo "Running pre-commit checks..."
# Format
cargo fmt --all -- --check
# Clippy
cargo clippy --package cqlite-core --lib --all-features -- -D warnings
# Tests
cargo test --package cqlite-core --lib
echo "Pre-commit checks passed!"Pre-Push Hook
# .git/hooks/pre-push
#!/bin/bash
set -e
echo "Running pre-push validation..."
# Full validation
./scripts/ci/validate-cleanup.sh
echo "Pre-push validation passed!"Troubleshooting
Tests Pass Locally, Fail in CI
Possible causes:
- Platform-specific issues (Windows vs Linux)
- Timing issues in async tests
- File path differences
Solution:
# Run in Docker matching CI environment
docker run --rm -v $(pwd):/workspace -w /workspace rust:latest \
cargo test --all-featuresClippy Different Results Locally vs CI
Cause: Different Rust versions
Solution:
# Check Rust version
rustc --version
# Use same as CI (check .github/workflows/rust.yml)
rustup install 1.70.0
rustup default 1.70.0Coverage Unstable
Cause: Non-deterministic code or flaky tests
Solution:
- Run coverage multiple times
- Identify unstable lines
- Fix flaky tests
Best Practices
Validate locally before pushing
- Saves CI resources
- Faster feedback loop
Fix clippy warnings immediately
- Don't accumulate tech debt
- Easier to fix in context
Keep PRs small
- Easier to review
- Easier to revert if needed
Write meaningful commit messages
- Helps future debugging
- Documents intent
Monitor CI actively
- Don't "fire and forget"
- Fix failures promptly
Next Steps
After validation passes:
- Push branch
- Create PR
- Monitor CI
- Address review feedback
- Merge when green
- Verify main CI stays green
References
- validation-checklist.md - Complete checklist
- merge-process.md - Detailed merge workflow
.github/workflows/rust.yml- CI configurationscripts/ci/validate-cleanup.sh- Validation script