Close

Hoe je aan de slag kunt met DevOps

Een stapsgewijze handleiding voor teams die DevOps willen implementeren

Profielfoto van Krishna Sai
Warren Marusiak

Senior Technical Evangelist


Is de levenscyclus van je softwareontwikkeling een verwarrende puinhoop van tools en workflows? Werken je teams en projecten in silo's? Als je op een van deze vragen ja hebt beantwoord, is dat een goed moment om DevOps te overwegen. DevOps helpt bij het vereenvoudigen en optimaliseren van workflows voor ontwikkeling en implementatie door een nieuw ecosysteem voor softwareontwikkeling aan te maken.

Maar hoe implementeer je DevOps? Een van de grootste uitdagingen van DevOps is dat er geen standaardproces is, aangezien elk team andere behoeften en doelen heeft. Alleen al het grote aantal DevOps-tools en -bronnen kan leiden tot 'analyseverlamming', wat de implementatie ervan belemmert. De volgende stappen kunnen je team helpen om DevOps te implementeren.

Waarom DevOps?


Het korte antwoord is dat DevOps de productiviteit verhoogt doordat ontwikkelaars kunnen doen waar ze goed in zijn: fantastische software ontwikkelen in plaats van minder belangrijk werk uitvoeren, zoals het handmatig controleren van logbestanden. DevOps-praktijken automatiseren repetitief werk, zoals het uitvoeren van tests en implementaties, het controleren van productiesoftware op problemen en het ontwikkelen van een probleembestendige implementatiemethode. Ontwikkelaars zijn in staat om te ontwikkelen en te experimenteren, wat leidt tot hogere productiviteit.

Er zijn veel definities voor DevOps. In dit artikel betekent DevOps dat een team eigenaar is van de volledige levenscyclus van software. Een DevOps-team ontwerpt, implementeert, implementeert, monitort, lost problemen op en werkt software bij. Het is eigenaar van de code en de infrastructuur waarop de code draait. Het is niet alleen verantwoordelijk voor de ervaring van eindgebruikers, maar ook voor productieproblemen.

Een van de principes van DevOps is om een proces te ontwikkelen dat problemen aan kan zien komen en ontwikkelaars in staat stelt om daar effectief op te reageren. Een DevOps-proces moet ontwikkelaars onmiddellijk feedback geven over de gezondheidsstatus van het systeem na elke implementatie. Hoe sneller het probleem wordt ontdekt, hoe kleiner de impact ervan is en hoe sneller het team door kan gaan naar het volgende project. Ontwikkelaars kunnen experimenteren, nieuwe ideeën ontwikkelen, vrijgeven en uitproberen wanneer het eenvoudig is om wijzigingen door implementeren voeren en problemen op te lossen.

Wat DevOps niet is: technologie. Als je DevOps-tools koopt en het DevOps noemt, dan is dat het paard achter de wagen spannen. De essentie van DevOps is het opbouwen van een cultuur van gedeelde verantwoordelijkheid, transparantie en snellere feedback. Technologie is gewoon een hulpmiddel dat dit mogelijk maakt.

logo van organisatie
gerelateerd materiaal

Gratis aan de slag

Pictogram wedstrijdbeker
gerelateerd materiaal

Meer informatie over best practices voor DevOps

Een disclaimer


Aangezien elk team een uniek beginpunt heeft, zijn sommige van de volgende stappen mogelijk niet van toepassing. Bovendien is deze lijst niet volledig. De stappen die hier staan, zijn bedoeld als beginpunt om een team te helpen DevOps te implementeren.

In dit artikel wordt DevOps gebruikt als verzamelnaam voor de cultuur, processen en technologieën die ervoor zorgen dat DevOps werkt.

DevOps in 8 stappen


DevOps Loop

Stap 1 - Kies een component

De eerste stap is om klein te beginnen. Kies een component dat momenteel in productie is. Het ideale component heeft een eenvoudige codebasis met weinig afhankelijkheden en een minimale infrastructuur. Dit component zal een proefterrein zijn waar het team ervaring op kan doen met het implementeren van DevOps.

Stap 2 - Denk er over na om een agile methodologie toe te passen, zoals scrum

DevOps werkt vaak samen met een agile werkmethode, zoals scrum. Het is niet nodig om alle rituelen en praktijken toe te passen die geassocieerd zijn met een methode zoals scrum. Drie elementen van scrum die over het algemeen gemakkelijk toe te passen zijn en snel waarde opleveren, zijn de backlog, de sprint en de sprintplanning.

Een DevOps-team kan werk aan een scrumbacklog toevoegen en hier aan prioriteiten stellen en vervolgens een deel van dat werk in een sprint opnemen, een vaste tijdsduur om een specifiek project te voltooien. Sprintplanning is het proces waarbij wordt bepaald welke taken van de backlog naar de volgende sprint gaan.

Stap 3 - Bronbeheer op basis van GIT gebruiken

Versiebeheer is een best practice voor DevOps om betere samenwerking en snellere releasecycli mogelijk te maken. Met tools zoals Bitbucket kunnen ontwikkelaars software delen, er aan samenwerken, het samenvoegen en er een back-up van maken.

Kies een branching-model. Dit artikel geeft een overzicht van het concept. GitHub flow is een goed beginpunt voor teams die nieuw zijn bij Git, omdat het eenvoudig te begrijpen en te implementeren is. Trunk-gebaseerde ontwikkeling krijgt vaak de voorkeur, maar vergt meer discipline en maakt de eerste kennismaking met Git moeilijker.

Stap 4 - Integreer bronbeheer met het bijhouden van werk

Integreer de tool voor bronbeheer met de tool voor het bijhouden van werk. Door op één plek overzicht te kunnen houden op alles wat met een bepaald project te maken heeft, kunnen ontwikkelaars en management een aanzienlijke hoeveelheid tijd besparen. Hieronder staat een voorbeeld van een Jira-issue met updates vanuit een op Git-gebaseerde repository voor bronbeheer. Jira-issues omvatten een ontwikkelingssectie waarin het werk samen wordt gevoegd dat is verricht voor de Jira-issue op het gebied van bronbeheer. Deze issue had één branch, zes commits, één pull-aanvraag en één build.

Schermafdruk van de integratie van bronbeheer met het bijhouden van werk

Meer informatie kan je vinden in de ontwikkelingssectie van een Jira-issue. Het tabblad Commits bevat een lijst van alle commits die verband houden met een Jira-issue.

Schermafdruk van de integratie van bronbeheer met het bijhouden van werk

Dit gedeelte bevat alle pull-aanvragen die verband houden met de Jira-issue.

Schermafdruk van de integratie van bronbeheer met het bijhouden van werk

De code met betrekking tot deze Jira-issue wordt geïmplementeerd in alle omgevingen die worden vermeld in de sectie Implementaties. Deze integraties werken meestal door de Jira-issue-ID — in dit geval IM-202 — toe te voegen aan commit-berichten en branchnamen van werkzaamheden die verband houden met de Jira-issue.

Schermafdruk van de integratie van bronbeheer met het bijhouden van werk

Er is een tabblad met codes dat links biedt naar alle opslagplaatsen voor bronbeheer die gerelateerd zijn aan het project. Dit helpt ontwikkelaars de code te vinden waaraan ze moeten werken wanneer ze zichzelf aan een Jira-issue toewijzen.

Schermafdruk van de integratie van bronbeheer met het bijhouden van werk

Stap 5 - Testen schrijven

CI/CD-pipelines moeten worden getest om te valideren dat de code die in verschillende omgevingen wordt geïmplementeerd, correct werkt. Begin met het schrijven van unittests voor de code. Hoewel het een ambitieuze doelstelling is om 90 procent codedekking te hebben, is dit in het begin niet realistisch. Stel een lage basismeting in voor de codedekking en verhoog geleidelijk de lat voor de dekking van unittests. Je kunt werkitems aan de backlog toevoegen om dit aan te pakken.

Gebruik testgestuurde ontwikkeling om bugs in de productiecode op te lossen. Als je een bug ontdekt, schrijf dan unittests, integratietests en/of systeemtests die niet werken in omgevingen waar de bug zich voordoet. Los dan de bug op en kijk of de tests nu wel slagen. Dit proces zal op organische wijze de dekking van de code na verloop van tijd vergroten. Als de bug werd ontdekt tijdens een test of in een testomgeving, zullen de tests erop wijzen dat de code naar behoren werkt wanneer deze naar productie wordt bevorderd.

Als je vanaf het begin begint, is deze stap arbeidsintensief, maar wel belangrijk. Door tests kunnen teams zien wat het effect is van codewijzigingen op het gedrag van het systeem voordat ze eindgebruikers blootstellen aan die codewijzigingen.

Unittests

Unittests bevestigen dat de broncode juist is en moeten als een van de eerste stappen in een CI/CD-pipeline worden uitgevoerd. Ontwikkelaars zouden tests moeten schrijven voor het groene pad, problematische invoer en bekende hoekgevallen. Bij het schrijven van de tests kunnen ontwikkelaars de inputs en verwachte outputs namaken en uitproberen.

Integratietests

Integratietests verifiëren dat twee componenten correct met elkaar communiceren. Maak de inputs en verwachte outputs na en probeer ze uit. Deze tests zijn een van de eerste stappen van een CI/CD-pipeline voordat ze in een omgeving worden geïmplementeerd. Deze tests moeten doorgaans uitgebreider worden uitgeprobeerd dan unittests om ze goed aan het werk te krijgen.

Systeemtests

Systeemtests verifiëren de end-to-end prestaties van het systeem en geven zekerheid dat het systeem in elke omgeving werkt zoals verwacht. Probeer de invoer uit die een component zou kunnen ontvangen en het systeem zou kunnen uitvoeren. Controleer vervolgens of het systeem de vereiste waarden teruggeeft en de rest van het systeem correct wordt bijgewerkt. Deze tests moeten na de implementatie in elke omgeving worden uitgevoerd.

Stap 6 - Een CI/CD-proces bouwen om het component te kunnen implementeren

Overweeg om in meerdere omgevingen te implementeren bij het bouwen van een CI/CD-pipeline. Dingen kunnen niet meer worden aangepast als een team een CI/CD-pipeline bouwt die in slechts één omgeving kan worden geïmplementeerd. Het is belangrijk om CI/CD-pipelines te bouwen voor infrastructuur en code. Begin met het bouwen van een CI/CD-pipeline om in elke omgeving de nodige infrastructuur te implementeren. Bouw vervolgens een nieuwe CI/CD-pipeline om de code te kunnen implementeren.

Pipeline structuur

Deze pipeline begint met het uitvoeren van unittests en integratietests voordat deze in de testomgeving wordt geïmplementeerd. Systeemtests worden na implementatie in een omgeving uitgevoerd.

Schermafdruk van de integratie van bronbeheer met het bijhouden van werk

Het algemene sjabloon hierboven kan op verschillende manieren worden uitgebreid. Codelinting , statische analyses en beveiligingsscans zijn goede aanvullende stappen om toe te voegen voor unit- en integratietests. Codelinting kan coderingsstandaarden afdwingen, statische analyse kan controleren op antipatronen, en beveiligingsscans kunnen de aanwezigheid van bekende kwetsbaarheden detecteren.

Schermafdruk van de integratie van bronbeheer met het bijhouden van werk

De CI/CD-pipelines voor de implementatie van infrastructuur en code zijn waarschijnlijk anders. De CI/CD-pipeline voor infrastructuur bevat vaak geen unit- of integratietests. Na elke implementatie zal deze de systeemtests uitvoeren om er zeker van te zijn dat het systeem niet stopt met werken.

Infrastructuur

Verschillen in infrastructuur tussen omgevingen maken het moeilijk voor de software die in die omgeving draait om correct uitgevoerd te worden. Firewallregels, gebruikersrechten, toegang tot databases en andere onderdelen op infrastructuurniveau moeten zich in een bekende configuratie bevinden om de software goed te laten werken. Het kan lastig zijn om handmatige implementatie van een infrastructuur correct te herhalen. Aangezien dit proces uit vele stappen bestaat, kan het tot fouten leiden als niet elke stap in de juiste volgorde en met de juiste parameters wordt uitgevoerd. Infrastructuur moet waar mogelijk in de code worden gedefinieerd om deze en andere problemen op te lossen.

Infrastructuur kan in de code worden gedefinieerd met verschillende tools, waaronder AWS CloudFormation, Terraform, Ansible, Puppet of Chef.

Schrijf meerdere pipelines om de infrastructuur te kunnen implementeren. Net zoals het schrijven van code, is het nuttig om de implementatie van de infrastructuur modulair te houden. Verdeel de vereiste infrastructuur waar mogelijk in afzonderlijke subsets. Stel dat A, B, C en D abstracties zijn van infrastructuurcomponenten die van elkaar afhankelijk kunnen zijn. A kan bijvoorbeeld een EC2-box zijn en B een S3-bucket. Afhankelijkheden waarbij een infrastructuurcomponent A — en alleen A — afhankelijk is van component B, moeten waarschijnlijk samen in dezelfde CI/CD-pipeline worden gehouden. Afhankelijkheden waarbij A, B en C afhankelijk zijn van D — maar A, B en C onafhankelijk zijn — moeten worden opgedeeld in meerdere CI/CD-pipelines. In dit geval zijn er dan vier onafhankelijke pijpleidingen. In dit geval moet je één pipeline bouwen voor D waar alle andere drie componenten afhankelijk van zijn, en één voor elk van A, B en C.

CODE

CI/CD-pipelines zijn gebouwd om code te implementeren. Deze pipelines zijn doorgaans eenvoudig te implementeren, aangezien de infrastructuur al beschikbaar is vanwege eerder werk dat is gedaan. Belangrijke overwegingen hierbij zijn testen, herhaalbaarheid en de mogelijkheid voor herstel na een slechte implementatie.

Herhaalbaarheid is de mogelijkheid om dezelfde verandering meerdere keren te kunnen implementeren zonder het systeem te beschadigen. De implementatie moet herintredend en idempotent zijn. Bij een implementatie moet de status van een systeem worden ingesteld op een bekende configuratie in plaats van een wijziging toe te passen op de bestaande status. Het toepassen van een wijziging kan niet herhaald worden, aangezien na de eerste implementatie de noodzakelijke beginstatus om de wijziging goed te laten functioneren is gewijzigd.

Een eenvoudig voorbeeld van een niet-herhaalbare update is het updaten van een configuratiebestand door er gegevens aan toe te voegen. Voeg geen rijen toe aan configuratiebestanden en gebruik geen dergelijke wijzigingstechnieken. Het configuratiebestand kan uiteindelijk tientallen dubbele rijen krijgen als de updates via toevoegen worden uitgevoerd. Vervang in plaats daarvan het configuratiebestand door een correct geschreven bestand uit het bronbeheer.

Dit principe moet ook worden toegepast op het bijwerken van databases. Database-updates kunnen problematisch zijn en vereisen aandacht voor detail. Het is belangrijk om het updateproces van de database herhaalbaar en storingstolerant te maken. Maak meteen vóór het aanbrengen van wijzigingen een back-up, zodat herstel mogelijk is.

Iets anders dat je moet overwegen is hoe je kunt herstellen na een slechte implementatie. Of de implementatie nou is mislukt en het systeem zich in een onbekende toestand bevindt, of dat de implementatie is geslaagd, in beide gevallen worden er alarmen geactiveerd en beginnen probleemtickets binnen te stromen. Er zijn twee standaard manieren om hiermee om te gaan. De eerste is om het terug te draaien door middel van een rollback. De tweede is om functievlaggen te gebruiken en de nodige vlaggen uit te schakelen om terug te keren naar een bekende goede staat. Bekijk stap 8 van dit artikel voor meer informatie over functievlaggen.

Een rollback implementeert de eerder bekende goede toestand in een omgeving nadat een slechte implementatie is vastgesteld. Hiervoor zou in het begin moeten worden gepland. Maak een back-up voordat je een database wijzigt. Zorg ervoor dat je snel de vorige versie van de code kunt implementeren. Test het rollbackproces regelmatig in een test- of testomgeving.

Stap 7 - Controle, alarmen en instrumentatie toevoegen

Een DevOps-team moet het gedrag van de actieve applicatie in elke omgeving controleren. Staan er fouten in de logboeken? Is er een time-out voor API-calls? Crashen databases? Controleer elk component van het systeem op problemen. Als de controle een probleem detecteert, dien dan een probleemticket in zodat iemand het probleem kan oplossen. Schrijf als onderdeel van de oplossing aanvullende tests om het probleem op te sporen.

het oplossen van bugs

Het controleren en oplossen van problemen maakt deel uit van het draaien van productiesoftware. Een team met een DevOps-cultuur heeft eigedom over de werking van de software en leent het gedrag van een Site-Reliability Engineer (SRE). Voer een analyse uit op de hoofdoorzaak van het probleem, voer tests uit om het probleem op te sporen, het probleem op te lossen en te controleren of de tests nu succesvol zijn. Dit proces is op het eerste gezicht vaak omslachtig, maar werpt op de lange termijn zijn vruchten af, aangezien het de technische schulden vermindert en de operationele flexibiliteit behouden blijft.

Optimalisatie van de prestaties

Zodra de basisgezondheidsmonitoring is ingevoerd, volgt meestal het afstemmen van prestaties. Kijk hoe elk onderdeel van een systeem werkt en optimaliseer de trage onderdelen. Zoals Knuth opmerkte: "Voortijdige optimalisatie is de oorzaak van al het kwaad." Optimaliseer niet de prestaties van alles in het systeem. Optimaliseer alleen de traagste en duurste stukken. Controleren helpt met het vaststellen welke componenten traag en duur zijn.

Stap 8 - Gebruik functievlaggen om proefkonijntesten uit te voeren

Om de proefkonijntesten mogelijk te maken, moet je voor elke nieuwe functie in een functievlag plaatsen met een lijst met toegestane testgebruikers. De nieuwe functiecode is alleen geldig voor de gebruikers op de toegestane gebruikerslijst zodra deze in een omgeving is geïmplementeerd. Laat de nieuwe functie doordringen in elke omgeving voordat je ze promoot naar de volgende. Besteed aandacht aan statistieken, alarmen en andere instrumenten voor tekenen van problemen terwijl de nieuwe functie doordringt in een nieuwe regio. Let vooral op een stijging van het aantal nieuwe probleemtickets.

Pak problemen aan in een omgeving voordat je ze promoveert naar de volgende omgeving. Problemen die in de productieomgevingen worden gevonden moeten op dezelfde manier worden behandeld als problemen in test of testomgevingen. Zodra je de hoofdoorzaak van het probleem hebt vastgesteld, schrijf je tests uit om het probleem te identificeren, voer een oplossing uit, controleer je of de tests geslaagd zijn en promoot je de oplossing via de CI/CD-pipeline. De nieuwe tests zullen slagen en het aantal probleemtickets zal dalen terwijl de wijzigingen doordringen in de omgeving waar het probleem werd vastgesteld.

Conclusie...


Maak een retrospectief van het project om het eerste component naar DevOps te verplaatsen. Identificeer de pijnpunten, of delen die moeilijk of uitdagend waren. Pas het plan aan om deze pijnpunten aan te pakken en ga dan verder met het tweede component.

Het gebruik van een DevOps-benadering om een component in productie te krijgen lijkt in het begin misschien een aanzienlijke hoeveelheid werk, maar het werpt later zijn vruchten af. De implementatie van het tweede component zou makkelijker moeten zijn als de basis gelegd is. Hetzelfde proces dat je hebt gebruikt voor het eerste component kan een enigzins aangepast worden gebruikt voor het tweede component, aangezien de tools aanwezig zijn, de technologieën goed worden begrepen en het team is opgeleid om in een DevOps-stijl te werken

Om je reis met DevOps te beginnen, raden we je aan om Atlassian Open DevOps te proberen, een geïntegreerde en open toolchain met alles wat je nodig hebt om software te ontwikkelen en te gebruiken, en de mogelijkheid om extra tools te integreren naarmate je behoeften groeien.

Warren Marusiak
Warren Marusiak

Warren is a Canadian developer from Vancouver, BC with over 10 years of experience. He came to Atlassian from AWS in January of 2021.


Deel dit artikel
Volgend onderwerp

Aanbevolen artikelen

Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.

Toelichting DevOps

DevOps-community

Toelichting DevOps

DevOps-leertraject

Afbeelding van kaart

Gratis aan de slag

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up