Branches map to environments

We keep the pipeline simple:

  • develop deploys automatically to the integration environment.
  • master is paired with semantic version tags for production releases.

The split keeps day-to-day iteration fast while giving releases a single, traceable entry point.

Rhythm of a feature release

  1. Branch off develop using a date + feature slug like feat/20251010-user-login.
  2. Commit locally in small, focused steps.
  3. Push and open a PR back to develop. The moment the PR appears, CI takes over.

CI tasks cover the basics:

- Build the project
- Lint / static analysis
- Unit tests

If any of these fail, the merge button stays disabled so reviewers can concentrate on logic instead of chasing build errors.

After merging into develop

Once the PR is approved and merged with “Rebase and merge”, the CD workflow kicks in:

  1. Build an artifact, e.g. my-app:dev.
  2. Push it to the registry.
  3. Deploy to the staging server through SSH or scripted automation.

A few minutes later the team can run full-stack verification against the latest code.

Shipping to production

When staging looks good, the release captain:

  1. Opens a PR from develop to master and merges using “Squash and merge”.
  2. Tags the resulting commit with a semantic version such as v1.2.0.
  3. Pushes the tag, which triggers the production pipeline.

The release script follows a predictable sequence:

git checkout master
git pull origin master
git tag -a v1.2.0 -m "Release v1.2.0"
git push origin v1.2.0

From there the pipeline:

  • Builds a tagged artifact (Docker image, package, etc.).
  • Pushes it to the registry and deploys to production.
  • Notifies the team to run post-release verification.

Release checklist

  • Double-check production config values.
  • Confirm database migrations ran cleanly.
  • Ensure monitoring and alerts cover the new surface area.
  • Assign someone to watch metrics for the first 30 minutes after release.

Closing thoughts

A predictable mapping between branches and environments, strict CI gates, and tag-driven releases keep the pipeline calm. Once the routine sticks, continuous delivery feels far less risky than batching everything into a monthly mega-release.