“Continuous” is one word that you would often hear again and again in any discussion around DevOps. Almost everything in DevOps is continuous: be it continuous integration, continuous deployment, continuous delivery, continuous testing and so on. Let’s take a closer look at the idea of continuity and why is it so central to the DevOps practice.
Continuous Integration (the principle)
I like to talk about Continuous Integration in a broader sense that aims at integrating the whole system/solution as often and as early as possible. To me, Continuous Integration means that I want to integrate my whole system, while I could have a Continuous Integration server running on individual modules of the system. This also means I want to run integration tests early on and deploy my system into an environment. It also means “integrating” test data early with the system to test as close as possible to the final integration. Really, to me, it means test as far left as possible and don’t leave integration until Integration Test at the end of the delivery life cycle.
Continuous Integration (the practice)
How does Continuous Integration work out in practice? This is probably the most widely known among DevOps practices and is all about compiling/building/packaging your software on a continuous basis. With every check-in, a system triggers the compilation process, runs the unit test, and runs any static analysis tools you use and any other quality-related checks that you can automate. I would also add the automated deployment into one environment so that you know that the system can be deployed. It usually means that you have all code merged into the mainline or trunk before triggering this process off. Working from the mainline can be challenging and often concepts like feature toggles are used to enable the differentiation between features that are ready for consumption and features that are still in progress. This leads to variants where you run Continuous Integration on specific code branches only, which is not ideal, but better than not having Continuous Integration at all.
Continuous Delivery vs. Continuous Deployment
What could be more confusing than having two different practices that are called CD: Continuous Delivery and Continuous Deployment? What is the difference between CD and CD? Have a look at the following diagram:
As you can see, the main practices are the same and the difference is mainly in where to apply automation. In Continuous Delivery, you aim to have the full software delivery life cycle automated up until the last environment before production, so that you are ready at any time to deploy automatically to production. In Continuous Deployment, you go one step further; you actually automatically deploy to production. The difference is really just whether there is an automatic trigger or a manual trigger. Of course, this kind of practice requires really good tooling across the whole delivery supply chain: not just everything that was already mentioned under Continuous Integration, but you will also need to have more sophisticated test tooling that allows you to test all the different aspects of the system (performance, operational readiness, etc.). And to be honest, I think there will often be cases where you require some human inspection for usability or other non-automatable aspects, but the goal is to minimize this as much as possible.
Last, but not the least, is Continuous Testing. To me, this means that during the delivery of a system, you keep running test batteries. You don’t wait until later phases of delivery to execute testing but rather you keep running tests on the latest software build and hence you have real-time status of the quality of your software. And if you use Test-Driven-Development, you have real-time status of progress. This is not very different from the others mentioned above but I like the term because it reflects the diffusion of testing from a distinct phase to an ongoing, continuous activity.
I hope this post was helpful for those of you who were a bit confused with the terms. Reach out to me with your thoughts.