Bilde av PUS-logo

Standardiserte byggejobber på Jenkins med JobDSL

Av Steffen Hageland 13 Aug 2018

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.

  1. Installer pluginen Job DSL i Jenkins via Plugin Manager
  2. Lag et nytt repo for din seed-jobb
  3. Opprett filene pipeline.groovy og seed.groovy
    • pipeline.groovy kommer til å være selve byggejobben. Se på den som en felles Jenkinsfile for alle appene.
    • seed.groovy vil være scriptet som lager byggejobbene våre
  4. Legg inn deres byggepipeline i pipeline.groovy og bruk variabelen gitUrl som checkout-url
  5. 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()
            }
        }
    }
})
  1. Lag en ny byggejobb i jenkins for seed-jobben
    1. Velg type Freestyle Project
    2. Legg til repository under Source code management
    3. Legg til eventuelle triggers ønskelig
    4. Legg til Process Job DSLs under Build.
      • skriv inn seed.groovy under Look on filesystem
      • Sett evnentuell config som å slette jobber om de fjernes fra scriptet
  2. 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.