What is more frustrating than having weekly, quarterly or even annually releases for new features, knowing that your new business idea will be outdated even before it hits the crowd?
In this article, I will highlight 3 of the most important aspects for making your deployment faster and more enjoyable for you, your team and ultimately your business or organization.
1. Reduce friction: Make each commit deployable
Whenever there is a commit pushed to the upstream master, it should be built using a CI server, like Jenkins, and if it passes all required tests, it should be made available for deployment so you can deploy it separately from everything else. This means that you should stop releasing feature branches which deviates from the master branch, and requires additional coordination. Your master branch needs to be stable and should potentially be deployable at any time.
The deployment pipeline should look something like the following:
With this pipeline, you will also get an overview of the state your app for all environments. Pretty handy, right? This is something you can build yourself to maximize customization, or use an existing solution like Spinnaker or Jenkins Pipeline which is stable and used by many big companies.
2. Deploy confidently: Use feature toggles
Whenever you release your software changes continuously, there is a certain risk of introducing a new bugs or fatal errors. This is not something you should be afraid of, or try to avoid. Failures do occur in larger and more complex software systems, and nowadays it is important to know how to handle such situations.
A feature toggle is a way to activate or deactivate parts of your code; a function, parts of a function or just one line of code.
There are several good open source alternatives for feature toggling, like Unleash, which provides you with a neat interface, local caching of toggles in case of network problems and clients for Java, Node.js and Go.
3. Verify: Monitor your changes
Rather than making sure your app is 100% foolproof in every aspect, be it latency, load and anomalies, you should have some sort of error monitoring in place in case a change causes problems. The issue with making something 100% foolproof is that it will increase the time it takes to deploy, because of manual tasks, or slow tasks, such as stress tests or integration tests, which is what you need to avoid at all costs unless it’s a very special component.
Also being able to dig in app logs through a search tool such as Kibana is a must.
The idea behind fast deployment is to reduce the friction at every checkpoint when you need to deploy, and being able to deploy one single commit whenever the timing is right. Also, being confident that your deployment does not break production by using feature toggles is a great improvement over not deploying at all. Lastly, you need to monitor your apps’ behavior to catch errors and let the ones responsible deal with it.