410 lines
13 KiB
Markdown
410 lines
13 KiB
Markdown
# Release Workflow Comparison
|
|
|
|
## Overview
|
|
|
|
This document compares the three most popular branching and release workflows: Git Flow, GitHub Flow, and Trunk-based Development. Each approach has distinct advantages and trade-offs depending on your team size, deployment frequency, and risk tolerance.
|
|
|
|
## Git Flow
|
|
|
|
### Structure
|
|
```
|
|
main (production)
|
|
↑
|
|
release/1.2.0 ← develop (integration) ← feature/user-auth
|
|
↑ ← feature/payment-api
|
|
hotfix/critical-fix
|
|
```
|
|
|
|
### Branch Types
|
|
- **main**: Production-ready code, tagged releases
|
|
- **develop**: Integration branch for next release
|
|
- **feature/***: Individual features, merged to develop
|
|
- **release/X.Y.Z**: Release preparation, branched from develop
|
|
- **hotfix/***: Critical fixes, branched from main
|
|
|
|
### Typical Flow
|
|
1. Create feature branch from develop: `git checkout -b feature/login develop`
|
|
2. Work on feature, commit changes
|
|
3. Merge feature to develop when complete
|
|
4. When ready for release, create release branch: `git checkout -b release/1.2.0 develop`
|
|
5. Finalize release (version bump, changelog, bug fixes)
|
|
6. Merge release branch to both main and develop
|
|
7. Tag release: `git tag v1.2.0`
|
|
8. Deploy from main branch
|
|
|
|
### Advantages
|
|
- **Clear separation** between production and development code
|
|
- **Stable main branch** always represents production state
|
|
- **Parallel development** of features without interference
|
|
- **Structured release process** with dedicated release branches
|
|
- **Hotfix support** without disrupting development work
|
|
- **Good for scheduled releases** and traditional release cycles
|
|
|
|
### Disadvantages
|
|
- **Complex workflow** with many branch types
|
|
- **Merge overhead** from multiple integration points
|
|
- **Delayed feedback** from long-lived feature branches
|
|
- **Integration conflicts** when merging large features
|
|
- **Slower deployment** due to process overhead
|
|
- **Not ideal for continuous deployment**
|
|
|
|
### Best For
|
|
- Large teams (10+ developers)
|
|
- Products with scheduled release cycles
|
|
- Enterprise software with formal testing phases
|
|
- Projects requiring stable release branches
|
|
- Teams comfortable with complex Git workflows
|
|
|
|
### Example Commands
|
|
```bash
|
|
# Start new feature
|
|
git checkout develop
|
|
git checkout -b feature/user-authentication
|
|
|
|
# Finish feature
|
|
git checkout develop
|
|
git merge --no-ff feature/user-authentication
|
|
git branch -d feature/user-authentication
|
|
|
|
# Start release
|
|
git checkout develop
|
|
git checkout -b release/1.2.0
|
|
# Version bump and changelog updates
|
|
git commit -am "Bump version to 1.2.0"
|
|
|
|
# Finish release
|
|
git checkout main
|
|
git merge --no-ff release/1.2.0
|
|
git tag -a v1.2.0 -m "Release version 1.2.0"
|
|
git checkout develop
|
|
git merge --no-ff release/1.2.0
|
|
git branch -d release/1.2.0
|
|
|
|
# Hotfix
|
|
git checkout main
|
|
git checkout -b hotfix/security-patch
|
|
# Fix the issue
|
|
git commit -am "Fix security vulnerability"
|
|
git checkout main
|
|
git merge --no-ff hotfix/security-patch
|
|
git tag -a v1.2.1 -m "Hotfix version 1.2.1"
|
|
git checkout develop
|
|
git merge --no-ff hotfix/security-patch
|
|
```
|
|
|
|
## GitHub Flow
|
|
|
|
### Structure
|
|
```
|
|
main ← feature/user-auth
|
|
← feature/payment-api
|
|
← hotfix/critical-fix
|
|
```
|
|
|
|
### Branch Types
|
|
- **main**: Production-ready code, deployed automatically
|
|
- **feature/***: All changes, regardless of size or type
|
|
|
|
### Typical Flow
|
|
1. Create feature branch from main: `git checkout -b feature/login main`
|
|
2. Work on feature with regular commits and pushes
|
|
3. Open pull request when ready for feedback
|
|
4. Deploy feature branch to staging for testing
|
|
5. Merge to main when approved and tested
|
|
6. Deploy main to production automatically
|
|
7. Delete feature branch
|
|
|
|
### Advantages
|
|
- **Simple workflow** with only two branch types
|
|
- **Fast deployment** with minimal process overhead
|
|
- **Continuous integration** with frequent merges to main
|
|
- **Early feedback** through pull request reviews
|
|
- **Deploy from branches** allows testing before merge
|
|
- **Good for continuous deployment**
|
|
|
|
### Disadvantages
|
|
- **Main can be unstable** if testing is insufficient
|
|
- **No release branches** for coordinating multiple features
|
|
- **Limited hotfix process** requires careful coordination
|
|
- **Requires strong testing** and CI/CD infrastructure
|
|
- **Not suitable for scheduled releases**
|
|
- **Can be chaotic** with many simultaneous features
|
|
|
|
### Best For
|
|
- Small to medium teams (2-10 developers)
|
|
- Web applications with continuous deployment
|
|
- Products with rapid iteration cycles
|
|
- Teams with strong testing and CI/CD practices
|
|
- Projects where main is always deployable
|
|
|
|
### Example Commands
|
|
```bash
|
|
# Start new feature
|
|
git checkout main
|
|
git pull origin main
|
|
git checkout -b feature/user-authentication
|
|
|
|
# Regular work
|
|
git add .
|
|
git commit -m "feat(auth): add login form validation"
|
|
git push origin feature/user-authentication
|
|
|
|
# Deploy branch for testing
|
|
# (Usually done through CI/CD)
|
|
./deploy.sh feature/user-authentication staging
|
|
|
|
# Merge when ready
|
|
git checkout main
|
|
git merge feature/user-authentication
|
|
git push origin main
|
|
git branch -d feature/user-authentication
|
|
|
|
# Automatic deployment to production
|
|
# (Triggered by push to main)
|
|
```
|
|
|
|
## Trunk-based Development
|
|
|
|
### Structure
|
|
```
|
|
main ← short-feature-branch (1-3 days max)
|
|
← another-short-branch
|
|
← direct-commits
|
|
```
|
|
|
|
### Branch Types
|
|
- **main**: The single source of truth, always deployable
|
|
- **Short-lived branches**: Optional, for changes taking >1 day
|
|
|
|
### Typical Flow
|
|
1. Commit directly to main for small changes
|
|
2. Create short-lived branch for larger changes (max 2-3 days)
|
|
3. Merge to main frequently (multiple times per day)
|
|
4. Use feature flags to hide incomplete features
|
|
5. Deploy main to production multiple times per day
|
|
6. Release by enabling feature flags, not code deployment
|
|
|
|
### Advantages
|
|
- **Simplest workflow** with minimal branching
|
|
- **Fastest integration** with continuous merges
|
|
- **Reduced merge conflicts** from short-lived branches
|
|
- **Always deployable main** through feature flags
|
|
- **Fastest feedback loop** with immediate integration
|
|
- **Excellent for CI/CD** and DevOps practices
|
|
|
|
### Disadvantages
|
|
- **Requires discipline** to keep main stable
|
|
- **Needs feature flags** for incomplete features
|
|
- **Limited code review** for direct commits
|
|
- **Can be destabilizing** without proper testing
|
|
- **Requires advanced CI/CD** infrastructure
|
|
- **Not suitable for teams** uncomfortable with frequent changes
|
|
|
|
### Best For
|
|
- Expert teams with strong DevOps culture
|
|
- Products requiring very fast iteration
|
|
- Microservices architectures
|
|
- Teams practicing continuous deployment
|
|
- Organizations with mature testing practices
|
|
|
|
### Example Commands
|
|
```bash
|
|
# Small change - direct to main
|
|
git checkout main
|
|
git pull origin main
|
|
# Make changes
|
|
git add .
|
|
git commit -m "fix(ui): resolve button alignment issue"
|
|
git push origin main
|
|
|
|
# Larger change - short branch
|
|
git checkout main
|
|
git pull origin main
|
|
git checkout -b payment-integration
|
|
# Work for 1-2 days maximum
|
|
git add .
|
|
git commit -m "feat(payment): add Stripe integration"
|
|
git push origin payment-integration
|
|
|
|
# Immediate merge
|
|
git checkout main
|
|
git merge payment-integration
|
|
git push origin main
|
|
git branch -d payment-integration
|
|
|
|
# Feature flag usage
|
|
if (featureFlags.enabled('stripe_payments', userId)) {
|
|
return renderStripePayment();
|
|
} else {
|
|
return renderLegacyPayment();
|
|
}
|
|
```
|
|
|
|
## Feature Comparison Matrix
|
|
|
|
| Aspect | Git Flow | GitHub Flow | Trunk-based |
|
|
|--------|----------|-------------|-------------|
|
|
| **Complexity** | High | Medium | Low |
|
|
| **Learning Curve** | Steep | Moderate | Gentle |
|
|
| **Deployment Frequency** | Weekly/Monthly | Daily | Multiple/day |
|
|
| **Branch Lifetime** | Weeks/Months | Days/Weeks | Hours/Days |
|
|
| **Main Stability** | Very High | High | High* |
|
|
| **Release Coordination** | Excellent | Limited | Feature Flags |
|
|
| **Hotfix Support** | Built-in | Manual | Direct |
|
|
| **Merge Conflicts** | High | Medium | Low |
|
|
| **Team Size** | 10+ | 3-10 | Any |
|
|
| **CI/CD Requirements** | Medium | High | Very High |
|
|
|
|
*With proper feature flags and testing
|
|
|
|
## Release Strategies by Workflow
|
|
|
|
### Git Flow Releases
|
|
```bash
|
|
# Scheduled release every 2 weeks
|
|
git checkout develop
|
|
git checkout -b release/2.3.0
|
|
|
|
# Version management
|
|
echo "2.3.0" > VERSION
|
|
npm version 2.3.0 --no-git-tag-version
|
|
python setup.py --version 2.3.0
|
|
|
|
# Changelog generation
|
|
git log --oneline release/2.2.0..HEAD --pretty=format:"%s" > CHANGELOG_DRAFT.md
|
|
|
|
# Testing and bug fixes in release branch
|
|
git commit -am "fix: resolve issue found in release testing"
|
|
|
|
# Finalize release
|
|
git checkout main
|
|
git merge --no-ff release/2.3.0
|
|
git tag -a v2.3.0 -m "Release 2.3.0"
|
|
|
|
# Deploy tagged version
|
|
docker build -t app:2.3.0 .
|
|
kubectl set image deployment/app app=app:2.3.0
|
|
```
|
|
|
|
### GitHub Flow Releases
|
|
```bash
|
|
# Deploy every merge to main
|
|
git checkout main
|
|
git merge feature/new-payment-method
|
|
|
|
# Automatic deployment via CI/CD
|
|
# .github/workflows/deploy.yml triggers on push to main
|
|
|
|
# Tag releases for tracking (optional)
|
|
git tag -a v2.3.$(date +%Y%m%d%H%M) -m "Production deployment"
|
|
|
|
# Rollback if needed
|
|
git revert HEAD
|
|
git push origin main # Triggers automatic rollback deployment
|
|
```
|
|
|
|
### Trunk-based Releases
|
|
```bash
|
|
# Continuous deployment with feature flags
|
|
git checkout main
|
|
git add feature_flags.json
|
|
git commit -m "feat: enable new payment method for 10% of users"
|
|
git push origin main
|
|
|
|
# Gradual rollout
|
|
curl -X POST api/feature-flags/payment-v2/rollout/25 # 25% of users
|
|
# Monitor metrics...
|
|
curl -X POST api/feature-flags/payment-v2/rollout/50 # 50% of users
|
|
# Monitor metrics...
|
|
curl -X POST api/feature-flags/payment-v2/rollout/100 # Full rollout
|
|
|
|
# Remove flag after successful rollout
|
|
git rm old_payment_code.js
|
|
git commit -m "cleanup: remove legacy payment code"
|
|
```
|
|
|
|
## Choosing the Right Workflow
|
|
|
|
### Decision Matrix
|
|
|
|
**Choose Git Flow if:**
|
|
- ✅ Team size > 10 developers
|
|
- ✅ Scheduled release cycles (weekly/monthly)
|
|
- ✅ Multiple versions supported simultaneously
|
|
- ✅ Formal testing and QA processes
|
|
- ✅ Complex enterprise software
|
|
- ❌ Need rapid deployment
|
|
- ❌ Small team or startup
|
|
|
|
**Choose GitHub Flow if:**
|
|
- ✅ Team size 3-10 developers
|
|
- ✅ Web applications or APIs
|
|
- ✅ Strong CI/CD and testing
|
|
- ✅ Daily or continuous deployment
|
|
- ✅ Simple release requirements
|
|
- ❌ Complex release coordination needed
|
|
- ❌ Multiple release branches required
|
|
|
|
**Choose Trunk-based Development if:**
|
|
- ✅ Expert development team
|
|
- ✅ Mature DevOps practices
|
|
- ✅ Microservices architecture
|
|
- ✅ Feature flag infrastructure
|
|
- ✅ Multiple deployments per day
|
|
- ✅ Strong automated testing
|
|
- ❌ Junior developers
|
|
- ❌ Complex integration requirements
|
|
|
|
### Migration Strategies
|
|
|
|
#### From Git Flow to GitHub Flow
|
|
1. **Simplify branching**: Eliminate develop branch, work directly with main
|
|
2. **Increase deployment frequency**: Move from scheduled to continuous releases
|
|
3. **Strengthen testing**: Improve automated test coverage and CI/CD
|
|
4. **Reduce branch lifetime**: Limit feature branches to 1-2 weeks maximum
|
|
5. **Train team**: Educate on simpler workflow and increased responsibility
|
|
|
|
#### From GitHub Flow to Trunk-based
|
|
1. **Implement feature flags**: Add feature toggle infrastructure
|
|
2. **Improve CI/CD**: Ensure all tests run in <10 minutes
|
|
3. **Increase commit frequency**: Encourage multiple commits per day
|
|
4. **Reduce branch usage**: Start committing small changes directly to main
|
|
5. **Monitor stability**: Ensure main remains deployable at all times
|
|
|
|
#### From Trunk-based to Git Flow
|
|
1. **Add structure**: Introduce develop and release branches
|
|
2. **Reduce deployment frequency**: Move to scheduled release cycles
|
|
3. **Extend branch lifetime**: Allow longer feature development cycles
|
|
4. **Formalize process**: Add approval gates and testing phases
|
|
5. **Coordinate releases**: Plan features for specific release versions
|
|
|
|
## Anti-patterns to Avoid
|
|
|
|
### Git Flow Anti-patterns
|
|
- **Long-lived feature branches** (>2 weeks)
|
|
- **Skipping release branches** for small releases
|
|
- **Direct commits to main** bypassing develop
|
|
- **Forgetting to merge back** to develop after hotfixes
|
|
- **Complex merge conflicts** from delayed integration
|
|
|
|
### GitHub Flow Anti-patterns
|
|
- **Unstable main branch** due to insufficient testing
|
|
- **Long-lived feature branches** defeating the purpose
|
|
- **Skipping pull request reviews** for speed
|
|
- **Direct production deployment** without staging validation
|
|
- **No rollback plan** when deployments fail
|
|
|
|
### Trunk-based Anti-patterns
|
|
- **Committing broken code** to main branch
|
|
- **Feature branches lasting weeks** defeating the philosophy
|
|
- **No feature flags** for incomplete features
|
|
- **Insufficient automated testing** leading to instability
|
|
- **Poor CI/CD pipeline** causing deployment delays
|
|
|
|
## Conclusion
|
|
|
|
The choice of release workflow significantly impacts your team's productivity, code quality, and deployment reliability. Consider your team size, technical maturity, deployment requirements, and organizational culture when making this decision.
|
|
|
|
**Start conservative** (Git Flow) and evolve toward more agile approaches (GitHub Flow, Trunk-based) as your team's skills and infrastructure mature. The key is consistency within your team and alignment with your organization's goals and constraints.
|
|
|
|
Remember: **The best workflow is the one your team can execute consistently and reliably**. |