Continuous Integration

Wat is Continuous Integration

Continuous Integration of CI, is een praktijk waarbij developers continu hun eigen geschreven code terug integreren met de code uit een centraal repository. Voor elke integratie wordt opnieuw het software build proces gestart, om zo fouten zeer vroeg te kunnen detecteren.

Het is belangrijk om een goede methode te vinden voor deze continue integratie van de code. Git flow (uitgelegd onder Version Control) is een goede methode die toelaat om code integratie gemakkelijk uit te voeren. Meermaals kan de developer een rebase uitvoeren op zijn eigen feature branch om zo nieuwe code te integreren met eigen code die ontwikkeld wordt in zijn feature branch.

Testing

Continuous Integration kan alleen goed werken wanneer de developers ook tests schrijven om de code te testen. Bij elke integratie van de code moet namelijk ook het hele buildproces van de applicatie doorlopen worden en dienen alle tests uitgevoerd te worden om na te gaan of de nieuwe aanpassingen geen nieuwe fouten heeft geïntroduceerd. Er zijn verschillende soorten testen die geschreven kunnen worden. De meest bekende types zijn:

  • Unit Test: een test voor het kleinst mogelijk stuk code dat te testen valt
  • Integration Test: een test die verschillende componenten samen neemt en nagaat of deze werken wanneer ze gecombineerd zijn
  • System Test: een test die test of alle componenten tezamen werken wanneer ze gecombineerd zijn
  • Acceptance Test: een test die ervoor moet zorgen dat de software “as designed” werkt, beschreven zoals de klant of eindgebruik het wenst
  • Regression Test: een test die geschreven wordt wanneer er een bug opgelost wordt, om ervoor te zorgen dat dezelfde bug later niet opnieuw opduikt

Continuous Integration Software

Eerst en vooral moet er voor gezorgd worden dat het buildproces niet meer uit manuele stappen bestaat. Het buildproces dient hetzelfde te zijn voor zowel developers als voor de software die het buildproces automatisch zal uitvoeren wanneer nieuwe features ontwikkeld worden. Typisch wordt gebruik gemaakt van build tools. Deze build tools gaan de nodige dependencies (afhankelijke modules) downloaden, de applicatie build uitvoeren, en alle testen uitvoeren. Afhankelijk van welke programmeertaal gebruikt wordt, zullen andere build tools gebruikt worden.

Eenmaal duidelijk is hoe het buildproces er uit ziet, kan het buildproces geautomatiseerd worden met de geschikte software. Enkele bekende software tools hiervoor zijn:

  • Jenkins
  • Atlassian Bamboo
  • JetBrains TeamCity

Er zijn ook bedrijven die CI services aanbieden. Enkele bekende zijn:

  • CircleCI
  • Travis CI
  • Codeship
  • Wercker

Afhankelijk van welke programmeertaal gebruikt wordt om de applicatie te ontwikkelen, en afhankelijk van welke build tools gebruikt worden, zal de automatisatie er verschillend uitzien. De workflow zal echter vaak gelijkaardig zijn. Dit is een voorbeeld van een workflow:

_images/ci-1.png

Het is belangrijk om zo snel mogelijk te weten te komen wanneer er een nieuwe commit beschikbaar is op een branch, want bij elke commit kan er een nieuw build proces (inclusief tests) gestart worden. Indien de tests niet slagen, dan moet de developer zo snel mogelijk automatisch op de hoogte gebracht wordt, zodat deze zijn code kan aanpassen.

Pull Requests kunnen afgedwongen worden in plaats van de developer toe te laten om zelf een merge uit te voeren vanaf zijn feature branch op develop. De commits van een Pull Requests mogen alleen maar samengevoegd worden met de develop branch wanneer alle testen uitgevoerd werden en geen enkele test gefaald is.

_images/contact-in4it.png