I believe you are probably using Semantic Versioning when you create tags. This would be nice thing to mention (how to name your tags).
You should always deploy from detatched heads (tags/commits instead of branches, which have history that can move), because this creates certainty to the deployment process (deployment with static commit hashes, instead of dynamic branches).
Also in robust systems, you should be able to run certain front-end servers with tags of next release and others with the previous release tag; this way your developers can test the actual servers and you can use load-balancers to direct only part of the visitors to the new release.
e.g. When Netflix releases a new version, only 5% of the users are redirected to the cluster which has the new release and rest of the users use the reliable version of Netflix. This way deployment doesn't create cascading problems.
Of course this is a bit too robust for non-critical systems, but the practice of Semantic Versioning and releasing tags instead of branches is easy to adopt, and when things get critical, you are ready.
Hopefully I expressed the ideas clear enough, I am in a bit of hurry at the moment. Hope this was helpful!
I believe you are probably using Semantic Versioning when you create tags. This would be nice thing to mention (how to name your tags).
You should always deploy from detatched heads (tags/commits instead of branches, which have history that can move), because this creates certainty to the deployment process (deployment with static commit hashes, instead of dynamic branches).
Also in robust systems, you should be able to run certain front-end servers with tags of next release and others with the previous release tag; this way your developers can test the actual servers and you can use load-balancers to direct only part of the visitors to the new release.
e.g. When Netflix releases a new version, only 5% of the users are redirected to the cluster which has the new release and rest of the users use the reliable version of Netflix. This way deployment doesn't create cascading problems.
Of course this is a bit too robust for non-critical systems, but the practice of Semantic Versioning and releasing tags instead of branches is easy to adopt, and when things get critical, you are ready.
Hopefully I expressed the ideas clear enough, I am in a bit of hurry at the moment. Hope this was helpful!