| title | Legacy: Smart Merge Queue |
|---|---|
| slug | legacy/features/merge-queue |
Automate merging with stack-aware CI optimization and conflict resolution
The Smart Merge Queue automatically merges approved pull requests in the correct order, running CI efficiently and handling rebases automatically.
Manual merging is:
- ⏰ Slow - Wait for CI, merge, repeat
- 🐛 Error-prone - Merge conflicts, wrong order
- 💸 Expensive - Run CI for every PR individually
- 😓 Tedious - Babysit the merge process
Smart Merge Queue:
✅ Automatic Merging - Set it and forget it ✅ Stack-Aware - Merges in dependency order ✅ CI Optimization - Batches compatible PRs ✅ Conflict Resolution - Auto-rebases or alerts ✅ Priority Handling - Hotfixes jump the queue
Without Queue:
PR #123 → Wait for CI (5 min) → Merge →
PR #124 → Rebase → Wait for CI (5 min) → Merge →
PR #125 → Rebase → Wait for CI (5 min) → Merge
Total: ~20 minutes, 3 CI runs
With Queue:
Add #123, #124, #125 to queue →
Queue detects dependencies →
Merges #123 →
Auto-rebases #124 →
Batches #124 + #125 for CI (if compatible) →
Merges both
Total: ~8 minutes, 1-2 CI runs 🎉
1. PR gets approved
↓
2. Add to merge queue
↓
3. Queue checks:
- All approvals? ✓
- CI passing? ✓
- Conflicts? Auto-rebase
- Dependencies? Order correctly
↓
4. Run final CI check
↓
5. Merge to main
↓
6. Update dependent PRs
Queue understands stacks:
Queue contains:
- PR #123 (base)
- PR #124 (depends on #123)
- PR #125 (depends on #124)
Queue automatically:
1. Merges #123 first
2. Rebases #124 onto new main
3. Runs CI for #124
4. Merges #124
5. Rebases #125
6. Merges #125
All automatic!
Batching:
PR #126: Fix typo in docs (no code changes)
PR #127: Update README
PR #128: Fix CSS bug
Queue batches #126 + #127 (docs only)
→ Single CI run
→ Merge both together
→ 50% CI cost savings!
Smart Scheduling:
- Long CI jobs run in parallel
- Short jobs batch together
- Stack dependencies respected
- Repository with CI configured
- Merge permissions
- Branch protection (optional but recommended)
Via Web UI:
- Open approved PR
- Click "Add to Merge Queue" button
- PR status changes to "In Queue"
- Watch it merge automatically!
Via CLI:
# Add single PR
och queue add 125
# Add multiple PRs
och queue add 123 124 125
# Add with priority (hotfix)
och queue add 126 --priority high
# Add when approved
och queue add 127 --when approvedVia API:
curl -X POST https://git.yourcompany.com/api/queue \
-H "Authorization: Bearer $TOKEN" \
-d '{"pr_id": 125, "priority": "normal"}'Web UI:
Navigate to /queue or click "Merge Queue" in repository navigation
CLI:
# View entire queue
och queue list
# Output:
# Position PR Title Status ETA
# 1 #125 Login UI 🏃 Running CI 2 min
# 2 #124 Auth service ⏳ Waiting 5 min
# 3 #123 Database schema ✅ Ready 7 min
# 4 #126 Hotfix: XSS 🔥 Priority 1 min
# Watch queue in real-time
och queue watchAPI:
curl https://git.yourcompany.com/api/queue \
-H "Authorization: Bearer $TOKEN"| Priority | Use Case | Behavior |
|---|---|---|
| 🔥 Critical | Production outage | Jumps to front, blocks other merges |
| ⚡ High | Security fix, hotfix | Merges before normal PRs |
| 📄 Normal | Regular features | Default, FIFO order |
| 🐌 Low | Refactoring, docs | Merges when queue is empty |
Setting priority:
# CLI
och queue add 126 --priority critical
# Web UI: Select priority dropdown when adding to queue# Remove specific PR
och queue remove 125
# Remove all your PRs
och queue remove --mine
# Clear entire queue (admin only)
och queue clear# Pause (emergency)
och queue pause --reason "Investigating production issue"
# Resume
och queue resumeRepository → Settings → Merge Queue
# Merge strategy
merge_method: squash # or merge, rebase
# CI requirements
require_ci: true
required_checks:
- "test"
- "lint"
- "build"
# Approval requirements
require_approvals: 1
dismiss_stale_reviews: true
# Batching
enable_batching: true
batch_window: 5m # Wait 5 min to batch PRs
max_batch_size: 3 # Max 3 PRs per batch
# Rebasing
auto_rebase: true # Auto-rebase on conflicts
rebase_strategy: merge # or rebase, squash
# Priorities
allow_priority_override: true # Let users set priority
max_queue_size: 50 # Max PRs in queueRecommended settings:
# .github/branch-protection.yml
branches:
main:
required_status_checks:
- test
- lint
required_approvals: 1
allow_force_push: false
allow_queue_bypass: false # Even admins use queue!Get notified when PRs merge:
# Configure webhook
curl -X POST https://git.yourcompany.com/api/webhooks \
-d '{
"url": "https://yourapp.com/webhook",
"events": ["merge_queue.merged", "merge_queue.failed"],
"secret": "your-secret"
}'Payload:
{
"event": "merge_queue.merged",
"pr": {
"number": 125,
"title": "Add login UI",
"author": "swadhin"
},
"queue": {
"position": 1,
"wait_time_seconds": 180
},
"timestamp": "2024-01-01T12:00:00Z"
}✅ Always use for:
- Feature branches → main
- Release branches
- Any PR affecting production
❌ Don't use for:
- Draft PRs
- WIP branches
- Experimental features
1. Fast CI:
# Run quick tests in queue
queue_ci:
- unit_tests # 2 min
# Run slow tests post-merge
post_merge_ci:
- integration_tests # 10 min
- e2e_tests # 15 min2. Parallel CIs:
# Run multiple jobs in parallel
ci:
- test (3 min)
- lint (1 min)
- build (2 min)
# Total: 3 min (not 6 min!)3. Smart batching:
# Group related PRs
och queue add 123 124 125 --batch-id feature-auth
# Queue runs CI once for entire batchAutomatic resolution:
auto_rebase: true
rebase_strategy: merge # Creates merge commit
# Or:
rebase_strategy: rebase # Cleaner historyManual resolution:
# If auto-rebase fails, you'll get notification
# Fix locally:
git checkout feature-branch
git fetch origin
git rebase origin/main
# Resolve conflicts
git push --force-with-lease
# PR automatically re-enters queueSet up alerts:
# Slack notification if queue stalled
alerts:
- type: queue_stalled
threshold: 30m
channel: "#eng-deployments"
- type: merge_failed
channel: "#eng-alerts"Dashboard example:
# View queue health
och queue stats
# Output:
# Queue Health: ✅ Good
# - Average wait time: 4.2 min
# - CI success rate: 94%
# - Merge rate: 15 PRs/hour
# - Current size: 8 PRsCauses:
- CI failing
- Waiting for approval
- Merge conflict
- Dependency not merged yet
Solutions:
# Check status
och queue status 125
# View logs
och queue logs 125
# Remove and re-add
och queue remove 125
# Fix issue
och queue add 125Cause: Complex merge conflicts.
Solution:
# Remove from queue
och queue remove 125
# Manually rebase
git checkout feature-branch
git rebase origin/main
# Resolve conflicts
git push -f
# Re-add to queue
och queue add 125Causes:
- Queue paused
- CI service down
- Rate limit reached
Solutions:
# Check queue status
och queue info
# Resume if paused
och queue resume
# Check CI status
curl https://ci-service/status
# View queue system logs (admin)
och admin logs queueCause: Dependencies not detected.
Solution:
# Manually set dependency
och pr edit 125 --depends-on 124
# Queue will automatically reorderFor high-velocity teams:
# Merge up to 5 PRs simultaneously
merge_train:
enabled: true
max_concurrent: 5
# Creates temporary integration branches
# Runs CI in parallel
# Merges in rapid succession# Merge during business hours only
och queue add 125 --schedule "Mon-Fri 9am-5pm EST"
# Merge during maintenance window
och queue add 126 --schedule "Sat 2am-4am EST"Custom automation:
// .opencodehub/hooks/queue.js
module.exports = {
beforeMerge(pr) {
// Send Slack notification
// Update JIRA ticket
// Trigger deployment
},
afterMerge(pr) {
// Create release notes
// Update documentation
},
};