Bij het gebruik van Pipelines worden er enerzijds static code cans gedaan bij elke (code) wijziging en worden er anderzijds automatische tests uitgevoerd. Pipelines zorgen voor een hogere kwaliteit en stabiliteit door automatische tests, minimaliseren de downtime tijdens een deployment en maken inzichtelijk welke functionaliteiten (Jira-taken) op welke omgeving beschikbaar zijn.
Het gebruik van Pipelines biedt de volgende voordelen:
Pipelines biedt een basis voor een test-suite (automatische testen) waarbij functionaliteiten worden getest voordat een code-wijziging wordt doorgevoerd [1];
Pipelines biedt de mogelijkheid voor Pipeline deployment waardoor er tijdens een deployment geen downtime is [2];
Doordat een Pipeline Deployment sneller is afgerond dan een reguliere deployment is het makkelijker om meerdere kleinere deployments uit te voeren en bijvoorbeeld één of twee features live te zetten;
Pipelines biedt een basis om op basis van Cypress.io automatische weergave testing en functionele front-end tests toe te voegen;
Pipelines biedt de mogelijkheid om security-patches zonder downtime live te zetten;
Bij het gebruik van Pipelines is in Jira te zien welke functionaliteiten / tickets live staan (zie afbeelding verderop deze pagina).
Toelichting:
Bij elke code-wijziging die wordt uitgevoerd wordt een aantal automatische taken uitgevoerd. In het kort werkt dit proces als volgt:
Er wordt code geschreven om een functionaliteit toe te voegen;
Op het moment dat de (nieuwe) code wordt samengevoegd met de bestaande code wordt deze code op basis van een static code scan “beoordeeld” en worden er daarnaast automatische tests uitgevoerd.
Wanneer zowel de code scan als de automatische tests succesvol zijn uitgevoerd wordt de code samengevoegd.
Het testen gebeurt op basis van een aantal basis-tests (bijvoorbeeld het aanmaken van een account of het plaatsen van een order) en kan worden uitgebreid met elke (maatwerk)functionaliteit die aan de webshop is toegevoegd.
Schematische weergave pipelines binnen een proces:
Een standaard deployment proces werkt als volgt:
De webshop wordt in onderhoudsmodus gezet;
Nieuwe modules/functionaliteiten worden gedownload en geïnstalleerd;
De front-end wordt opnieuw opgebouwd (hoe meer thema’s en talen er zijn, hoe meer tijd dit proces in beslag neemt);
De webshop wordt weer beschikbaar gemaakt.
Binnen Pipelines kan worden ingesteld dat zodra de Pipeline succesvol is afgerond deze wordt gedeployed naar de productie-omgeving. Omdat de techniek van een deployment op basis van Pipelines anders werkt dan bij “normale” deployment of Fast Deploy heeft een Pipeline deployment geen downtime.
Bij gebruik van Pipeline Deployment is binnen Jira te zien welke functionaliteiten op de staging zijn aangeboden en welke functionaliteiten live staan. Hiervoor bestaan twee weergaven:
1. Filter "Deployed to production" onder de quick filters
Tussen de quick filters in de sprint en de backlog vind je een knop "Deployed to production". Wanneer je hierop filtert, kun je zien welke taken (met een code-wijziging) zijn doorgevoerd naar de productie-omgeving.
2. Weergave tabblad "Deployments"
In Jira vind je een tab "Deployments" waarin je kunt zien welke taken op welke omgeving omgeving beschikbaar zijn. In het voorbeeld hieronder zie je dat bijvoorbeeld taak 4 op productie staat, taak 5 op de staging staat en taak 6 op de development-omgeving staat.
Binnen een automatische test bestaan er meerdere typen testen: Static Code Scans, Unit Tests en Integration Testst.
Static Code Scan: scan/test die controleert of de code overeenkomt met de de standaarden. Deze scan geeft antwoord op de vraag “Zitten er geen gekke dingen in de code?”
Een gefaalde code scan betekent niet dat de code niet werkt of verkeerd geschreven is. Een gefaalde scan geeft aan dat er betere of meer toekomstbestendige manieren zijn om een functionaliteit toe te passen en risico's te reduceren. Concreet betekent dit dat de code moet worden aangepast naar toekomstbestendige oplossing, maar dat deze code geen acuut probleem veroorzaakt.
Unit Test: scan/test die controleert of de in een module beschreven testen succesvol kunnen worden uitgevoerd.
Een gefaalde unit test betekent niet dat er direct een issue is. De gefaalde test geeft wel aan dat een geschreven test niet kan worden uitgevoerd. Hoe meer unit tests zijn toegevoegd, hoe stabieler de webshop en hoe kleiner de kans op incidenten. Dat houdt in dat er in een module de verwachte output wordt beschreven als test en bij elke code-wijziging wordt gecontroleerd of deze output werkt zoals verwacht.
“Unit tests tell a developer that the code is doing things right; functional tests tell a developer that the code is doing the right things.”
Integration Tests: scan/test die een volledige functionaliteit of flow kan controleren. Denk hierbij aan het aanmaken van een product via de API, het plaatsen van een order of het creëren van een klant-account. Deze functionaliteiten zijn dan weer te combineren met specifieke functionaliteiten binnen de webshop (bijvoorbeeld een verzendmethode die enkel van toepassing is voor een specifiek land).
Een gefaalde integration test geeft aan dat een functionaliteit niet werkt zoals verwacht.
Deployment: live zetten van wijzigingen
Pipeline: techniek om nieuwe functionaliteiten in de webshop (automatisch) te testen en live te zetten. Het proces bestaat uit een test-suite en een deployment process.
Pipeline test-suite: verzameling van (automatische) tests die worden uitgevoerd binnen een pipeline. Deze testen bestaan uit generieke tests en tests die specifiek voor een functionaliteit worden toegevoegd.
Pipeline deployment: techniek om een deployment automatisch (en met zero downtime) uit te voeren.
Configuratie-bestand aanmaken (bitbucket-pipelines.yml)
Zorgen dat de pipeline kan worden afgerond en er geen gefaalde tests zijn
Pipeline deployment inrichten
Het inrichten van een pipeline deployment kun je een beetje vergelijken met een Magento-shop: er is een gezamenlijke basis die voor al onze webshops geldt en dat kun je uitbreiden met specifieke onderdelen die voor een specifieke shop relevant is. Algemene tests zijn:
Installatie van modules;
Controle of het mogelijk is om via de API een token aan te maken (noodzakelijk voor koppelingen);
Static Code Scan op basis van de Magento coding standaard;
Integration tests voor de modules waar deze test aan is toegevoegd.
Zodra er gebruik wordt gemaakt van Pipeline Deployment kunnen we in beeld brengen welke (extra) tests relevant kunnen zijn en een plan en inschatting voor deze tests maken. Daarnaast is het mogelijk om voor (complexe) nieuwe functionaliteiten een test toe te voegen. Elke tests is optioneel; het is dus nooit "verplicht" een test voor een nieuwe functionaliteit te schrijven (maar dit is wel sterk aan te raden).
Deze status is inzichtelijk zodra Pipeline Deployment is ingericht. Vanaf dat moment is de status in te zien onder het kopje “Development”.
Daarnaast kun je - vanaf dat moment - ook op taak-niveau zien of een feature beschikbaar is op de staging- of productie-omgeving.
Bij Fast Deploy wordt de nieuwe versie van de front-end in een tijdelijke map voorbereid. Bij Pipeline Deployment wordt de volledige deploy voorbereid en getest.
Daarnaast is het bij Fast Deploy zo dat wanneer er een nieuwe module geïnstalleerd wordt of wijzigingen in de database komen er alsnog downtime kan zijn (wat ongeveer een minuut kan zijn). Bij pipeline deployments is er alleen een korte downtime als er wijzigingen in de database komen. De downtime dan is ook een stuk korter (max 30 seconden).
Een pipeline voert zelf geen front-end tests uit, maar kan wel worden gebruikt als basis voor Cypress front-end testing.