Anda di halaman 1dari 3

20 PIPELINE AS CODE

Pipeline as code kun je pipelines in tekstuele vorm


beschrijven en in versiebeheer bewa-
ren. Deze pipelines schrijf je met een
flexibele Groovy DSL.

In Jenkins 1 werkte het maken van


Continuous Delivery pipelines met Jenkins 2 pipelines niet echt optimaal, zeker
niet in een microservice-omgeving
als je veel losse jobs hebt voor build,
In de afgelopen tien jaar heeft Jenkins zich ontpopt tot de standaardtool voor automatisering test en deploy. Een project met 20
in software development. Dit jaar is de eerste grote Jenkins release sinds tijden uitgekomen: services leverde dan al gauw een stuk
Jenkins 2.0. In dit artikel lees je wat er allemaal nieuw is. of 100 Jenkins jobs op.

Met Jenkins 2 pipelines werkt dat een Afbeelding 2: visualisatie van een Jenkins pipeline
stuk praktischer om twee redenen:
Op JavaOne vertelde Kohsuke Kawaguchi, de woord gezet, dat je uit de logs moet vissen. 1. Je kunt jobs precies zo samenstel- pom.xml: een standaard configuratie- eerstvolgende beschikbare node waar
maker van Jenkins, dat er meer dan 120.000 Dat is iets meer werk vergeleken met vroeger len als je zelf wilt. Een enkele job file op een standaard plek. dit label aan toegekend is. De hele
actieve installaties zijn. Voor meer dan 90% waar alles open stond, maar het is wel een kan een complete pipeline van pipeline draait nu op deze ‘java8’
van de gebruikers is Jenkins “mission critical”. stuk veiliger. Zeker als je te weten komt, dat commit tot en met productie- Als je in je IDE aan Jenkinsfiles werkt, node. Je kunt er ook voor kiezen om
Jenkins is dus niet zomaar een hobbypro- er bots zijn die het internet af scannen naar deployment afhandelen. dan kun je een GDSL file importeren verschillende onderdelen op ver-
jectje. Een belangrijke factor in het succes van onbeveiligde Jenkins-instanties. 2. Hergebruik van onderdelen van [2]. Dit bestand regelt de highlighting schillende nodes en zelfs parallel te
Jenkins is de enorme verzameling plug-ins, jobs is veel eenvoudiger. Hierover en code completion in je IDE. draaien.
die beschikbaar zijn. Er is een heel ecosys- Opgefriste GUI Bert Jan Schrijver is verderop meer.
teem ontstaan, waarmee Jenkins in vrijwel De GUI van Jenkins is licht verbeterd ten software craftsman Een voorbeeld De pipeline in dit voorbeeld kent vier
elke omgeving kan worden ingezet. opzichte van Jenkins 1.x. Bij installatie en bij JPoint en is Jenkins wordt hiermee gepositio- Het volgende pipeline script bouwt “stages”. Een stage is een stap in een
upgrade krijg je nu een wizard voorgeschoteld, momenteel neerd voor continuous delivery use een eenvoudig Maven project (zie pipeline, die als zodanig herkenbaar
Nieuw in Jenkins 2 die je helpt bij de configuratie. Eenmaal ge- werkzaam bij de cases en voor andere meer complexe Listing 1). is in de Jenkins GUI. In de eerste stage
Jenkins 2 is een drop-in upgrade, volledig installeerd zijn de wijzigingen marginaal. Het Nationale Politie automatiserings-scenario’s. zoeken we geïnstalleerde tool
backward compatible met versie 1.6, met drie aanmaken van een nieuwe job ziet er iets an- De eerste stap is het kiezen van het ‘maven-3.3.9’ op en maken deze
grote wijzigingen. ders uit en bij het configureren van jobs heb je Pipelines type Jenkins node waar de build op beschikbaar door hem in de path-
nu tabjes, waarmee je snel naar een bepaalde Je kunt een Jenkins 2 pipeline op moet gaan draaien. In het eenvoudig- variabele van het OS te zetten. De
Betere out-of-the-box ervaring sectie kunt springen. De echt grote GUI- twee manieren definiëren: door de ste scenario heb je alleen een Jenkins tweede stap is een Git checkout, de
Vroeger was Jenkins standaard vrij beperkt. wijzigingen zitten in project “Blue Ocean”, pipeline in de Jenkins GUI in te tik- “master” node. In wat complexere derde een Maven build en de vierde ar-
Je moest veel plug-ins installeren, voordat waarover je verderop meer kunt lezen. ken of door een bestand met daarin omgevingen zie je vaak een master chiveert de resultaten van de unit tests.
je aan de gang kon. Dat is nu beter geregeld. de pipeline-definitie in versiebeheer node en een aantal tot zelfs tientallen
Je kunt tijdens de installatie kiezen voor een Pipeline as code te plaatsen. Voor de laatste optie is slave nodes om veel builds tegelijker- Als we de pipeline uitvoeren, zien we
aanbevolen set plug-ins, waardoor je direct Veruit de grootste wijziging in Jenkins 2 is het een conventie om een tijd te kunnen draaien. de volgende resultaten terug in de
aan de slag kunt. het pipeline as code concept. Een pipeline is “Jenkinsfile” in de root van het pro- Jenkins GUI (zie Afbeelding 2).
een geautomatiseerde reeks van stappen, die ject te zetten waar de job betrekking In dit voorbeeld geven we aan dat
Security is nu standaard. Bij de eerste keer software vanuit versiebeheer naar de handen op heeft. Dit is vergelijkbaar met de de job op een node met label ‘java8’ De praktijk leert dat pipelines
opstarten wordt er een initieel admin wacht- van je gebruikers brengt. Met pipeline as code Dockerfile of een Maven moet draaien. Jenkins kiest dan de meegroeien van eenvoudig naar com-
plex. Met gecodeerde pipelines kun je
node('java8') { meerdere jobs definiëren zonder jezelf
stage('Configure') { te herhalen. Dit is een groot voordeel
env.PATH = "${tool 'maven-3.3.9'}/bin:${env.PATH}" ten opzichte van traditionele, point-
}
and-click pipelines.
stage('Checkout') {
git 'https://github.com/bertjan/spring-boot-sample' Pipelines overleven een herstart van
}
Jenkins. Dat is handig als je af en toe
stage('Build') { een upgrade van Jenkins wilt uitvoe-
sh 'mvn -B -V -U -e clean package' ren, waarvoor een herstart nodig is.
}
Jenkins bevat daarnaast de mogelijk-
stage('Archive') { heid om een pipeline te
junit allowEmptyResults: true,
testResults: '**/target/**/TEST*.xml'
“replayen”, waarbij je via de GUI
} kleine wijzigingen kunt doen en de
pipeline vervolgens opnieuw kan uit-
}
voeren. Dat is erg handig bij het ont-
Afbeelding 1: Het Jenkins ecosysteem. Bron: [1] Listing 1: pipeline script voor een Maven project wikkelen van gecodeerde pipelines.

JAVA MAGAZINE JAVA MAGAZINE | 06 2016


22 PIPELINE AS CODE

// In repo ssh://<user>@<jenkins>:2222/workflowLibs.git, automatisch pipelines aan voor alle


// bestand my.company.MyWorkflowSteps:
package my.company branches van alle repositories in een
def someBuildStep() { Github organisatie. Het is wel een
// implementatie van een build-stap voorwaarde dat elke repository netjes
}
een Jenkinsfile bevat.
// In Jenkinsfile:
def mySteps = new my.company.MyWorkflowSteps()
mySteps.someBuildStep()
Jenkins 2 in de praktijk
Bij de productlijn Cloud, Big Data,
Listing 4: Definiëren van een herbruikbare workflow-stap in het Internet van de Nationale Politie
interne workflowLibs-repository van Jenkins bouwen we een aantal webapplicaties
met een Angular 2 front-end en een
parallel 'unit': { Jenkins maakt dan automatisch voor microservices back-end met Spring
sh 'mvn test'
}, 'integration': { alle branches in het project pipelines boot. We gebruiken voor onze builds
sh 'mvn integration-test' aan. Dit is erg handig als je veel met al een tijdje Jenkins 2. We hebben
} pull requests en feature branches een Jenkins 1.6 installatie met zo’n 50
werkt. Het scheelt je een hoop onder- builds probleemloos verhuisd naar 2.0.
Listing 5: Parallel uitvoeren van één houd aan je jobs.
of meerdere onderdelen van een build We hebben alle bestaande jobs
HET BLUE De GitHub Organization Folder Plugin vervangen door pipelines. Dat heeft
Blue Ocean beta is als plug-in gaat nog een stapje verder. Die maakt best wat tijd gekost. Dat zat enerzijds
OCEAN PROJECT beschikbaar. Je kunt het installeren
IS EEN via de Jenkins plug-in manager. Ga
Afbeelding 3: Pipeline snippet generator COMPLETE naar de “Advanced” tab en voer
bij “Update Site” de URL van de
Pipeline syntax Voorbeelden MAKE-OVER experimentele plug-in registry in [4].
Als je nog niet eerder met de Groovy DSL van De beste manier om bekend te raken met VAN DE De laatste stap is het uitvoeren van
Jenkins hebt gewerkt, dan is de pipeline syntax de pipeline syntax is door er eenvoudigweg JENKINS USER een update van de lijst beschikbare
even wennen. Om de overgang wat gemak- mee aan de slag gaan. In Listing 2, 3, 4 en 5 plug-ins.
kelijker te maken, vind je in de Jenkins GUI vind je een aantal voorbeelden van de meer
EXPERIENCE
een ingebouwde pipeline snippet generator. geavanceerde constructies, die mogelijk zijn. Nu kun je Blue Ocean installeren.
Hiermee kun je de meest voorkomende build- Voor wat uitgebreidere voorbeelden, zie [5]. Na een herstart van Jenkins zie je
acties alsnog op de traditionele manier bij bovenin het scherm een knop "Try
elkaar klikken en van daaruit de bijbehorende Blue Ocean Blue Ocean UI". Een klik daarop
pipeline DSL code genereren. Het Blue Ocean project is een complete make- brengt je bij het overzicht van je
over van de Jenkins user experience. Initieel builds (zie Afbeelding 4).
De pipeline referentie-documentatie [3] is ook richt het project zich op de GUI voor develo-
goed bruikbaar en geeft een behoorlijk com- pers rondom pipelines. Het uiteindelijke doel Voor de doorgewinterde Jenkins-
pleet overzicht van de mogelijkheden. Je merkt is om de gehele GUI geleidelijk te vervangen. gebruiker zal dit een lichte schok Afbeelding 4: Overzicht builds in de Blue Ocean GUI
dat de pipeline DSL nog vrij nieuw is, want nog zijn. Jenkins ziet er opeens namelijk
niet alle plug-ins zijn via de DSL te configure- try { enigszins sexy uit. Bij de details
// build-stappen hier
ren. Mocht je er met de plugin-documentatie } catch (e) { van een pipeline zie je een soort
niet uitkomen, dan kun je altijd nog de bronco- currentBuild.result = 'FAILED' spoorboekje met stations voor elke
mail to: '<to>', subject: '<subject>',
de induiken. Jenkins componenten en plug-ins body: '<body>', attachLog: true pipeline stage. Per stage kun je de
zijn Java- en Groovy code en daardoor meestal throw e logs van de build uitklappen (zie
}
ook rechtstreeks te integreren in je pipeline. Afbeelding 5).
Daarvoor moet je meestal wel op de hoogte Listing 2: Versturen van een e-mail wanneer er iets fout
zijn van de interne werking van Jenkins. gaat in een build Ik vind het een hele verbetering.
Functioneel gezien is het nog niet
Workflow libs repository // In bestand common/Constants.groovy:
class Constants {
echt heel anders, maar het ziet er
Jenkins biedt zelf een aparte Git-repository aan static final SONAR_URL = wel duidelijker en vooral een stuk
om herbruikbare pipeline scripts in te plaatsen. 'https://sonar.company.com'; mooier uit dan de traditionele
Deze scripts zijn vervolgens voor al je builds } interface.
return this;
beschikbaar. Het feit dat je deze interne Git-
repository moet gebruiken, vind ik wat onhan- // In bestand Jenkinsfile: Multibranch pipeline
dig. Het voelt niet echt natuurlijk wanneer al je load 'common/Constants.groovy' Een laatste noemenswaardige
sh "mvn -B -V -U -e sonar:sonar " +
code en Jenkins-files al op een andere Git-server "-Dsonar.host.url=’${Constants.SONAR_URL}'"
feature is de multibranch pipeline
hebt staan. Verderop in dit artikel vind je een plug-in. Hiermee kun je een pipeline
voorbeeld van het gebruik van deze repository. Listing 3: Gebruik van klassen, constanten en includes aan een Git-project koppelen. Afbeelding 5: Details van een pipeline build

JAVA MAGAZINE JAVA MAGAZINE | 06 2016


24

Afbeelding 6: Multibranch pipeline

in het generiek opzetten van de jobs met Toekomstige verbeteringen


herbruikbare stappen en anderzijds in de Op JavaOne gaf Kohsuke Kawaguchi een
bestaande jobs. Ook al deden die allemaal kijkje in de toekomst van Jenkins. De
ongeveer hetzelfde, er zaten toch nog best eerstvolgende wijzigingen zijn gericht op
wat verschillen tussen. Per job moesten gebruikersgemak. Er komt een eenvoudiger
we inschatten of die verschillen bewust of pipeline model aan dat minder op program-
onbewust waren. meren lijkt en meer declaratief is. Jenkins wil
zowel point-and-click als tekst-editor-ge-
We hebben ervoor gekozen om één Git- bruikers bedienen. Een wijziging waar ik zelf
repository te gebruiken met daarin alle naar uitkijk: pipeline DSL verwerking faalt bij
Jenkins-file definities voor alle jobs. Nadeel het inlezen en niet bij het uitvoeren. Nu kom
daarvan is dat de Jenkins-file en de code van je pas bij het draaien van de job achter typo’s
een project niet bij elkaar staan. Voordeel in je Jenkins-file. Dat kost onnodige trial &
is dat je al je builds bij elkaar hebt en dat je error-tijd.
makkelijk in een keer een refactorslag door al
je builds kunt doen. Conclusie
Jenkins 2.0 is een krachtig continuous
We maken minimaal gebruik van de interne delivery platform. De nieuwe versie is een
workflow repository in Jenkins. Wij gebrui- drop-in upgrade voor 1.6-installaties, bevat
ken hem eigenlijk alleen om de generieke GUI-verbeteringen en een beter verzorgde
componenten van onze builds te boot- gebruikerservaring. De kern van 2.0 is pipe-
strappen. Deze componenten staan dan line as code, waarmee je je jobs in een DSL
weer in losse Groovy DSL files in de reposi- beschrijft en in versiebeheer kunt zetten.
tory met al onze builds erin. We onderschei- Algemeen gezegd: minder clicks, meer code.
den twee typen componenten: low-level Als je het mij vraagt is er geen reden om nog
stappen, die een klein onderdeel van de op 1.6 te blijven hangen. Upgraden maar!
build doen en meer high-level stappen,
die een complete pipeline definiëren. Het
voordeel van deze aanpak is dat jobs die
vrijwel hetzelfde zijn een high-level definitie
kunnen hergebruiken, terwijl jobs die net
iets anders zijn alsnog op een lager niveau REFERENTIES
hergebruik kunnen doen. [1] http://www.slideshare.net/asotobu/jenkins-20-65705621
[2] http://st-g.de/2016/08/jenkins-pipeline-autocompletion-in-intellij
Het resultaat: onze builds zijn nu veel [3] https://jenkins.io/doc/pipeline/steps
consistenter. Het is bijna geen werk meer [4] http://updates.jenkins-ci.org/experimental/update-center.json
om nieuwe jobs toe te voegen en we kunnen [5] http://www.slideshare.net/BertJanSchrijver/javaone-2016-pipeline-as-code
op één plek de definitie van vrijwel al onze
jobs beheren.

JAVA MAGAZINE