๐Ÿ”€ Release Management Strategies

Two decisions, not one โ€” first how you structure repos & releases, then how you handle long-running features within that.

Two decisions, not one

Decision 1 โ€” Release strategy. Do your services live in one repo and ship together (Monorepo / Batch Release), or in separate repos that ship independently (Polyrepo / Independent Release)? These are alternatives โ€” you pick one. Your service coupling and team structure decide it, not preference.

Decision 2 โ€” Long-running features. Whichever strategy you picked, a feature that takes 3+ sprints still can't sit half-done in the pipeline. Feature Flags and Feature Branch + STAGE are the two techniques that solve this โ€” and they work with either release strategy. They're complementary, not competing.

โ‘  Release strategy โ€” pick one

Batch Release (monorepo) and Independent Release (polyrepo) are mutually exclusive structural choices.

Release strategy ยท alternative

Monorepo โ€” Batch Release

All services live in one repo and move through DEV โ†’ QA โ†’ PROD as coordinated batches. Environment branches are synced by merge, not cherry-pick.

  • Atomic cross-service changes
  • No branch / version drift between environments
  • Coordinated release window (whole team)
  • Best for small platform teams & coupled services
Release strategy ยท alternative

Polyrepo โ€” Independent Release

Each service in its own repo with its own pipeline, shipped independently the moment its feature is ready โ€” no shared batch window.

  • Independent per-service deploys
  • One service failing blocks no others
  • Team autonomy, small blast radius
  • Cost: backward-compatible contracts + version skew

โ‘ก Handling long-running features โ€” works with either

A feature that spans 3+ sprints needs one of these techniques. Both layer on top of whichever release strategy you picked above.

Complementary technique

Feature Flags

Code merges continuously; the unfinished feature is hidden behind a runtime flag until it's ready.

  • No branch divergence
  • Early, continuous integration
  • Gradual rollouts (canary releases)
  • Best for UI features and experiments
Complementary technique

Feature Branch + STAGE

The feature is developed in an isolated branch deployed to a dedicated STAGE environment until it's ready to integrate.

  • Complete isolation from production
  • Safe for architectural / breaking changes
  • Easy to demo or abandon
  • Limit to one feature branch at a time

Comparison 1 โ€” Release strategy (pick one)

Aspect Monorepo โ€” Batch Release Polyrepo โ€” Independent Release
Unit of release Coordinated batch โ€” all services together Per service โ€” each ships on its own
Cross-service change Atomic โ€” lands everywhere in one move Needs versioned, backward-compatible contracts
Drift / version skew Prevented by batch promotion Version skew is normal โ€” a running matrix
Failure blast radius A failed feature can hold the batch Isolated to the one service
Coordination cost High โ€” whole team, synced window Low โ€” per-team autonomy
Best for Small platform team, coupled services Decoupled services, separate teams

Comparison 2 โ€” Long-feature technique (use with either strategy)

Aspect Feature Flags Feature Branch + STAGE
Isolation Runtime flag โ€” code merged, hidden Separate branch + dedicated STAGE env
Integration testing Continuous (early) Late (at merge time)
Main risk Flag misconfiguration Merge conflicts / divergence
Multiple long features Easy โ€” separate flags Hard โ€” separate branches
Extra infrastructure Flag service STAGE environment
Best for UI features, gradual rollouts Architectural / breaking changes

๐Ÿ’ก Recommendation

1. Pick the release strategy by coupling & team

Monorepo โ€” Batch Release when a small platform team operates tightly-coupled services and you want atomic, drift-free changes. The coordination of a synced release window is the price of that atomicity.

Polyrepo โ€” Independent Release when services are decoupled and owned by separate teams, and per-service flow matters more than one atomic change. The backward-compatibility / version-matrix burden is the price of that autonomy.

2. Then handle long-running features (in either)

Default to Feature Flags โ€” continuous integration, no branch divergence, gradual rollout. This is the right tool for most long features.

Use Feature Branch + STAGE only for architectural or breaking changes that can't be hidden behind a flag (database schema, API contracts). Limit to one feature branch at a time.