Pisanje Jenkins dodatka

1. Pregled

Jenkins je poslužitelj za kontinuiranu integraciju otvorenog koda, koji omogućuje stvaranje prilagođenih izrada dodataka za određeni zadatak / okruženje.

U ovom ćemo članku proći kroz cijeli postupak stvaranja proširenja koje dodaje izlazne podatke gradnje, naime, broj klasa i redaka koda.

2. Postavljanje

Prvo što treba učiniti je postaviti projekt. Srećom, Jenkins nudi prikladne arhetipove Mavena za to.

Samo pokrenite naredbu ispod iz ljuske:

mvn arhetip: generiraj -Dfilter = io.jenkins.archetypes: dodatak

Dobit ćemo sljedeći izlaz:

[INFO] Generiranje projekta u interaktivnom načinu [INFO] Nije definiran arhetip. Korištenje maven-archetype-quickstart (org.apache.maven.archetypes: maven-archetype-quickstart: 1.0) Odaberite arhetip: 1: remote -> io.jenkins.archetypes: empty-plugin (Kostur Jenkins dodatka s POM-om i prazno izvorno stablo.) 2: daljinsko -> io.jenkins.archetypes: global-configuration-plugin (Kostur Jenkinsovog dodatka s POM-om i primjer globalne konfiguracije.) 3: remote -> io.jenkins.archetypes : hello-world-plugin (Kostur Jenkins dodatka s POM-om i primjerom koraka izrade.)

Sada odaberite prvu opciju i definirajte grupu / artefakt / paket u interaktivnom načinu. Nakon toga potrebno je doraditi pom.xml - jer sadrži zapise kao što su Dodatak TODO.

3. Jenkins dizajn dodatka

3.1. Proširenje bodova

Jenkins pruža brojne točke produženja. To su sučelja ili apstraktne klase koje definiraju ugovore za određene slučajeve upotrebe i dopuštaju drugim dodacima da ih implementiraju.

Na primjer, svaka se gradnja sastoji od niza koraka, na pr. "Plaćanje od VCS-a", "Sastaviti", "Test","Sastavi", itd. Jenkins definira hudson.tasks.BuildStep produžnu točku, tako da je možemo implementirati kako bi pružili prilagođeni korak koji se može konfigurirati.

Drugi je primjer hudson.tasks.BuildWrapper - ovo nam omogućuje definiranje radnji prije i poslije.

Također imamo dodatak za proširenje e-pošte koji definira hudson.plugins.emailext.plugins.RecipientProvider produžna točka, koja omogućuje pružanje primatelja e-pošte. Primjer implementacije dostupan je ovdje: hudson.plugins.emailext.plugins.recipients.UpstreamComitterRecipientProvider.

Napomena: postoji naslijeđeni pristup gdje se klasa dodataka treba proširiti Hudson.Plugin. Međutim, sada se umjesto toga preporučuje korištenje produžnih točaka.

3.2. Inicijalizacija dodatka

Potrebno je reći Jenkinsu o našem produženju i o tome kako ga treba instalirati.

Prvo definiramo statičku unutarnju klasu unutar dodatka i označavamo je pomoću Hudson.Proširenje napomena:

klasa MyPlugin proširuje BuildWrapper {@Extension javna statička klasa DescriptorImpl proširuje BuildWrapperDescriptor {@Override javna logička vrijednostAprimjenjivo (stavka AbstractProject) {return true; } @Override public String getDisplayName () {return "ime za prikaz u korisničkom sučelju"; }}}

Drugo, moramo definirati konstruktor koji će se koristiti za instanciju objekta dodatka i označiti ga pomoću org.kohsuke.stapler.DataBoundConstructor bilješka.

Za to je moguće koristiti parametre. Prikazuju se u korisničkom sučelju, a Jenkins ih automatski isporučuje.

Npr. razmotrite dodatak Maven:

@DataBoundConstructor javni Maven (ciljevi niza, naziv niza, pomak niza, svojstva niza, niz jvmOptions, logička upotrebaPrivateRepository, postavke Postavke dobavljača, GlobalSettingsProvider globalSettings, logička vrijednost injectBuildVariables) {...}

Mapira se na sljedeće korisničko sučelje:

Također je moguće koristiti org.kohsuke.stapler.DataBoundSetter napomena sa postavljačima.

4. Implementacija dodatka

Namjeravamo prikupiti osnovne statističke podatke projekta tijekom gradnje, pa, hudson.tasks.BuildWrapper je pravi put da se ide ovdje.

Provedimo to:

klasa ProjectStatsBuildWrapper proširuje BuildWrapper {@DataBoundConstructor public ProjectStatsBuildWrapper () {} @Override javno okruženje setUp (AbstractBuild build, Launcher launcher, BuildListener listener) {} @Extension public static class DescriptorImpl extends buildWrapperoleDescriptApstractBrailDaverBrailDaverBrailDefaultDownloaderBaildBrailDaverDefaultDownloader pravi; } @Nonnull @Override javni niz getDisplayName () {return "Konstruiraj statistiku projekta tijekom gradnje"; }}}

Ok, sada moramo implementirati stvarnu funkcionalnost.

Definirajmo klasu domene za statistiku projekta:

class ProjectStats {private int classesNumber; private int linesNumber; // standardni konstruktori / getteri}

I napišite kod koji gradi podatke:

private ProjectStats buildStats (FilePath root) baca IOException, InterruptedException {int classesNumber = 0; int linesNumber = 0; Stog toProcess = novi stog (); toProcess.push (korijen); while (! toProcess.isEmpty ()) {FilePath path = toProcess.pop (); if (path.isDirectory ()) {toProcess.addAll (path.list ()); } inače if (path.getName (). završava s (". java")) {classesNumber ++; linesNumber + = countLines (path); }} vrati nove ProjectStats (classesNumber, linesNumber); }

Napokon, statistiku moramo pokazati krajnjim korisnicima. Stvorimo HTML predložak za to:

    $ PROJECT_NAME $ Project $ PROJECT_NAME $: 
Broj nastaveBroj linija
$ CLASSES_NUMBER $$ LINES_NUMBER $

I popunite ga tijekom gradnje:

javna klasa ProjectStatsBuildWrapper proširuje BuildWrapper {@Override public Environment setUp (AbstractBuild build, Launcher Launcher, BuildListener listener) {return new Environment () {@Override public boolean tearDown (AbstractBuild build, BuildListener listener) baca IOException, InterruptEtats build.getWorkspace ()); Izvješće o nizu = generiraj izvještaj (build.getProject (). GetDisplayName (), statistika); Datoteka artifactsDir = build.getArtifactsDir (); Put niza = artifactsDir.getCanonicalPath () + REPORT_TEMPLATE_PATH; Datoteka reportFile = nova datoteka ("put"); // zapisivanje teksta izvještaja u datoteku izvještaja}}; }}

5. Upotreba

Vrijeme je da kombiniramo sve što smo do sada stvorili - i vidimo to na djelu.

Pretpostavlja se da je Jenkins pokrenut i radi u lokalnom okruženju. Molimo pogledajte detalje o instalaciji u suprotnom.

5.1. Dodajte dodatak Jenkinsu

Izgradimo sada dodatak:

mvn instalirati

Ovo će stvoriti * .hpi datoteku u cilj imenik. Moramo ga kopirati u direktorij dodataka Jenkins (~ / .jenkins / dodatak prema zadanim postavkama):

cp ./target/jenkins-hello-world.hpi ~ / .jenkins / plugins /

Na kraju, ponovno pokrenimo poslužitelj i osigurajmo da je dodatak primijenjen:

  1. Otvorite nadzornu ploču CI na // localhost: 8080
  2. Dođite do Upravljajte Jenkinsom | Upravljanje dodacima | Instalirano
  3. Pronađite naš dodatak

5.2. Konfigurirajte posao Jenkins

Stvorimo novi posao za otvoreni izvor Apache commons-lang projekta i tamo konfigurirajmo put do njegovog Git repo-a:

Također moramo omogućiti naš dodatak za to:

5.3. Provjerite rezultate

Sad smo spremni, provjerimo kako to funkcionira.

Možemo izraditi projekt i prijeći na rezultate. Možemo vidjeti da a statistika.html datoteka je dostupna ovdje:

Otvorimo:

To smo i očekivali - jedna klasa koja ima tri retka koda.

6. Zaključak

U ovom uputstvu stvorili smo Jenkins dodatak od nule i osigurao da radi.

Naravno, nismo pokrivali sve aspekte razvoja CI proširenja, već smo pružili osnovni pregled, ideje za dizajn i početno postavljanje.

Kao i uvijek, izvorni kod možete pronaći na GitHubu.