Wat is CI/CD?
Maar wat betekent CI/CD nu? De softwareontwikkeling wereld zit vol met jargon die moeilijk te doorgronden lijkt. Maar eigenlijk is alles gemakkelijk uit te leggen.
CI/CD is een manier om frequent applicaties op te leveren aan klanten. Waarbij bijna alle stappen geautomatiseerd zijn. Je kan dit ook zien als een oplossing voor grote ontwikkelingsteams om de zogenaamde ‘integration hell’ te voorkomen. CI/CD is een oplossing voor problemen veroorzaakt door het integreren van nieuwe code.
Specifiek introduceert CI/CD voortdurende automatisering en monitoring tijdens de levenscyclus van apps. Dit gaat van integratie (integration) en test fases tot aflevering (delivery) en implementatie (deployment). Deze praktijken noemen we vaak ook de ‘ci cd pipeline’. Deze ‘pipeline’ wordt ondersteund door ontwikkelings- en operationele teams die samenwerken op een flexibele manier. Daarbij gebruiken ze een ‘DevOps’ of ‘site reliability engineering’ (SRE) aanpak.
Met een ‘integration hell’ bedoelen we wanneer ontwikkelaars en systeembeheerders niet samenwerken aan de ontwikkeling en levering van een applicatie. Processen worden dan ook niet op elkaar afgestemd.

Wat is het doel nu van CI/CD?
Waarom CI/CD? Het doel van CI/CD is om de code sneller en foutlozer in een hoogpresterende en stabiele productieomgeving te krijgen. Hierdoor verhoogt de productiviteit van ontwikkelaars en heeft de organisatie een voorsprong op concurrenten.
Ci cd is noodzakelijk in organisaties die een Site Reliability Engineering (SRE) aanpak hanteren of met de DevOps-manier werken. Teams die ontwikkelen met cloud-native technologie (zoals Kubernetes of Docker containers) gebruiken ook vaak CI/CD.
Continuous delivery vs continuous deployment
Wat zo verwarrend is aan CI/CD is dat de afkorting vaak verkeerd gebruikt wordt. De ‘CI’ staat bijna altijd voor continuous integration. Maar ‘CD’ kan zowel continuous delivery als continuous deployment betekenen. De inhoud van die twee termen worden soms ook door elkaar gebruikt en dat helpt niet echt. Deze begrippen betekenen dus allebei iets verschillend, maar ze zijn allebei verantwoordelijk voor een verdere levering van de code in de CI/CD pipeline.
Wat is continuous integration?
Continuous integration zorgt ervoor dat ontwikkelaars code kunnen contribueren. Waardoor ze kunnen samenwerken via een gedeelde codebase op een snelle manier. Zonder continuous integration zou het veel moeilijker zijn voor ontwikkelaars om samen te werken. Het samenwerken tussen ontwikkelaars zou meer uit handmatige taken bestaan zonder CI.
Continuous integration helpt developers om hun code wijzigingen terug samen te voegen naar een gedeelde tak, of ‘trunk’. Deze samenvoeging gebeurt meer frequent of zelfs dagelijks dankzij CI. Zonder continuous integration zou alle source code op één dag samen gevoegd moeten worden. Dat zou vervelend zijn, handmatig en zeer tijdsintensief. Wijzigingen van één developer zouden waarschijnlijk niet samenwerken met wijzigingen van een andere developer.
Nadat de developers hun wijzigingen samengevoegd, worden ze automatisch gevalideerd. Daarna kunnen ontwikkelaars de applicatie bouwen en automatisch testen. Dit zijn typische integratie testen om te controleren of de wijzigingen de app niet gebroken hebben. CI maakt het gemakkelijker om snel en vaak bugs te fixen wanneer geautomatiseerde testen een conflict ontdekken.
Continuous integration is gebaseerd op best-practices uit de software development wereld. Deze best-practices omvatten versiebeheer, build automation, automatische tests en automated deployments. Er bestaan tools voor elke discipline, maar er zijn ook CI-tools die veel van deze functies samenvoegen.

Wat is continuous delivery?
Na de automatisering van het bouwen, aanpassen, en testen op bugs in CI, komt continuous delivery. Continuous delivery automatiseert de vrijgave van de gevalideerde code in een code repository (zoals Gitlab of Github). Het is belangrijk dat CI al ingebouwd is in je development pipeline om een doeltreffend voortdurend delivery proces te hebben. Het doel van continuous delivery is om altijd een codebase klaar te hebben staan. Door deze codebase is noodzakelijk voor de deployment naar een productie-omgeving of test-omgeving. Het implementeren van de code is wel vaak nog een handmatige handeling door een systeem expert.
Elke stap in continuous delivery bevat testautomatisering en code release automatisering.
De bedoeling van continuous delivery is om snel en zo foutloos mogelijk code te leveren. Om dan door te sturen naar de productieomgeving of testomgeving. Op het einde van het proces kan het operationeel team snel en eenvoudig een app implementeren om te produceren.
In de praktijk gebruiken ontwikkelaar continuous delivery juist eerder gebruikt om constant een interne testomgeving te updaten. Het wordt veel minder gebruikt om rechtstreeks naar productie te deployen. Er is een beetje teveel focus op continuous delivery naar productiesystemen.

Wat is continuous deployment?
De laatste fase van de CI/CD pipeline is continuous deployment. Bij continuous deployment wordt de code automatisch in de productie-omgeving geïmplementeerd. Dit gebeurt zodra de ontwikkelaar de code ‘released’. Continuous deployment automatiseert het ‘releasen’ van een app naar productie. Continuous deployment rekent op goed ontworpen testautomatisering. Er bevindt zich namelijk geen manuele poort bij deze stap voor de productie fase. Er komt hierbij geen systeem expert meer bij kijken. Natuurlijk zijn er wel eerst de nodige automatische tests en controles. Hierdoor kunnen we zeker te zijn dat er niks stuk gaat tijdens de deployment fase.
In de praktijk betekent dit dat een developer’s wijziging aan een cloud applicatie live kan gaan in een paar minuten nadat het geschreven is. Natuurlijk gaat het door geautomatiseerde testen. Dit maakt het ook veel gemakkelijker om voortdurend feedback van gebruikers te ontvangen en door te voeren. Al deze samenhangende CI/CD praktijken maken deployment minder risicovol. Continuous deployment maakt het ook gemakkelijker om kleine wijzigingen in apps door te voeren, in plaats van alle wijzigingen in één keer.

Waar komen continuous integration, continuous delivery en continuous deployment voor in de CI/CD pipeline?
Continuous integration staat voor het bouwen, automatisch testen en leveren van code aan de juiste code repository. Continuous delivery staat voor het automatisch testen van productieklare code voor code repository. En continuous deployment staat voor het automatisch testen en automatisch leveren van productieklare code naar productie-omgeving. Vaak worden de laatste twee stappen beiden gebruikt of wordt één van de twee gebruikt. CI/CD is meestal een lineair proces. Waardoor we dit vaak een pipeline noemen. De code moet dus dit proces volgen door eerst alle geautomatiseerde integratie tests te ondergaan. Daarna ondergaat het alle delivery-tests en als laatste de deployment tests.

Hoe de praktijken op elkaar betrekking hebben
Om het in het kort uit te leggen, continuous integration is een deel van continuous delivery en van continuous deployment. Je kan ze zien als 2 aparte soorten pipelines waarbij er één stap verschillend is. De building en testing fases van continuous integration komen bij allebei in het begin van de pipeline. Continuous deployment lijkt op continuous delivery, maar de releases gebeuren automatisch. Bij continuous delivery gebeurt de deployment naar productie dus manueel en bij continuous deployment geautomatiseerd.
Wat zijn de voordelen van elke praktijk?
We hebben de verschillen en overeenkomsten van continuous integration, continuous delivery en continuous deployment al bekeken. Hoewel er een duidelijke kost verbonden is aan het implementeren van elke praktijk, wordt het grotendeels overtroffen door hun voordelen. Deze traditionele kost komt vooral van onderhoudskosten van een CI server. Als je werkt met een cloud service die automatisering toevoegt aan repositories kan je de kosten voor een deel reduceren. Hierdoor wordt een configuratie bestand toegevoegd aan de ‘root’ van je repository. Waardoor een continuous deployment pipeline gecreëerd wordt die elke nieuwe wijziging die uitgevoerd wordt naar de ‘main branch’ duwt.
Continuous integration
- Minder bugs in de productie omdat regressies vroeg opgemerkt worden bij geautomatiseerde testen.
- Doordat alle integratieproblemen al vroeg opgelost worden, is de release bouwen zeer gemakkelijk.
- Er wordt minder geswitched van context omdat developers gewaarschuwd worden van zodra er iets breekt. Dit kan snel opgelost worden voor er overgegaan wordt naar de volgende taak.
- Test kosten reduceren dramatisch. Hierdoor kan je CI server honderden testen laten lopen in enkele seconden.
- Je QA team spendeert minder tijd aan testen en hierdoor kunnen ze zich meer focussen op aanzienlijke verbeteringen van de kwaliteitscultuur.
Continuous delivery
- De complexiteit van het implementeren van software is er niet meer. Je team hoeft zich geen dagen voor te bereiden op een release.
- Je kan vaker releasen, waardoor je sneller feedback krijgt en de feedback sneller kan opnemen.
- Er is minder druk op beslissingen voor kleine wijzigingen, waardoor alles sneller gaat.
Continuous deployment
- Je kan sneller implementeren, want het is niet nodig om development te pauzeren voor releases. Deployment pipelines worden getriggerd om elke wijziging automatisch door te voeren.
- Releases brengen minder risico’s voort. Problemen zijn ook gemakkelijker op te lossen omdat je werkt met een aantal kleine wijzigingen per release.
- Je klanten zien een voortdurende stroom van verbeteringen. Ze zien dat de kwaliteit elke dag toeneemt, in plaats van elke maand of jaar.
Hoe werkt CI/CD?
Vaak werken er meerdere ontwikkelaars tegelijkertijd aan een applicatie. Soms kunnen we niet anders dan de code toevoegen aan de productieomgeving. Dit is beter gekend als ‘mergen’. Dit kan een vervelend, handmatig proces zijn omdat er bij elke wijziging problemen kunnen ontstaan.
Er kunnen problemen ontstaan op het gebied van gepersonaliseerde ‘integration development environments’ (IDE) en versiebeheer.
Door met CI te werken, hoeven er geen ‘merge’ dagen meer te zijn om alle code wijzigingen samen te voegen. Het committen van code gebeurt frequent en continu met CI. Alle wijzigingen worden automatisch gecheckt zodat de nieuwe code de applicatie niet stuk maakt. Fouten zijn ook gemakkelijk op te lossen omdat CI-software toont waar de fout zit. Teams kunnen ook sneller microservices ontwikkelen omdat zelfs kleine stukken code kunnen worden toegevoegd.
Als de geleverde code aankomt bij continuous delivery, wordt de geleverde code nogmaals gecheckt. Ook hier worden diverse tests uitgevoerd en worden de fouten automatisch aangetoond.
De laatste volwassenheidsfase van CI/CD is continuous deployment. De code gaat zonder menselijke tussenkomst direct naar de productieomgeving. Daarom is het belangrijk dat de automatische testen zeer goed ontworpen zijn. De ontwikkelaar kan in enkele minuten de wijzigingen zien in de productieomgeving.

Populaire CI/CD tools
Er zijn verschillende tools voor ontwikkelingsteams die met CI/CD willen werken. Sommige tools richten zich alleen op de integratie zijde, andere alleen op de development en deployment zijde. Zo zijn er volledige CI/CD tools, continuous integration tools, continuous delivery tools en continuous delivery tools. Een andere optie is continuous testen of gerelateerde functies.
Jenkins
Eén van de best gekende open source tools voor ci cd is de automatisatie server Jenkins. Jenkins CI/CD is op Java gebaseerd. Met Jenkins kunnen ontwikkelaars snel en automatisch code toevoegen aan software zoals webapplicaties. Jenkins is ontwikkeld om alles te kunnen hanteren van simpele ci servers tot complete CD hubs. Voor veel mensen is dit de standaard voor CI.

Gitlab CI/CD
Gitlab is gekend als een code repository. Maar binnen Gitlab zit ook een ingebouwde tool voor CI CD. Deze tool is redelijk uitgebreid.

Github Actions
Github Actions is een nieuwere maar snel populair wordende functionaliteit in github. Dit maakt het gemakkelijk om je software workflows te automatiseren. Github Actions heeft world-class CI/CD. Met Github Action bouw, test en deploy je code rechtstreeks van Github.
Kubernetes
Dit populaire platform is technisch gezien geen CI/CD tool, maar het werkt wel bijzonder goed met veel CI/CD workflows. Kubernetes biedt een standaard cloud-native CI/CD ervaring met containers aan. Cloud-native ontwikkelingsteams die te maken hebben met grote hoeveelheden workloads gebruiken ook veel kubernetes CI/CD.
Tekton pipelines wordt vaak gebruikt als een framework voor Kubernetes platforms.
Azure pipelines
CI/CD azure pipelines is een relatief nieuwe speler. Hun software is een onderdeel van de Azure DevOps stack en is in staat om ci cd onderdelen te automatiseren. Het is vooral geschikt voor cloud-native ontwikkelingsteams.
Andere interessante CI/CD tools zijn Spinnaker, GoCD, Concourse, Srewdriver, CircleCI, Travis CI, Atlassian Bamboo, Ansible, Chef, Puppet, Docker, rkt en cri-o.

Wat hebben wij te maken met CI/CD?
Als innovatieve software ontwikkelaar kunnen wij ook werken met een CI/CD pipeline voor de ontwikkeling van webapplicaties. Hierdoor profiteren onze klanten ook van alle voordelen die beschreven zijn in ons artikel.
Wij werken met Gitlab CI/CD en Github Actions. We willen op termijn alles overzetten naar Github Actions. Verder draaien wij praktisch al onze applicaties containerized in Docker (zeer gelijkaardig aan Kubernetes) wat het veel makkelijker maakt om aan CI/CD te doen.
We hebben drie omgevingen binnen BlueBlazer voor onze projecten. In de ‘Testing’ omgeving komt automatisch alle code. Dit is voor de programmeurs om samen te kunnen werken.
Dan komt de ‘Staging’ omgeving. Hier mag enkel code komen die gevalideerd is op ‘Testing’. Er is dus nog een manuele “OK” nodig om op staging te komen. Maar de rest van het proces gebeurt automatisch.
Ten laatste is er de ‘Production’ omgeving. Hier is altijd een manuele stap nodig na goedkeuring, van QA en Management. Eenmaal de goedkeuring er is kan de deploy volledig automatisch gebeuren.
Lees meer over onze webapplicaties. Heb je nog vragen over CI/CD? Of brengt dit artikel je op ideeën? Neem contact met ons op. We leggen graag uit wat BlueBlazer voor jouw bedrijf kan betekenen.
Lees meer over CI/CD: https://blog.econocom.be/nl/infrastructure/ci-cd-agile-werken-naar-een-volgend-niveau
Meer weten over dit artikel?