title: How do you manage multiple releases in multiple environments in continuous integration/delivery?
body: <p>I am trying to wrap my head around this. Most CI/CD examples/projects have a single master that is always released, and have some variant of, e.g. git-flow, to have a develop branch. Once tagged, it goes to master.</p>
  
  <p>Either way, <code>master</code> is always released to production.</p>
  
  <p>But in the real world as I see it, there are human gates for release to production and other environments. What mechanism do you use to <em>manage</em> the deployment of different versions?</p>
  
  <p>For example:</p>
  
  <ul>
  <li>v1.5 is the current production release</li>
  <li>v1.6 has passed all tests, artifacts are ready, it is tagged as valid, but business decides to deploy it only to staging, awaiting an opportune moment to deploy</li>
  <li>v1.5 is deployed to a demo environment</li>
  <li>v2.0 has also passed all tests, but is in UAT, subject to the customer being happy, as it is a major release</li>
  </ul>
  
  <p>There could be many more such environments - production, staging, UAT, demo, demo2, etc.</p>
  
  <p>What mechanism do you use to handle the tagging of a particular version for a particular environment, and the actual deployment thereof?</p>