WELKE CONTINUOUS DELIVERY SERVER PAST HET BEST OM TE WERKEN MET VERSCHILLENDE PROJECTEN IN VERSCHILLENDE TALEN EN HOE ZET JE DIE HET BEST OP VOOR EEN DATEX2 PARKING API IN C#. PROMOTOR: DIETER ROOBROUCK ONDERZOEKSVRAAG UITGEVOERD DOOR SERGIY SKIRIDOV VOOR HET BEHALEN VAN DE GRAAD VAN BACHELOR IN DE NEW MEDIA AND COMMUNICATION TECHNOLOGY HOWEST | 2015-2016 WELKE CONTINUOUS DELIVERY SERVER PAST HET BEST OM TE WERKEN MET VERSCHILLENDE PROJECTEN IN VERSCHILLENDE TALEN EN HOE ZET JE DIE HET BEST OP VOOR EEN DATEX2 PARKING API IN C#. PROMOTOR: DIETER ROOBROUCK ONDERZOEKSVRAAG UITGEVOERD DOOR SERGIY SKIRIDOV VOOR HET BEHALEN VAN DE GRAAD VAN BACHELOR IN DE NEW MEDIA AND COMMUNICATION TECHNOLOGY HOWEST | 2015-2016 CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Woord vooraf Hallo, mijn naam is Sergiy Skiridov. Ik ben momenteel laatstejaars New Media & Commucation Technology (NMCT) student aan de Hogeschool West-Vlaanderen (Howest). Geboren in Oekraïne maar getogen in België. Vanaf mijn tienerjaren werd ik geïnteresseerd in informatica. Alles dat te maken had met computers vond ik boeiend. Het was dan ook mijn beste keuze om in 3e graad secundair onderwijs te veranderen naar Toegepaste Informaticabeheer. In Koninklijk Atheneum Oudenaarde heb ik dan de basis gelegd voor mijn toekomstige carrière in IT. Na enkele jaren heb ik mijn interesses voor Software Development ontwikkeld. Omdat ik tijdens mijn opleiding voornamelijk met C# en Java geprogrammeerd heb, zijn deze twee talen ook mijn meest favoriete. De laatste maanden van mijn bachelor opleiding sluit ik af met een stage bij Flow NV. Ik heb voor Flow gekozen als mijn stagebedrijf vanwege een interessante opdracht waarvan ik veel kan bijleren. Ik krijg de kans om technologieën zoals verkeersstandaard Datex2 of Continuous Delivery te ontdekken. Ik geloof dat deze laatste steeds meer zal gebruikt worden vanwege zijn enorme voordelen. Dit is dan ook de aanleiding voor het thema van mijn bachelor proef. Hiermee hoop ik de referentiepunt te leggen voor mensen die beginnen met Continuous Delivery. Verder zal ik uitleggen wat het precies inhoud, welke soorten tools er zijn en hoe je een Continuous Delivery server opzet. HOWEST | 2015-2016 |4| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Verklarende woordenlijst Builden, compileren: De code vertalen van een hogere programmeertaal (zoals C#, Java) naar een lagere programmeertaal (zoals Assembly, machinecode). Change advisory board: Wijzigingscommissie, verantwoordelijk voor het plannen en beoordelen van alle wijzigingen. Command-line-interface (CLI): Een vorm van interactie met een programma waarbij de gebruiker commando’s uitvoert op het programma via de Command-Line-Interface Committen, pushen, mergen: Een reeks van veranderingen permanent maken. Toevoegen aan de trunk. Dependency: Binnen software development wordt met dependency bedoeld: een object, file of een library waar de software afhankelijk van is. Hosten: Een applicatie of een website op een server plaatsen en deze toegankelijk maken voor gebruikers. Reposirory: Een opslagplaats voor pakketten van software, pakketbron, softwarebron. Manifest: Een beknopte puntsgewijze weergave van de standpunten van een thema of een persoon. Releasen, deployen: De software verplaatsen naar de productieomgeving. Trunk, mainline, master branch: Een hoofd tak (versie) van een VCS. Version Control System (VCS): Een applicatie dat de versies van de software beheert. HOWEST | 2015-2016 |5| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Inhoudstafel Woord vooraf ............................................................................................................................. 4 Verklarende woordenlijst ........................................................................................................... 5 Continuous Delivery ................................................................................................................... 8 Inleiding .................................................................................................................................. 9 Agile Software Development ............................................................................................... 10 Continuous Delivery ............................................................................................................. 10 Deployment Pipeline ............................................................................................................ 12 Continuous Delivery, Continuous Deployment, Continuous Integration ........................... 12 Hoe werken Continuous Integration en Continuous Delivery? ........................................... 13 Opmerking ........................................................................................................................ 14 Waarom Continuous Delivery? ............................................................................................ 15 Fouten worden sneller opgemerkt en dus sneller opgelost ............................................ 15 Snelle feedback voor een goed product .......................................................................... 15 Besparing op tijd én geld .................................................................................................. 16 Uitdagingen .......................................................................................................................... 16 Continuous Delivery servers .................................................................................................... 16 Jenkins .................................................................................................................................. 17 System requirements ....................................................................................................... 17 Go CD .................................................................................................................................... 17 System requirements ....................................................................................................... 18 Bamboo ................................................................................................................................ 19 System requirements ....................................................................................................... 20 Spinnaker .............................................................................................................................. 20 System requirements ....................................................................................................... 20 Vergelijking ........................................................................................................................... 21 Besluit ................................................................................................................................... 21 Technisch .................................................................................................................................. 22 Het proces ............................................................................................................................ 23 Builden.................................................................................................................................. 23 Testen ................................................................................................................................... 24 HOWEST | 2015-2016 |6| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Unit Tests.......................................................................................................................... 24 Integration tests ............................................................................................................... 25 System tests ..................................................................................................................... 25 Acceptance tests .............................................................................................................. 25 Deployen .............................................................................................................................. 25 Docker .............................................................................................................................. 25 Octopus Deploy ................................................................................................................ 27 MidVision RapidDeploy .................................................................................................... 29 Besluit ................................................................................................................................... 29 Voorbeeld set-up ...................................................................................................................... 30 Set-up Jenkins....................................................................................................................... 31 Installatie .......................................................................................................................... 31 Overzicht .......................................................................................................................... 32 Nieuwe project ................................................................................................................. 33 Version Control System .................................................................................................... 33 Builden.............................................................................................................................. 35 Testen ............................................................................................................................... 35 Deployen .......................................................................................................................... 36 Plug-ins ............................................................................................................................. 36 Voorbeeld flow ..................................................................................................................... 37 Besluit ................................................................................................................................... 37 Bronnen .................................................................................................................................... 38 Bronnen ................................................................................................................................ 38 Figuren.................................................................................................................................. 39 HOWEST | 2015-2016 |7| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Continuous Delivery HOWEST | 2015-2016 |8| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Inleiding Tot voor kort werd de waterval methode (ook de traditionele methode genoemd) de meest gebruikte methode voor het ontwikkelen van software. Tijdens deze proces loopt het project door een aantal fases. De belangrijkste fases houden in: analyse, ontwerp, bouw, test en productie. De volgende fase wordt pas gestart als de huidige fase volledig afgewerkt is. Zo’n fase kan soms weken tot maanden duren. Figuur 1 Flow van de waterval methode (http://xbsoftware.com/wp-content/uploads/2014/10/software-development-lifecycle.png) Dit is de eerste methode dat werd geïntroduceerd en is eenvoudig te verstaan. Dit is ook een eenvoudige methode om mee te werken als het om kleinere projecten gaat. Het kan echter snel mis gaan bij grote en complexe projecten. Tijdens de eerste fase van de ontwikkeling van de software wordt zeer uitbundig overlegd met de klant over hoe zijn product er moet uit zien en wat het moet inhouden. Daarna zien de ontwikkelaars de klant een lange tijd niet meer. Dit op zicht is You can't just ask vaak al een probleem, omdat klanten zich vaak bedenken en customers what they nieuwe ideeën krijgen. Indien dit tijdens een latere fase want and then try to give voorkomt, moet de team terug naar de eerste fase keren. Hierna that to them. By the time moeten ze de fases terug vanaf begin doorlopen. Hetzelfde geldt you get it built, they'll als er een fout ontdekt wordt. Om de oplossing voor die fout te want something new. implementeren moet de team terug naar de analyse keren en - Steve Jobs aanpassen waardoor het ontwerp kan veranderen. Omdat elke fase van lange duur is, is terugkeren een dure handeling. Een andere nadeel bij de waterval methode is dat een werkende stuk software pas laat in het proces ontstaat. Hierdoor duurt het lang voor dat de team de eerste feedback krijgt. Het is niet ongewoon dat een team maandenlang aan een overbodige of slechte feature werken HOWEST | 2015-2016 |9| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV omdat ze geen feedback krijgen. Het is ook zeer moeilijk om de tijd en de kosten van het project in te schatten. En er ontstaan vaak problemen bij het verplaatsen van software, omdat de computer van programmeurs andere configuratie heeft dan de computer van de testers en productie. De waterval methode is dus niet de ideale manier van werken voor complexe projecten. Er zijn ondertussen al andere methoden ontworpen samen met verschillende tools en technieken die de vlotte ontwikkeling van software proberen te garanderen. SCRUM is één van de technieken dat de laatste jaren populariteit kreeg, maar werd soms onjuist toegepast waardoor het weinig of geen verbetering bracht. Indien wel correct toegepast door het volledige team, biedt deze techniek een verbetering op de watervalmethode voor complexe projecten. SCRUM is een vorm van agile software development. Agile Software Development De term Agile Software Development wil duiden op een manier van softwareontwikkeling waarbij de planning mee met het project groeit. Het Engelse woord “agile” betekent: behendig, lenig. Als de betekenis van de term duidelijk wordt, valt de term zelf eenvoudiger te begrijpen. Mits het product groeit, veranderen de vereisten voor het project waardoor de oplossingen wijzigen. Agile Software Development speelt hierop in doordat het aanpassingen aan de planning aanmoedigt. Het stimuleert het team om flexibel met de planning om te gaan en de wijzigingen snel te implementeren. Hoewel er praktijken die onder de naam “agile” vallen, bestaan sinds het begin van de softwareontwikkeling, valt de geboorte van agile als term en concept terug te brengen tot het Agile Manifesto. Deze manifest werd in februari van 2001 door 17 softwareontwikkelaars opgesteld en somt 12 principes op. Samengevat geeft de Agile Manifesto enkele waardes weer. Individuen en interacties staan boven tools en technieken. Werkende software is belangrijker dan een goede documentatie. De manifest moedigt de medewerking tussen de klant en de team aan in plaats van het opstellen van een contract. Snel reageren op de veranderingen is beter dan een plan volgen. Dit zijn de richtlijnen van het agile manier van werken. Continuous Delivery Bedrijven die doorheen de laatste jaren Agile Development - net als SCRUM - adopteerden, zagen hun aantal releases verhogen. Hieruit zijn Continuous Delivery en DevOps ontstaan. DevOps is kort samengevat het idee en de implementatie van de samenwerking van de developers en operations team. Continuous Delivery maakt gebruik van DevOps om kwaliteit HOWEST | 2015-2016 |10| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV van het product te garanderen. Continuous Delivery valt onder de term Agile Software Development en houdt het volgende in: - Iedereen in de developers team moet op zijn minst één keer per dag zijn code committen De software is klaar om gereleased te worden doorheen zijn levenscyclus De volledige team moet de prioriteit stellen om de software releasable te houden boven het maken van nieuwe features Iedereen moet in staat zijn om snel feedback te krijgen van hun nieuwe feature na het committen Continuous Delivery wordt bereikt als de software continu geïntegreerd wordt bij de trunk. Tijdens de integratie wordt de nieuwe software gebuild en door verschillende tests ondergaan. Verder wordt de software gedeployed naar een omgeving gelijkaardig aan productie. Dit wordt mogelijk gemaakt met de Deployment Pipelines. Figuur 2 Deployment Pipeline (http://blog.xebialabs.com/wp-content/uploads/2016/02/continuous-deploymentpipeline.png) HOWEST | 2015-2016 |11| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Deployment Pipeline Een van de uitdagingen van Continuous Delivery is het snel verkrijgen van feedback. Dit kan enkel als de software een reeks stappen doorloopt die de code op verschillende manieren testen. Hier komen de Deployment Pipelines ter sprake. Zo’n pipeline is het proces, een reeks van stappen, die de code in de mainline builden, testen en releasen tot bij de gebruiker. Om de tijd tot release zo min mogelijk te houden, wordt de Deployment Pipeline best geautomatiseerd en geparallelliseerd waar mogelijk. Figuur 3 Parallelle flow van een Deployment Pipeline (https://www.go.cd/images/home-image1.png) Een Deployment Pipeline staat dus centraal binnen Continuous Delivery en verschilt van project tot project. De tests binnen de pipeline moeten zeer goed opgesteld worden zodat de team op elk moment met veel vertrouwen de software kan deployen. Het is ook niet de bedoeling dat de Deployment Pipeline in het begin volledig geconfigureerd wordt. Dat zou ook heel moeilijk worden, nog moeilijker dan dat het al is. Het is eerder de bedoeling dat de pipeline meegroeit met het project. Continuous Delivery, Continuous Deployment, Continuous Integration Continuous Delivery wordt vaak verward met Continuous Deployment en Continuous Integration. Zoals hierboven werd besproken is Continuous Delivery een techniek waarbij de programmeurs in kleine stukken coderen en committen. Elke commit is dan een kandidaat voor productie. Of het naar productie gedeployed wordt, kan over beslist worden maar de mogelijkheid moet er zijn. Met Continuous Deployment daarentegen wordt bedoeld dat elke gepushte stuk effectief gereleased wordt. Dan is er nog Continuous Integration. Met Continuous Integration wordt bedoeld dat de developers meerdere keren per dag/week de veranderingen mergen met de mainline. Continuous Integration tools nemen ook de taak op zich om de commits automatisch te builden en te testen. HOWEST | 2015-2016 |12| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Om de relatie tussen de drie termen beter te snappen kun je stellen dat Continuous Integration een onderdeel van Continuous Delivery en Deployment is. Continuous Delivery en Deployment nemen de draad op waar Continuous Integration gestopt is. Namelijk wanneer de code gebuild en getest werd, zorgen Continuous Delivery en Deployment dat de build ook al dan niet automatisch gereleased wordt. Hoe werken Continuous Integration en Continuous Delivery? Figuur 4 Flow van een Continuous Integration Server (http://www.pepgotesting.com/wp-content/uploads/2015/02/CI.png) De werking van Continuous Integration (zie boven) is vrij simpel. De developers werken aan nieuwe features van het programma. Iemand is klaar met zijn stuk en pusht zijn of haar veranderingen naar de mainline. De Continuous Integration server wordt automatisch verwittigd of polst regelmatig naar de veranderingen. Bij elke push buildt en test de server de nieuwe code. De resultaten worden bijgehouden en de team wordt verwittigd als de server klaar is. Continuous Delivery (zie onder) gaat een stap verder. Eens de tests gedaan zijn en indien gewenst succesvol zijn, kunnen de nieuwe features gedeployed worden naar de productie omgeving. HOWEST | 2015-2016 |13| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Figuur 5 Flow van een Continuous Delivery server (https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Continuous_Delivery_process_diagram.svg/2000pxContinuous_Delivery_process_diagram.svg.png) Opmerking Continuous Integration en Delivery servers hebben geen ingebouwde of bijgeleverde build, test en deployment tools. Het is dus noodzakelijk om de nodige tools lokaal op de server geïnstalleerd te hebben. Door middel van de Command-Line-Interfaces van de tools kan de Continuous Delivery server verschillende taken uitvoeren. De server kan bijvoorbeeld MSBuild.exe gebruiken om een C# project te builden. Daarna kan de server de CLI van NUnit aansturen om de unit tests uit te voeren en de resultaten opslaan als een xml-bestand. Standaard kunnen deze servers ook scripts of batch files uitvoeren om zo externe zaken te besturen of op te roepen. Continuous Integration en Delivery servers builden en testen dus niets zelf. Zij coördineren eerder andere tools om de stroom van de pipeline te garanderen. Sommige servers werken samen met agents (zoals Go CD en Bamboo bijvoorbeeld). In zo’n geval coördineert de server de agents die dan de taken uitvoeren met lokale CLI’s. Continuous Delivery server Bamboo kan zelfs het werk splitsen tussen de agents en de server. Zo kan een agent die een bepaalde tool niet beschikt, gebruik maken van de tool op de server of een andere agent. HOWEST | 2015-2016 |14| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Waarom Continuous Delivery? Nieuwe methodes worden steeds ontworpen om de huidige manieren van werken te verbeteren. Als je bijvoorbeeld naar de waterval methode kijkt, merk je zijn gebreken snel op. Er is dus plaats voor verbetering. Bedrijven die Continuous Delivery model correct implementeren als hun ontwikkelingsproces, zien een tal van voordelen. Fouten worden sneller opgemerkt en dus sneller opgelost Dankzij de Development Pipeline ondergaat elke verandering een reeks van tests. Indien de tests grondig ontworpen zijn en de pipeline optimaal geparallelliseerd is, weet de team na enkele minuten of de feature correct functioneert in de productie omgeving. Dit is ook het enige moment dat het product waarde oplevert, in de productie. Ingeval er toch een fout opduikt, wordt het zoeken ernaar veel sneller en makkelijker doordat de veranderingen in kleine delen gesplitst worden. Dus als het programma crasht, kan de fout maar in de laatste kleine stuk code dat werd toegevoegd zitten. In tegenstelling tot de waterval methode waarbij een verandering soms tot duizenden lijnen code kan bevatten, duurt het lang voor dat de fout ontdekt is. Dan is er nog een grote kans dat het werk van iemand anders overschreven werd, wat tot meer problemen zorgt. Bij Continuous Delivery ligt die kans veel lager, omdat de veranderingen frequent in kleine stukken gebeuren. Snelle feedback voor een goed product Omdat elke nieuwe feature, bugfix of een andere verandering in het programma na enkele momenten al in de productie komen, is er al meteen kans op feedback. Met deze snelle feedback kunnen developers echt een product naar wensen maken. Moest het gebeuren dat de developers van het pad afdwalen en een verkeerde of overbodige code schrijven, dan kan dit dezelfde dag nog recht gesteld worden. Het wordt ook zeer gemakkelijk om zelfs tijdens de constructie het programma aan te passen of uit te breiden. Handig als de klant zich bedenkt of nieuwe ideeën krijgt. Het is dus noodzakelijk dat de klant geëngageerd wordt met de ontwikkeling van zijn product. De klant kan zo dagelijks het eindproduct, de productie omgeving, zien groeien. Wanneer dit nodig is, kan hij ingrijpen om toch een product te krijgen dat hij echt wil. HOWEST | 2015-2016 |15| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Besparing op tijd én geld Misschien de belangrijkste punt voor de project managers is dat Continuous Delivery geld en tijd uitspaart. Door de hierboven vermelde redenen krijgen de developers meer tijd om te werken aan een product dat waarde opbrengt. Wat op zijn beurt geld uitspaart, aangezien de werkuren dalen. Verder wordt het duidelijk na het opstellen van de Deployment Pipeline waar de pijnpunten in het programma liggen. Hiermee kan daar de focus op gelegd worden, en dus de kwaliteit van de software stijgt. Uitdagingen Hoewel de voordelen van Continuous Delivery sterk doorwegen heeft de implementatie ervan toch wat uitdagingen. De grootste uitdaging ligt waarschijnlijk wel op de organisatorische vlak. Aangezien het ontwikkelingsproces verschillende afdelingen betrekt die soms tegengestelde doelen hebben. Bijvoorbeeld als de ene afdeling administrator rechten nodig heeft maar een andere afdeling die beheert. Hiervoor moeten de leiders de structuur van de afdelingen aanpassen om de barrières tussen de afdelingen af te breken en communicatie daartussen aan te moedigen. Een andere uitdaging is dat enkele processen van de traditionele methode Continuous Delivery verhinderen. Bijvoorbeeld als een feature klaar is, moet deze vaak de Change Advisory Board passeren. Dit kan soms een week lang duren. Als het maken van de feature maar 1 of 2 dagen duurt, is de bijkomende tijd veel te lang. Deze processen moeten gevonden worden en naar alternatieven gezocht. Continuous Delivery servers Er zijn tal van Continuous Delivery tools op de markt. Ze bestaan voor alle omgevingen, talen en processen. Zowel open-source als betalend. Hier zullen er vier besproken worden die mooie kandidaten vormen voor het bedrijf Flow NV alsook die de onderzoeksvraag kunnen beantwoorden (uitdrukkelijk: servers die verschillende programmeertalen kunnen verwerken). HOWEST | 2015-2016 |16| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Jenkins Jenkins is een zeer populaire open-source cross-platform Continuous Integration server, geschreven in Java. Deze is zeer gemakkelijk te installeren en eenvoudig te beheren. De standaard mogelijkheden zijn vrij beperkt, maar dankzij de uitbreidbare aard van Jenkins kun je tal van plug-ins installeren om alle mogelijke situaties optimaal te verwerken. Er bestaan zo plug-ins om virtueel alle VCS’s en build tools te ondersteunen. Alsook zijn er verschillende plug-ins om van Jenkins een volledige Continuous Delivery/Deployment server te maken. Het design van het platform is wat ouderwets, maar het is eenvoudig te bedienen. Met behulp van enkele plug-ins wordt het zelfs nog makkelijker en overzichtelijker. De meeste opties en input velden zijn zelf verklarend. Indien er toch twijfels zijn, zijn er helpvelden beschikbaar doorheen de platform. Een andere meerwaarde aan Jenkins is dat het een grote open community heeft. De meeste problemen zijn al bij iemand voorgekomen en is er een oplossing beschikbaar op het internet. Zoals een goede Continuous Delivery server zou moeten zijn, is Jenkins met een plug-in in staat om de jobs in de pipeline parallel uit te voeren. Jenkins is zeker een goede keuze voor zowel kleine als grote bedrijven. System requirements Jenkins draait op Java7 of hoger, maar Java8 is aangeraden. De server verwacht dat er genoeg RAM ter beschikking staat, hoewel in begin 1Gb ruimschoots voldoende is. Voor de rest worden er geen extra benodigdheden vermeld. Go CD De werknemers van Thoughtworks, de makers van Go CD (Go Continuous Delivery), werken al sinds begin 2000 met de technieken en tools van Continuous Integration. Met hun jarenlange ervaring hebben ze dan zelf een Continuous Delivery server gemaakt dat aan hun noden voldoet. Een Continuous Delivery server waar dat de pipelines centraal staan. Go CD is gemaakt om de pipelines snel en eenvoudig te creëren om dan een duidelijke overzicht te krijgen van de flow van de pipeline. HOWEST | 2015-2016 |17| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Native ondersteunt Go CD server Ant, Nant en Rake build tools. Het is natuurlijk ook mogelijk om een lokale build tool gebruiken zoals Maven of MSBuild. Er zijn ook een 40 tal Figuur 6 Flow van de Deployment Pipeline in Go CD (http://arojgeorge.ghost.io/content/images/2014/Aug/Pipelinedependency.png) plug-ins beschikbaar om de pipeline meer mogelijkheden te bieden. Dit op vlak van builden, testen, deployen of meldingen weergeven. Wat Go CD onderscheidt van zijn concurrenten is dat het zeer sterk is in het UI en eenvoudig qua gebruik. Go CD server is zeer aantrekkelijk en duidelijk om mee te werken. Het overzicht van de deployment pipeline wordt grafisch uitgebeeld, waardoor je de flow van complexe pipelines moeiteloos kunt volgen. Zoals eerder vermeld werd, werkt Go CD met een server en één of meerdere agents (clients). De server is de coördinator van het hele Deployment Pipeline. De agents voeren dan het echte werk uit zoals het builden en testen van de code. In deze geval moeten de agents over de noodzakelijke tools beschikken, en niet de server. System requirements Net als Jenkins heeft Go CD Java7 nodig. Qua hardware hangt natuurlijk veel af van het aantal pipelines en agents Go CD moet ondersteunen. Thoughtworks raadt het volgende aan: minimum van 1Gb RAM, 2 CPU cores van 2GHz en op zijn minst 1Gb aan geheugen (om mee te beginnen). Thoughtworks raadt ook zeer sterk aan om de Go server op een aparte partitie te draaien. Aangezien de volume snel vol kan geraken en de server zich dan onvoorspelbaar zal gedragen. HOWEST | 2015-2016 |18| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Bamboo Wat Bamboo zo interessant maakt is het feit dat deze server hand in hand werkt met o.a. Bitbucket, Jira platform en HipChat Atlassian. Deze applicaties zijn namelijk gemaakt door hetzelfde bedrijf: Atlassian. Aangezien Flow NV al met Confluence en andere Atlassian producten werkt, is Bamboo zeker een potentiële keuze. Eens Bamboo volledig geïnstalleerd en draaiend is, werkt hij zoals de andere Continuous Delivery servers. De deployment Pipeline wordt opgesteld met taken zoals builden van de code, unit tests uitvoeren en resultaten opslaan en/of deployen van het gebuilde code. Specifiek gaat het om taken als Grunt, MSBuild, JUnit, Maven, Docker alsook enkele andere. Natuurlijk is het mogelijk om andere externe applicatie of tools aansturen met een script of batch file. Net als Jenkins en Go CD is Bamboo uitbreidbaar met plug-ins voor extra functionaliteit. Maar heeft in tegenstelling tot Go CD meer plug-ins ter beschikking. Figuur 7 Verschillende software van Atlassian (http://www.r3d.com/wpcontent/uploads/2014/11/ExpertsAtlassian2.png) De werking en het design van Bamboo is misschien wel professioneler dan die van Jenkins, maar het is dan ook moeilijker om de Deployment Pipeline op te stellen. Enkele opties die beschikbaar gesteld worden zijn specifiek voor sommige situaties en kunnen een beginnende gebruiker verwarren. Dit zal wel niet het geval zijn binnen professionele bedrijven waar de ingenieurs de structuur van het bedrijf binnenste buiten kennen. Hierdoor kunnen zij de pipeline perfect optimaliseren binnen het structuur van het bedrijf. In tegenstelling tot de twee Continuous Delivery servers die hiervoor werden besproken, is Bamboo niet open-source. Er hangt een prijskaartje aan vast van minstens $800 voor een server on-premise. Er is wel een instap optie beschikbaar van $10 voor zeer kleine teams. Goed voor 10 jobs. Dit komt overeen met een 5tal projecten. Bamboo biedt ook de server aan in de cloud. Bamboo server draait dan op Amazon cloud, waardoor je ook over een Amazon account moet beschikken. Hierdoor moet je dan maandelijks betalen voor zowel de Bamboo server als voor de Amazon account. Bamboo biedt ook de mogelijkheid aan om Jenkins snel te ‘upgraden’ naar Bamboo. HOWEST | 2015-2016 |19| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV System requirements Net als de vorige twee Continuous Delivery servers is Bamboo een Java applicatie. De volledige installatie van Java 1.8 JDK is daarom verplicht. Verder wordt er aangeraden om op zijn minst 4 cores CPU te gebruiken met minstens 4Gb RAM. Spinnaker Net als Thoughtworks heeft de team van Netflix een eigen Continuous Delivery server gemaakt. Deze is nu ook open-source en noemt Spinnaker. Voorlopig is Spinnaker een minder interessante keuze, want de 3 omgevingen dat het ondersteunt zijn: Amazon Web Services, Google Cloud Platform en Pivotal Web Services. Flow maakt momenteel gebruik van Microsoft Azure en het zou een pluspunt zijn moest Flow daar ook gebruik van kunnen maken. Daarom staat Spinnaker hier vermeld, MS Azure ondersteuning is in de maak. Het is wel mogelijk om Spinnaker lokaal op een Linux machine te installeren. Dit is niet handig voor .NET projecten. Ondanks Spinnaker momenteel niet de beste keuze voor Flow is, wordt het toch even besproken. Spinnaker werkt nauw samen met Jenkins. Het kan dus dezelfde taken uitvoeren als een Jenkins server. Verder werkt Spinnaker gelijkaardig als de andere Continuous Delivery servers en gebruikt dezelfde tools en technieken als andere besproken servers. Spinnaker is een pak moeilijker om te configureren, geven ze zelf toe. Spinnaker linkt namelijk allerlei processen op een personaliseerbare manier. Dit brengt dan zijn moeilijkheidsgraad met zich mee. Er zijn wel handleidingen beschikbaar om de installatie en de set-up van Spinnaker zo goed mogelijk op te stellen. System requirements Spinnaker focust zich vooral op het hosten in de cloud omgeving. In die Figuur 8 Logo Spinnaker (https://blog.pivotal.io/wpsituatie hoeven de gebruikers zich geen content/uploads/2015/11/sfeatured-spinnaker-alt.png) zorgen maken om de onderliggende hardware. Indien een bedrijf Spinnaker toch lokaal wil draaien, kan het. Er worden wel geen hardware specificaties voorzien. HOWEST | 2015-2016 |20| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Vergelijking Jenkins Open-source Go CD Thoughtworks Bamboo Atlassian Spinnaker Netflix Ja Java Ja Java Nee Java, Bamboo cloud Ja AWS, GCP, PWS (MS Azure) Alle Alle Alle Alle Alle Alle Alle Alle CPU (minimum) 2 cores 2 cores 4 cores n.v.t. RAM (minimum) 1Gb 1Gb 4Gb n.v.t. Bedrijf Open-source Omgeving VCS’s Talen Besluit Het is moeilijk te zeggen dat de ene server beter is dan de andere. Ze hebben allemaal sterke punten. Qua werking is hun basis hetzelfde. Een gebruiker kan eenvoudig zijn code laten builden, testen en deployen op alle servers. Voor beginnende bedrijven is er geen foute keuze hier. De gebruiker moet wel in acht nemen dat Bamboo niet open-source is en dat er dus een prijskaartje aan hangt. Deze prijskaart wordt groter naarmate de server meer remote-agents moet ondersteunen. Zoals de naam zelf zegt, is zo’n remote-agent een client dat op afstand werkt, niet lokaal op het netwerk. Jenkins, Go CD en Spinnaker zijn wel open-source en dus ook gratis om professioneel te gebruiken. Wat Jenkins onderscheidt van de rest is dat het een grote en actieve community heeft tot op vandaag. Deze mensen hebben ondertussen al voor vrijwel alles een plug-in geschreven. Hoewel Go CD ook over enkele plug-ins beschikt, is de lijst minder uitgebreid dan bij Jenkins. Go CD biedt wel ondersteuning voor bedrijven aan voor minstens $5000 per jaar. Spinnaker is het minst gedocumenteerde product van de vier keuzes. Samen met Bamboo is Spinnaker in staat om te draaien in de cloud. Zo hoeft het bedrijf geen rekening houden met hun hardware. HOWEST | 2015-2016 |21| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Technisch HOWEST | 2015-2016 |22| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Het proces De procedure van de Development Pipeline binnen Continuous Delivery is altijd hetzelfde. De code wordt gebuild, daarna worden de tests uitgevoerd. Eens de vorige stappen succesvol zijn, brengt een gekozen applicatie de software tot in de productie. Hoewel het ontleedde proces hetzelfde is, verschillen de concrete stappen per project. Zo kan een project bestaan uit verschillende services waarbij de services in verschillende talen geprogrammeerd zijn. Sommige services hebben bepaalde tests die ze moeten doorstaan terwijl andere services andere soorten tests nodig hebben. Een andere mogelijke scenario is dat de sub-projecten op verschillende servers worden gehost. De sub-projecten communiceren dan onderling om de gebruiker een naadloze ervaring te bezorgen. Dit allemaal is geen enkel probleem voor de Continuous Delivery servers. De vier besproken servers zijn uitermate personaliseerbaar per project. Ze staan de gebruiker toe om verschillende startpunten op te richten (voor elk sub-project) alsook om het project op verschillende momenten op te splitsen om de delen apart en/of parallel te verwerken. Het deployen is eveneens configureerbaar. De operations team kan een deployment server gebruiken waar zij het liefst mee werken. De mogelijkheid bestaat zelfs om verschillende tools te gebruiken om te deployen naar andere omgevingen. Eén van de redenen waarom bedrijven overstappen naar Continuous Delivery is zodat ze sneller feedback kunnen krijgen over de nieuwe features in het product. Voordat ze hun feedback krijgen, moet het proces door een error gestopt zijn of volledig verwerkt zijn. Dit laatste kan soms uren duren als de pipeline ineffectief gemaakt werd. De duur van het proces hangt voornamelijk af van de testfase. Het builden en deployen van software mag niet langer dan een 5tal minuten duren (als er een goede internet connectie is). De rest van tijd gaat naar de tests. Het is aan de operations team om de pipeline zo ideaal mogelijk op te zetten zodat het proces snel kan eindigen. Om en bij de tien minuten is ideaal, maar het kan wat uitlopen ingeval er veel tests zijn die serieel lopen. Builden De meeste projecten moeten eerst gebuild (gecompileerd) worden voordat ze uitgevoerd kunnen worden. Dit geldt bijvoorbeeld voor alle C# en Java programma’s. Tijden het bouwen van de code worden files zoals DLL’s of JAR’s aangemaakt. Het zijn deze files dat het programma nodig heeft om op te starten en te draaien. Dit is dus een cruciale stap om de software uit te brengen en wordt als eerste uitgevoerd. Zoals eerder vermeld werd, voert de Continuous Delivery server zelf geen taken uit als builden. Hij coördineert eerder andere tools om het gewenste resultaat te krijgen: de foutloze software uploaden naar een webserver. Hierdoor maakt de server het mogelijk om vrijwel alle tools te gebruiken die de code builden. Tools zoals Ant, Maven of Gradle voor Java en Nant, Cake of MSBuild voor C# komen in aanmerking. Ook andere tools kunnen HOWEST | 2015-2016 |23| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV gebruikt worden, zolang zij aangesproken kunnen worden via een Command-Line-Interface. De Continuous Servers slaan alle aangemaakte files op en bieden de mogelijkheid om te interageren met externe repositories. Door deze files in repositories op te slaan, kan de operations team ze gebruiken voor hun doeleinden. Testen Een zeer belangrijke fase binnen de Deployment Pipeline is de testfase. Deze fase moet ervoor zorgen dat er geen fouten doorslippen naar de productie. Omdat snelheid belangrijk is, moeten zo veel mogelijk tests geautomatiseerd zijn. In sommige gevallen is het wel noodzakelijk voor menselijke interactie, maar de situaties worden best vermeden om de snelheid te garanderen. Het is zeer belangrijk dat de team de tests goed ontwerpt. Juist omdat er weinig tot geen menselijke interactie in de testfase voorkomt, moeten de automatische tests het product grondig evalueren. Deze tests moeten zowel wijd als in detail de software beproeven. Ze moeten de software op alle mogelijke vlakken proberen crashen. Indien de operations team aan de kwaliteit van de software na de pipeline twijfelt dan zijn de tests niet diepgaand genoeg. De bedoeling van deze fase is dat de team snel en zorgeloos de kwaliteit van het programma kan verzekeren. Er zijn veel soorten tests en technieken om de software te controleren. Sommige kunnen geautomatiseerd worden, sommige niet. Ze variëren ook van niveaus waarop en momenten wanneer ze testen. In het algemeen worden er vier niveaus erkend. Unit Tests Unit- of Component Tests verwijzen naar het testen van specifieke stukken code. Deze tests controleren de functionaliteit van een bepaalde functie. Ze worden door de developers zelf tijdens de ontwikkeling van het product geschreven. Een functie kan ook meerdere unit tests bevatten om verschillende scenario’s in acht te nemen. Met Unit Tests alleen kan de functionaliteit van een deel van de software niet gecontroleerd worden. Het is echter zo dat unit tests de HOWEST | 2015-2016 Figuur 9 Unit Tests staan los van de productie code, en verwijzen naar lossen bouwstenen van het product (http://martinfowler.com/bliki/images/unitTest/sketch.png) |24| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV bouwstenen van de software los van elkaar controleert. Integration tests De volgende logische stap is de bouwstenen samenvoegen om ze als een groep te inspecteren. Deze stap gebeurt na de Unit Test waarbij hij de geteste modules samen bundelt en controleert volgens een vooraf gedefinieerde plan. De output van deze fase is een geïntegreerde systeem dat klaar is voor een System Test. System tests Ook bekend als end-to-end tests, is system test een volledige controle van het programma. In deze stap controleert men of de verschillende functionaliteiten correct werken en of de vereisten behaald zijn. Zo’n test kan bestaan uit: inloggen, profielpagina aanpassen, een item toevoegen, bepaalde data uitprinten en uitloggen. Voor deze tests is het niet nodig om de onderliggende code te begrijpen. De volgende tests kunnen een deel uitmaken van de system test: GUI test, performance test, load test, security test, regression test, smoke test etc. Acceptance tests Tijdens de Acceptance Test wordt ook gekeken of de vereisten die afgesproken werden behaald zijn. In tegenstelling tot System Test wordt hier gecontroleerd uit het standpunt van de gebruiker. Men kijkt of de noden van de gebruiker bevredigd zijn met de software. Deployen Omdat de meeste problemen pas ontstaan tussen de ontwikkeling en de productie van de software, kunnen deze fases veel tijd in beslag nemen. Jez Humble, hoofd consultant van Thoughtworks, noemde deze laatste stuk “the last mile”. Continuous Delivery streeft ernaar om deze laatste mijl te automatiseren. Als het volledige proces van na de ontwikkeling tot in de productie geautomatiseerd is, kan het bedrijf hun software deployen met één klik op de knop. Dit is dan ook het streefdoel. De bedoeling is dat het deployen van software iets saais wordt. Het moet een doorsnee taak worden, geen helse taak. Er zijn natuurlijk enkele applicaties op de markt die exact dit doen. Sommige applicatie focussen zich op het releasen van software naar een specifieke omgeving. Terwijl andere neutraal blijven qua doelomgeving, ten koste van gebruiksvriendelijkheid. Docker Opgericht door Solomon Hykes in Frankrijk werd Docker gebruikt als een interne project bij dotCloud. Later, in maart van 2013, werd Docker uitgebracht als een open-source project, waarna het snel veel populariteit kreeg. In 2015 toonde een analyse aan dat IBM, Google, en Cisco een van de grootste bijdragers waren voor het populaire open-source project. Wat doet Docker Wat doet Docker? Dockers functie bestaat uit het verpakken, runnen en deployen van software. De reden waarom het zo populair is, is omdat het de software verpakt samen met HOWEST | 2015-2016 |25| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV zijn dependencies. Hierdoor wordt het verplaatsen van de software foutloos. Het maakt niet meer uit dat de computer van de ontwikkelaar andere configuraties heeft dan de computer van de tester, de operations team of de manager. Alle configuraties en andere nodige elementen worden met de software meegeleverd. Docker voert alles perfect uit ongeacht de omgeving waarin het zich bevindt. Figuur 10 Verschil in de infrastructuur tussen Virtual Machine (links) en container (rechts) (http://zdnet4.cbsistatic.com/hub/i/r/2014/10/02/1f130129-49e2-11e4-b6a0d4ae52e95e57/resize/770xauto/2598bf8706f23f291a520c42165e6b1f/docker-vm-container.png) Een andere voordeel van Docker is dat het zeer licht (en dus ook snel) is. Docker gebruikt containers om zijn eigen omgeving te maken waarin het zijn software draait. Een container is vergelijkbaar met een Virtual Machine. Het verschil zit hem in het feit dat een VM een volledige computer virtualiseert (met al zijn hardware) en de container enkel een besturingssysteem (zonder alle overbodige onderdelen). Door het gebruikt van containers is Docker licht genoeg om verschillende instanties naast elkaar te draaien, mogelijk op verschillende servers. Hoe werkt Docker Docker is een Linux applicatie, waardoor het niet meteen toegankelijk is voor Windows. Er is ondertussen hier een omweg voor gemaakt. In tegenstelling tot Linux waarop Docker rechtstreeks kan worden geïnstalleerd, moet men eerst VirtualBox installeren op Windows en daarin een Docker Daemon aanmaken om Docker te runnen. De effectieve container waarin de applicatie leeft wordt aangemaakt via een image. Een image bevat een versie van de applicatie met al zijn configuraties en dependencies. Een Docker image wordt op zijn beurt aangemaakt door middel van een Dockerfile. Het is deze image dat de team onderling kan doorgeven om de software te gebruiken. Docker voorziet ook van een repository voor HOWEST | 2015-2016 |26| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV de Docker images. Met DockerHub kan het bedrijf hun verschillende versies van de software toegankelijk maken voor publiek. Zo hebben bedrijven producten als Wordpress, Java, Php, Tomcat en veel andere projecten beschikbaar gemaakt voor publiek. Dockerfile Een Dockerfile is een gewone tekstbestand met de commando’s voor het creëren van een Docker image. De meest gebruikte commando’s zijn “FROM” (om de basis over te erven van een andere Dockerfile), “COPY” (om de bestanden van de applicatie te kopiëren naar de image) en “RUN” (om de Linux commando’s uit te voeren zoals apt-get). Docker en .NET Momenteel is het niet mogelijk om gewone .NET applicaties te runnen in Docker. Docker draait op Linux en .NET en Linux gaan niet samen. Microsoft brengt daar nu verandering in. Vanaf ASP.NET5, een open-source versie van ASP.NET, is het wel mogelijk om .NET te draaien op andere omgevingen (Linux en OSX). ASP.NET5 gebruikt ASP.NET Core, een lichte versie van .NET Framework. Microsoft werkt nu ook samen met de team van Docker om het product ook native in Windows te ondersteunen. Dit willen ze doen met Windows Container. Een variant van LXC Container (Linux Container) of Docker Container, maar native compatibel met Windows. Windows containers zijn momenteel al beschikbaar mits de gebruiker Windows 10 build 10586 of later gebruikt. Octopus Deploy Een andere deployment applicatie dat een mooie kandidaat vormt, is Octopus Deploy. Microsoft heeft Octopus Deploy gemaakt voor het vereenvoudigen van releasen van ASP.NET applicaties, Windows services en databases. Octopus Deploy is niet open-source en focust zich op de Windows omgeving. Deze deployment software werkt enkel met ingepakte bestanden. Het begon enkel met NuGet pakketten, maar vanaf versie 3.3 werd ook compatibiliteit voor zip en tar files voorzien. Deze applicatie is eenvoudig te gebruiken. Het werkt met een client-server model waarbij de client, genaamd Octopus Tentacle, de doelomgeving is. Na de installatie van de server en de client moet de gebruiker de connectie tussen de twee services leggen (dit is heel eenvoudig met behulp van een goede documentatie van Microsoft) en een project definiëren. Eens dit gedaan is, gebeurt het deployen met één druk op de knop. HOWEST | 2015-2016 |27| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Figuur 11 De plaats waar Octopus Deploy werkt binnen de Deployment Pipeline van een Continuous Delivery server (http://docs.octopusdeploy.com/download/attachments/3048178/howOctopusFitsIn.PNG?version=1&modificationDat e=1386847875634&api=v2) Microsoft heeft ook een Command-Line-Interface voorzien voor het gebruik van Octopus Deploy. Dit zorgt ervoor dat Octopus Deploy met elke Continuous Delivery server kan werken. Of het nu Jenkins of Bamboo is, de operations team creëert gewoon een plan om het product van het bedrijf te verpakken in een NuGet package, waarna zij deze pakket via Octopus CLI versturen naar een Octopus Tentacle. Natuurlijk is er ook de mogelijkheid om de software te deployen naar de cloud platform van Microsoft, Azure. NuGet NuGet is een gratis open-source package manager gemaakt voor Microsoft omgeving. Sinds zijn start in 2010 is NuGet gegroeid naar een centrale systeem voor .NET tools en services. Vanaf Visual Studio 2012 wordt NuGet standaard meegeleverd met de ontwikkelingsapplicatie. Met deze package manager bundelt de gebruiker alle nodige files om zijn applicatie, service of tool te gebruiken. Vervolgens wordt het zeer eenvoudig om deze package via internet te versturen. Opmerking: officiële NuGet repository ondersteunt geen packages verpakt met de NuGet van Octopus Deploy zelf. De NuGet van Octopus Deploy maakt een andere infrastructuur binnen de pakket, waardoor het niet bruikbaar is door de NuGet repository. Prijs Octopus Deploy Octopus Deploy is geen open-source software, Microsoft verkoopt deze applicatie voor een aardig prijsje. Beginnend bij een gratis versie voor vijf projecten, gaande tot $700 voor twintig projecten en tot $5000 voor geen limiet op projecten. Voor grote bedrijven biedt HOWEST | 2015-2016 |28| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Microsoft een optie om verschillende Octopus Deploy servers te draaien binnen het bedrijf. De prijs bedraagt dan minstens $20.000. MidVision RapidDeploy Een meer cross-platform optie is RapidDeploy. RapidDeploy, gemaakt door MidVision, werd geschreven in Java en werkt gelijkaardig aan Octopus Deploy. Om een project te deployen naar een bepaalde omgeving moet de RapidDeploy server een connectie maken met een RapidDeploy agent op de juiste server. Als de applicatie in de cloud gehost wordt, kan RapidDeploy verbinding met Amazon Web Services en Microsoft Azure maken. RapidDeploy is niet open-source maar is gratis te gebruiken tot 20 projecten. Genoeg om als een klein bedrijf mee aan de slag te gaan. Besluit Tijdens het kiezen van een deployment software moet de team vooral op hun noden letten. In welke omgeving werd de software geschreven, in welke omgevingen moet het draaien. Als het bedrijf uitsluitend met Microsoft producten werkt, dan is Octopus Deploy een aanrader. Moet het product andere omgevingen (als OSX of Linux) ondersteunen dan moet het bedrijf bezien of Docker geen oplossing biedt. Met RapidDeploy is virtueel alles mogelijk. Wat Continuous Delivery servers zo interessant maakt is dat de gebruikers hun keuzes kunnen combineren. Een bedrijf hoeft niet enkel en alleen met Octopus Deploy werken. Indien een scenario zich voordoet, kan de operations team een mix van twee (of meer) deployment software gebruiken. Zo kunnen de .NET projecten met Octopus Deploy gedeployed worden en een javascript toepassing met Docker. HOWEST | 2015-2016 |29| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Voorbeeld set-up HOWEST | 2015-2016 |30| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Het eerste deel van de onderzoeksvraag, “welke Continuous Delivery server past het best om te werken met verschillende projecten in verschillende talen”, werd al eerder beantwoord. Er is geen duidelijke winnaar. De keuze moet gebaseerd worden op de taken dat het bedrijf moet uitvoeren. Heeft het bedrijf al enkele tools waarmee ze werken, zoals die van Atlassian? Misschien heeft de operations team een voorkeur voor een bepaalde manier van werken? Het feit is, de vier besproken Continuous Delivery servers doen de kern van de zaak hetzelfde. Ze verschillen enkel in details. Bamboo werd gemaakt om samen te werken met andere applicaties van Atlassian. Thoughtworks heeft Go CD gemaakt met de nadruk op het configureren van de Deployment Pipeline. Jenkins is meer een allround keuze dankzij een grote open community. Verder zal een korte uitleg beschreven zijn over de basis functionaliteit van Jenkins om zo de flow van een Continuous Delivery beter te begrijpen. Met een goede kennis van de werking van een Continuous Delivery server is het eenvoudig om de alternatieven te verkennen. Hiermee kan een gebruiker aan de slag gaan om een keuze te maken dat bij hem het best past. Set-up Jenkins Om de tweede deel van de onderzoeksvraag te beantwoorden, “hoe zet je een Continuous Delivery het best op voor een C# API project”, wordt hier Jenkins als voorbeeld genomen. Jenkins heeft een lage drempel voor beginnende gebruikers en is dus een uitstekende keuze om een korte demo mee voor te stellen. Installatie De Jenkins applicatie is vrij te downloaden op hun website “jenkins-ci.org”. Het is een opensource applicatie geschreven in Java. Indien een versie van Java7 of hoger op de computer geïnstalleerd is, kan de gebruiker Jenkins installeren. Jenkins biedt de mogelijkheid aan om Jenkins te installeren als een Windows service. Door het te installeren als een service kan Jenkins mee met Windows opstarten zonder te hoeven in te loggen. Als Jenkins opgestart is, moet de gebruiker naar de configuratie van Jenkins gaan, “Beheer Jenkins” (in het hoofdmenu aan de linker kant) en daarna op “Installeer Jenkins als een service” klikken. Jenkins doet vervolgens de nodige aanpassingen in Windows en start zicht opnieuw op. HOWEST | 2015-2016 |31| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Overzicht HOWEST | 2015-2016 |32| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Op de overzicht pagina staan een aantal nuttige zaken. Linksboven staat het hoofdmenu, daaronder een wachtrij voor de projecten dat nog uitgevoerd moeten worden. Helemaal onderaan in de linker kolom staat een lijst van de geregistreerde gebruikers. De rest van de scherm geeft een overzicht van de aangemaakte projecten weer. Nieuwe project Een nieuw project wordt aangemaakt door te klikken op “Nieuwe item” in het hoofdmenu waarna de gebruiker “Een vrij project” moet kiezen. De volgende pagina dat de gebruiker krijgt, dient om het project helemaal te configureren. Hier bepaalt de gebruiker welke Version Control System (VCS) het project gebruikt, welke stappen het uitvoert in welke volgorde. Hij kan ervoor kiezen dat het project volledig blokkeert ingeval er een fout opduikt. Hij kan het computergeheugen vrij maken door de oude processen van het project automatisch te verwijderen of hij kan kiezen om logs bij te houden. Indien de gebruiker dit nodig heeft, kan hij een map specifiëren waarin het proces moet draaien. Dit zijn de meest eenvoudige opties, maar ze kunnen uitgebreid worden met verschillende plug-ins uit de Jenkins community (wordt verder besproken). Version Control System Verder op dezelfde pagina kan de gebruiker het project laten starten vanuit een VCS. Dit zal meestal het geval zijn voor projecten die nog gebuild moeten worden. Een gebruiker kan deze stap overslaan als hij een andere Jenkins project ontworpen heeft die zijn applicatie buildt. HOWEST | 2015-2016 |33| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Standaard ondersteunt Jenkins CVS en Subversion als VCS. Hier werd een plug-in geïnstalleerd om Git te mogen gebruiken. Na het selecteren van het VCS moet de gebruiker het URL van het project opgeven samen met de login gegevens waar Jenkins mee moet werken. Vervolgens specifieert de gebruiker welke branch Jenkins moet gebruiken en eventuele extra taken dat Jenkins moet uitvoeren. De mogelijke opties (zie rechts) bestaan uit het opruimen van de werkmap, geavanceerde opties om de bestanden van het project te downloaden of selectief zijn met de bestanden waar Jenkins mee mag werken. HOWEST | 2015-2016 |34| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Builden Verder op de pagina staan de eerste opties voor het bouwen van de applicatie. Om het netwerk niet te veel te belasten, is het handig om de build te starten wanneer er nieuwe code gecommit werd. Men kan ook kiezen om dit Jenkins project te starten na het succesvol beëindigen van een ander Jenkins project, of om periodisch te beginnen. De eerstvolgende stap is builden. Het kan zelfs heel eenvoudig zijn. Het minimum dat een gebruiker moet ingeven is het build tool dat Jenkins moet gebruiken alsook het relatieve pad naar de build file. Voor Visual Studio projecten zijn “.sln” of “.csproj” de build files. De build tool moet lokaal op de computer staan zodat Jenkins die kan gebruiken. Veel situatie zullen vereisen om extra parameters mee te geven aan de build tool. In deze voorbeeld zegt de gebruiker dat het programma als een release versie gebuild wordt. Let ook op de extra parameter voor OctoPack. Deze tool hoort bij Octopus Deploy en zorgt ervoor dat tijdens het builden van de applicatie ook een NuGet pakket aangemaakt wordt. Deze NuGet package gebruikt Octopus Deploy later om te deployen Testen Hieronder staat een dropdown list waaruit de gebruiker extra taken kan uitvoeren. Deze lijst telt standaard een 5tal opties maar met wat plug-ins kan het uitbreiden. Er bestaan namelijk plug-ins om bijna alles te kunnen realiseren. In deze voorbeeld voert Jenkins een reeks van batch commando’s uit. Specifiek gaat het om NUnit (een test tool) die de dll van het Unit Test project test en de resultaten opslaat als een xml bestand met een dynamische naam. HOWEST | 2015-2016 |35| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Vervolgens, als laatste stap in deze situatie, duidt de gebruiker de resultaten van de tests aan. Hiermee kan Jenkins aan de slag om de resultaten weer te geven in een bescheiden grafiek op de overzicht van het Jenkins project. Deployen Omdat de gebruiker zelf wil beslissen wanneer het project gereleased moet worden, moet het deployment stap in een aparte Jenkins project gedefinieerd worden. In het nieuwe project slaat de gebruiker de VCS- en buildstap over en voert meteen de batch commando’s uit voor Octopus Deploy. De NuGet package werd in het vorig project opgeslagen. Plug-ins In dit document werd veel gezegd dat Jenkins zeer uitbreidbaar is dankzij de plug-ins. Vele gebruikers hebben hun noden van Jenkins vervuld door zelf een plug-in te schrijven. Er is dus praktisch niets dat Jenkins niet kan. Momenteel zijn er meer dan 200 plug-ins beschikbaar. Als Jenkins toch iets mist, kan ook jij een plug-in schrijven. Om de plug-ins te beheren, ga naar de configuratie van Jenkins (“Beheer Jenkins”) en klik daarna op “Beheer plugins”. Op de volgende scherm krijgt de gebruiker een overzicht van beschikbare plug-ins, geïnstalleerde plug-ins of plug-ins waarvoor er updates beschikbaar zijn. HOWEST | 2015-2016 |36| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Voorbeeld flow Eerst en vooral, is het belangrijk dat de applicatie die gedeployed moet worden een OctoPack NuGet package installeert. Als de nieuwe feature gecommit wordt kan Jenkins al dan niet automatisch de code downloaden en ze dan met MSBuild compileren. De compiler maakt de nodige dll en exe files aan. Dankzij de OctoPack package en één extra commando voor MSBuild wordt ook een NuGet package gemaakt voor de applicatie. De test tool, NUnit, gebruikt de dll file(s) van de Unit Test project en genereert een trx file met de resultaten. Jenkins kan dan met een plug-in de file lezen en in een grafiek weergeven. Zodat Octopus Deploy de applicatie kan deployen, stuurt Jenkins de NuGet package uit de build stap door naar de built-in repository van Octopus Deploy. Zo weet Octopus Deploy welke package hij moet versturen naar de gekozen server, Microsoft Azure in dit geval. Besluit Voor kleine projecten met weinig sub-projecten en maar één webserver is het opzetten van een Continuous Delivery server zeer eenvoudig. Om de flow van de ontwikkeling proces bij grote bedrijven volledig te optimaliseren vraagt het meer tijd en moeite. In praktijk zal er wel een team van specialisten voor deze taak aangeduid worden. HOWEST | 2015-2016 |37| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV Bronnen Bronnen Inleiding https://nl.wikipedia.org/wiki/Watervalmethode https://en.wikipedia.org/wiki/Waterfall_model http://istqbexamcertification.com/what-is-waterfall-model-advantages-disadvantages-andwhen-to-use-it/ Agile Software Development https://nl.wikipedia.org/wiki/Agile-softwareontwikkeling https://en.wikipedia.org/wiki/Agile_software_development http://www.seguetech.com/blog/2013/07/05/waterfall-vs-agile-right-developmentmethodology Continuous Integration, Delivery, Deployment https://en.wikipedia.org/wiki/Continuous_delivery https://www.thoughtworks.com/continuous-delivery https://en.wikipedia.org/wiki/Continuous_integration http://kief.com/the-conflict-between-continuous-delivery-and-traditional-agile.html http://martinfowler.com/delivery.html https://www.youtube.com/watch?v=skLJuksCRTw https://www.youtube.com/watch?v=ZLBhVEo1OG4 Deployment Pipeline http://continuousdelivery.com/2010/09/deployment-pipeline-anti-patterns/ Continuous Delivery tools https://jenkins-ci.org/ http://spinnaker.io/ https://www.go.cd/ https://www.atlassian.com/software/bamboo/ Builden https://nl.wikipedia.org/wiki/Compiler https://en.wikipedia.org/wiki/Building_code Testen https://en.wikipedia.org/wiki/Software_testing https://en.wikipedia.org/wiki/Unit_testing https://en.wikipedia.org/wiki/Integration_testing https://en.wikipedia.org/wiki/System_testing HOWEST | 2015-2016 |38| CONTINUOUS DELIVERY - DATEX2 – C# SERGIY SKIRIDOV https://en.wikipedia.org/wiki/Acceptance_testing http://stackoverflow.com/questions/15944902/system-testing-vs-acceptance-testingdifference-in-test-cases Deployen https://www.docker.com/ https://docs.docker.com/ http://help.octopusdeploy.com/discussions/questions/4292-java-applications https://en.wikipedia.org/wiki/Octopus_Deploy https://octopus.com/ http://www.midvision.com/product/rapiddeploy Figuren Voorblad: http://derberg.github.io/documentation-continuous-delivery/img/continuous-deliverycycle.jpg Woord vooraf: https://image-store.slidesharecdn.com/c1a03458-b5cc-4687-9c05-584f257e2743-large.jpeg Titelblad, Continuous Delivery: http://www.omnirms.com/assets/uploads/images/Continuous%20Improvement.png Pagina 15, Grafiek: http://www.forexmarkt.be/wp-content/uploads/2015/02/voordelen-forex-handel.png Pagina 16, Logo Jenkins: https://blog.rosehosting.com/blog/wp-content/uploads/2014/11/jenkins.png Titelblad, Technisch https://lm-shop.s3.amazonaws.com/cache/concept_photo_original/719843a3-d603-4ea4b518-85be555fb289/32d034c8283505061cfac1d0f6b13280.png HOWEST | 2015-2016 |39|