# Continuous delivery

Continuous delivery (doorlopende levering) is een softwareontwikkelmethode die gericht is op ideeën zo snel en efficiënt mogelijk in productie te krijgen. Hierdoor kunnen businessaannames snel bij de klant worden gevalideerd om zo op een kortcyclische wijze een product vorm te geven. Functionaliteit en ideeën kunnen op deze manier de consument vele malen sneller bereiken dan gebruikelijk is bij de oude watervalmethode. Het continuousdeliveryproces richt zich op het sturen van een continue stroom van nieuwe functies naar productie, en stapt daarmee in feite af van de oude 'releasegedachte'.

## Inleiding

Bij menig organisatie is het uitrollen van software een tijdrovende, stressvolle en bovenal kostbare klus. Wanneer software eenmaal in productie is, komen vaak nog fouten boven water die een nieuwe uitrol noodzakelijk maken. Een onrustige vicieuze cirkel onder druk. Een uitrol voelt voor veel organisaties aan als een onbetrouwbare en risicovolle handeling.

## Principes

Om continuous delivery in te voeren dient er niet alleen op technisch vlak te worden geoptimaliseerd, maar ook op organisatorisch vlak. De organisatie moet de continue manier van werken namelijk wel kunnen bijhouden. Invoering van continuous delivery gaat dan vaak ook gepaard met invoering van agileteams en een DevOps-structuur die de kloof tussen ontwikkeling en uitwerking dient te dichten.
Om op een continue basis nieuwe software in productie te kunnen plaatsen dient het softwaredeliveryproces compleet herhaalbaar en betrouwbaar te zijn uitgevoerd. Alle betrokkenen bij het proces dienen namelijk het volledige vertrouwen te hebben dat de software, na toevoeging van een nieuwe feature, in productie foutloos zal blijven draaien.
Dit gebeurt onder ander door het hanteren van de volgende principes:

### Automatiseer alles

    Om in een continue stroom features en/of veranderingen van hoge kwaliteit te kunnen leveren, dienen alle stappen in het opleverproces te worden geautomatiseerd. Er is geen tijd en ruimte voor handmatige stappen en fouten van handmatige aard mogen in het proces niet meer voorkomen. Handmatige aanpassingen zijn in een continuous delivery omgeving taboe.

### Als het pijn doet, doe het vaker

    Lastige, tijdrovende of foutgevoelige taken in het deliveryproces dienen vaker te worden uitgevoerd. Door deze taken vaker uit te voeren krijgt men eerder feedback over de ware aard van het probleem en wordt het probleem ook daadwerkelijk aangepakt.

### Done is live

    Een stukje code/feature op de machine van de ontwikkelaar, op de buildserver of in de testomgeving is totaal niet waardevol. De feature levert pas waarde op op het moment dat het daadwerkelijk in productie staat. Het team is dus pas klaar als alle code ook echt in productie staat. Tot die tijd wordt er geen nieuw werk opgepakt. Aanmaak van achterstallig onderhoud wordt hiermee vermeden.

### Bouw kwaliteit in

    Wanneer nieuwe features op een continue basis productie kunnen bereiken, dienen alle betrokkenen het vertrouwen te hebben dat deze verbeteringen ook echt zullen werken. Dit betekent dat in het deliveryproces voldoende effectieve kwaliteitscontroles dienen te worden ingebouwd. Zo dienen geautomatiseerde testen vanaf het begin af aan te worden toegepast.

### Voer continu verbeteringen door

    Een continue stroom van features en aanpassingen genereert een continue stroom van terugkoppeling. Deze terugkoppeling laat zien wat vaker moet gebeuren (omdat het het proces positief beïnvloedt) of wat vermeden zou moeten worden. Het team dient zich hiermee integraal te richten op verbetering van het geautomatiseerde proces en de software.

### Het hele team draagt verantwoordelijkheid voor het product

    Iedereen in het team is volledig verantwoordelijk voor het product in productie. Dat zijn dus ontwikkelaars, operators, testers, managers, etc. Iedereen, dus ook de ontwikkelaar, is pas klaar als het product in productie draait. Dit dwingt het team zich te richten op het verbeteren van het totale leveringsproces en daarmee het eindproduct.

## Automatisering

Een deel van de oplossing bestaat uit het automatiseren van het build-, test-, deployment- en provisioningproces, waardoor processen niet alleen sneller, maar ook betrouwbaarder kunnen worden uitgevoerd. Concreet betekent dit:
* Versiebeheer: Alle code en configuraties komen onder versiebeheer.
* Geautomatiseerde builds: Het compileren en samenvoegen van code gebeurt op een centrale plek en is volledig geautomatiseerd.
* Geautomatiseerde tests: Testen worden in alle fases geautomatiseerd uitgevoerd en vormen een integraal onderdeel van het ontwikkelproces.
* Deploymentautomatisatie: Applicaties worden volledig geautomatiseerd en end-to-end op een of meerdere omgevingen geplaatst.
* Provisioning: Serveromgevingen kunnen met een druk op de knop worden opgebouwd en weer worden afgebroken.

## Organisatie

Door op zoveel mogelijk niveaus op een behendige manier te werken kunnen teams zelf op een continue basis vernieuwing leveren. Dit geldt niet alleen voor het ontwikkelteam, ook de business en operations hebben baat bij een dergelijke organisatie van teams. Devops wordt verder vaak gebruikt om de ouderwetse ‘kloof’ tussen ontwikkeling en verrichtingen te overbruggen.

## Educatie

Op internet zijn al veel publicaties over dit onderwerp verschenen. Een van de bekendere boeken betreffende dit onderwerp is geschreven door Jez Humble, genaamd: Continuous delivery: reliable software releases through build, test, and deployment automation, ISBN 978-0-321-60191-9