I got inspired by a similar question on the Stackoverflow.com and after reading what Martin Fowler has written
(and Jez Humble, of course at http://continuousdelivery.com/), I still struggle to understand the difference, or the border line, between continuous integration and continuous delivery.
Let’s assume there is a simple system with a front-end interface. Each commit to Git causes the integration machine to build the project, run both unit and integration tests and notify about the result.
And now – the app gets deployed to a test environment so as to perform QA activities by QA guys. Is that continuous delivery? If not, why?
I can see a lot of contradicting information in the literature.
Continous delivery (CD from now on)
Each commit to GIT causes the integration machine to build the
project, run both unit and integration tests and notify about the
result. And now – the app gets deployed to a test environment so as to
perform QA activities by QA guys. Is that continuous delivery?
The case you expose might not be considered CD
Companies like mine use Jenkins (CI tool) to automate the process of performing unit tests, packaging and deployment in test servers after Git commits. But this is quite far to be CD. It just serves us to save time and keep the wheel (QA or other dev teams) moving on.
CD is an strategy applied to software lifecycle. To the whole lifecycle
It has by main goal to reduce costs times and risk. How? Producing software in short cycles, performing test, builds and releases frequently.
Frequent deployments on production (release) demands flexebility at delivery management. What it’s intended is to release bugs fixs/upgrades/updates anytime. As straightforward as possible. Moreover, by any member of the team.
Other reasons behind CD: high availability is needed (by critical systems) or continous feedback from users (or customer) is wanted.
Back to the question: Should Continous Integration do deployments on environments?
Answer: We are mixing concepts.
CI is related to make periodic the process of compiling and testing, in order to garantee the stability of the code during its life time. Happens here that CI tools are also capable to perform deployments. But such “capability” (being dogmatic) is not related to CI.
However It’s a good way to say: “I can be used as tool for deployments if you need to automate deployments”.
As we pointed CD aims at building and test frequently. Here is where CI shinnes. It automate such task.. But the task itself is just a part of the lifecycle.
Is that continuous delivery?
No. Continuous delivery is a practice. It’s a way of developing software. It isn’t something that can be automated although there are automatic tools designed to support it.
CD is about how the software is written – in CD each commit is intended to produce a deliverable version of the software.