For et par år siden kom Jenkins med støtte for pipelines, og pipeline-as-code.
Dette var noe mange av oss var veldig glade for, da da ga oss stor fleksibilitet
i byggejobbene våre siden vi nå kunne definere de i kode i stede for å måtte manuelt
konfigurere. Koden for en pipeline kunne lagres i en Jenkinsfile
sammen
med prosjektet og på den måten både komme under versjonskontroll - men også
ligge ved siden av koden som en form for dokumentasjon på hvordan dette
prosjektet skulle bygges og deployes.
I FO ønsket vi å bruke en mikrotjenestearkitektur, noe som betydde at vi raskt
fikk et høyt antall applikasjoner hvor alle var under aktiv utvikling. For å gjøre det
enkelt og overkommelig å hoppe mellom ulike applikasjoner var det ønskelig at
de ble bygget og deployet på samme måte. Dette betydde i praksis
at alle applikasjonene ville ha like pipelines. Dette førte til at man fort kunne
ende opp med 15 applikasjoner som hadde hver sin kopi av Jenkinsfile
, hvor alle
var nesten helt like originalen. Konsekvensen av dette var at om vi ønsket å
endre pipelinen vår ved å for eksempel legge inn et ekstra kvalitetssikringssteg måtte
vi oppdatere Jenkinsfile
i alle repoene. Dette blir fort tungt å vedlikeholde
når antall repository øker.
Løsningen på dette ble JobDSL. JobDSL er en plugin til Jenkins som lar deg lage et script som genererer byggejobber i Jenkins for deg. Man lager en seed-jobb som blir kjørt jevnlig og er ansvarlig for å generere byggejobber. Siden seed-jobben blir skrevet i kode kan man konfigurere og tilasse den etter egne ønsker. Og det er lett å oppdatere byggejobbene for mange prosjekter samtidig ved å endre et sentralt oppsett.
Eksempel på oppsett av JobDSL
Det er ikke veldig vanskelig å ta i bruk JobDSL. Under her har jeg en
enkel steg-for-steg veiledning på hvordan man kommer i gang med et oppsett hvor man enkelt kan
konfigurere og legge til nye applikasjoner. Jobbene vil bruke pipeline
-oppsettet som mange allerede er kjent med
fra prosjekter i dag.
- Installer pluginen
Job DSL
i Jenkins via Plugin Manager - Lag et nytt repo for din seed-jobb
- Opprett filene
pipeline.groovy
ogseed.groovy
pipeline.groovy
kommer til å være selve byggejobben. Se på den som en fellesJenkinsfile
for alle appene.seed.groovy
vil være scriptet som lager byggejobbene våre
- Legg inn deres byggepipeline i
pipeline.groovy
og bruk variabelengitUrl
som checkout-url - Populer
seed.groovy
med koden under og bytt ut placeholdere.
def config = [
"min_app": "GIT_CHECKOUT_URL",
"en_annen_app": "GIT_CHECKOUT_URL"
...
]
def pipelineScript = readFileFromWorkspace("pipeline.groovy")
config.each({navn, gitUrl ->
pipelineJob(navn) {
triggers {
scm("H/2 * * * *")
}
definition {
cps {
script("def gitUrl=\"${gitUrl}\"\n${pipelineScript}")
sandbox()
}
}
}
})
- Lag en ny byggejobb i jenkins for seed-jobben
- Velg type Freestyle Project
- Legg til repository under
Source code management
- Legg til eventuelle triggers ønskelig
- Legg til
Process Job DSLs
under Build.- skriv inn
seed.groovy
underLook on filesystem
- Sett evnentuell config som å slette jobber om de fjernes fra scriptet
- skriv inn
- Kjør seed-jobben vi opprettet
Hvis jobben blir markert som suksess skal den nå ha opprettet en ny byggejobb for
hver app som alle bruker pipeline.groovy
som utgangspunkt. Man kan selvfølgelig
utvide og endre scriptet til å generere multibranch-pipelines og gjøre mer
avanserte ting om det er ønskelig. For mer utfyllende dokumentasjon anbefaler jeg
å ta en titt på wikien til Job DSL.