We have three environments: Dev, UAT and Prod. We use TFS to schedule releases of our master branch into Dev for our internal verification, then UAT for business verification, and of course finally to Prod once approved.
We've recently adopted a new lightweight Git branching strategy as follows:
master is always prod-ready. At any point master should be able to be deployed to production.
All new development is done in a separate feature (topic) branch as follows:
- Create a new feature branch off
master, call itFeatureA - Develop
FeatureAuntil completion - Once
FeatureAis finished, release it toDev, and thenUAT - Once the business signs off on
FeatureAinUAT, it's considered prod-ready. MergeFeatureAintomaster, then deploy the newmasterbranch toDevthenUAT. During the way, "smoke test" the branch inUATto ensure the resulting merge into master didn't cause any unforeseen side-effects. Once smoke-tested, release toProd.
The problem we're coming across right now is that we may have multiple features being developed in parallel, all of which could potentially need to be deployed to the test environment for verification at the same time. The approach we've taken to solving this problem is:
If FeatureA and FeatureB need to be in UAT at the same time, then:
- Create a new branch,
FeatureAandB, which will encompass both features - Merge
FeatureAintoFeatureAandB - Merge
FeatureBintoFeatureAandB - Release
FeatureAandBtoDev, thenUAT
The downside to this is that it's unlikely both FeatureA and FeatureB will be UAT verified at the same time. If FeatureA is verified and FeatureB is not, we need to release FeatureA to prod without FeatureB. What we've discussed in this scenario is to:
- Merge
FeatureA(not the joint branch, but just FeatureA) intomaster - Release
mastertoDev, thenUATfor a quick smoke-test, and finallyProd - Once in prod, re-release just
FeatureBtoDevthenUATso testing can continue.
The downside to this is that it directly impacts any testing for FeatureB, and potentially unwinds any work the testers have accomplished with FeatureB.
How do you manage multiple features living simultaneously in each environment and being released potentially independent of one another? We can mitigate the issue a little more if we have multiple environments, or turn-around UAT testing much quicker, but at the end of the day the same problem can exist.
I'm not opposed to hearing alternative branching strategies, either.
DevandUATto test?