I'm looking for suggestions on how to modernise my development/release practices by potentially introducing some automation. I'll outline the current process to help explain why I'm currently struggling.
We have 2 long life branches, master and staging. Live servers point to the master branch and our test/staging servers point to the staging branch.
We have 2 different types of short life branches, fix/ and feature/. We label our branches fix/X and feature/X depending on whether it's a bug or a story being developed, where X is the id of the relevant ticket. These short life branches are only ever created from master, never from staging.
When a developer has finished working on their branch, it tested in isolation locally and then peer reviewed by another developer. Once it has passed peer review, it is merged into the staging branch which is then pulled on to the staging servers. Once it has moved into the staging branch it is then tested by a QA.
Releases are scheduled by a product manager for particular dates so that we're able to compile release notes and update customers before changes are made. To release, I spend a considerable amount of time opening each ticket, merging the fix/feature branch into master, before running a pull on each of the live servers.
If during testing, a problem is found with one of the features/fixes, we use GitHub to revert the pull request and remove the offending code from the staging branch.
Earlier I mentioned that we only create branches using master as a base, never from staging. This is because we merge un-tested code into staging for it to be tested alongside other fixes/features. So if we were to merge feature/A into staging, then branch from staging to work on fix/B, to later realise feature/A was not working correctly then we would also have to remove the code in feature/A from fix/B*. This then means that releases of 20+ tickets involve a lot of time spent merging individual branches into the master branch, rather than just merging staging into master.
I've looked into different flows and CICD applications etc, but I'm struggling to see how to implement them into our current process without completely altering the way we work.
The main pitfall that I'm looking to overcome is having to manually merge an entire release worth of branches (often in the 20's) into master on release day. It's time consuming and often-times conflict ridden.