Zápis Jenkinsovho doplnku

1. Prehľad

Jenkins je server kontinuálnej integrácie typu open-source, ktorý umožňuje vytvoriť vlastné vytvorenie doplnku pre konkrétnu úlohu / prostredie.

V tomto článku prejdeme celým procesom vytvárania rozšírenia, ktoré do výstupu zostavy pridáva štatistiku, konkrétne počet tried a riadkov kódu.

2. Inštalácia

Prvá vec, ktorú musíte urobiť, je pripraviť projekt. Našťastie Jenkins poskytuje pohodlné archetypy Maven pre to.

Stačí spustiť príkaz uvedený nižšie z shellu:

archív typu mvn: generate -Dfilter = io.jenkins.archetypes: plugin

Dostaneme nasledujúci výstup:

[INFO] Generovanie projektu v interaktívnom režime [INFO] Nie je definovaný žiadny archetyp. Pomocou maven-archetype-quickstart (org.apache.maven.archetypes: maven-archetype-quickstart: 1.0) Vyberte archetyp: 1: remote -> io.jenkins.archetypes: empty-plugin (Kostra Jenkinsovho pluginu s POM a prázdny zdrojový strom.) 2: remote -> io.jenkins.archetypes: global-configuration-plugin (Kostra Jenkinsovho pluginu s POM a ukážka globálnej konfigurácie.) 3: remote -> io.jenkins.archetypes : hello-world-plugin (Kostra Jenkinsovho pluginu s POM a príkladom kroku zostavenia.)

Teraz vyberte prvú možnosť a definujte skupinu / artefakt / balík v interaktívnom režime. Potom je potrebné vylepšiť pom.xml - pretože obsahuje položky ako Plugin TODO.

3. Návrh doplnku Jenkins

3.1. Predĺženie bodov

Jenkins poskytuje množstvo rozširujúcich bodov. Jedná sa o rozhrania alebo abstraktné triedy, ktoré definujú zmluvy pre konkrétne prípady použitia a umožňujú ich implementáciu iným doplnkom.

Napríklad každé zostavenie pozostáva z množstva krokov, napr. „Pokladňa z VCS“, „Zostaviť“, „Test“,„Zostaviť“, atď. Jenkins definuje hudson.tasks.BuildStep bod rozšírenia, takže ho môžeme implementovať tak, aby poskytoval vlastný krok, ktorý je možné nakonfigurovať.

Ďalším príkladom je hudson.tasks.BuildWrapper - to nám umožňuje definovať akcie pred / po.

Máme tiež vedľajší doplnok e-mailu, ktorý definuje hudson.plugins.emailext.plugins.RecipientProvider bod rozšírenia, ktorý umožňuje poskytovanie príjemcov e-mailov. Príklad implementácie je k dispozícii tu: hudson.plugins.emailext.plugins.recipients.UpstreamComitterRecipientProvider.

Poznámka: Existuje starší prístup, pri ktorom je potrebné rozšíriť triedu doplnkov hudson.Plugin. Avšak teraz sa odporúča použiť namiesto nich predĺženie.

3.2. Inicializácia pluginu

Je potrebné povedať Jenkinsovi o našom rozšírení a o tom, ako by malo byť vytvorené.

Najskôr definujeme statickú vnútornú triedu v rámci pluginu a označíme ju pomocou hudson.Rozšírenie anotácia:

class MyPlugin extends BuildWrapper {@Extension public static class DescriptorImpl extends BuildWrapperDescriptor {@Override public boolean isApplicable (AbstractProject item) {return true; } @Override public String getDisplayName () {return "name to show in UI"; }}}

Po druhé, musíme definovať konštruktor, ktorý sa má použiť na inštanciu objektu doplnku, a označiť ho org.kohsuke.stapler.DataBoundConstructor anotácia.

Je možné na to použiť parametre. Zobrazujú sa v používateľskom rozhraní a automaticky ich dodáva spoločnosť Jenkins.

Napr. zvážte plugin Maven:

@DataBoundConstructor public Maven (ciele reťazca, názov reťazca, reťazec pom, vlastnosti reťazca, reťazec jvmOptions, boolean usePrivateRepository, nastavenie SettingsProvider, GlobalSettingsProvider globalSettings, boolean injectBuildVariables) {...}

Je namapovaná na nasledujúce používateľské rozhranie:

Je tiež možné použiť org.kohsuke.stapler.DataBoundSetter anotácia so staviteľmi.

4. Implementácia pluginu

Počas zostavovania chceme zhromaždiť základné štatistiky projektu, takže hudson.tasks.BuildWrapper je správna cesta sem.

Poďme to implementovať:

trieda ProjectStatsBuildWrapper rozširuje BuildWrapper {@DataBoundConstructor public ProjectStatsBuildWrapper () {} @Override public Environment setUp (AbstractBuild build, Launcher launcher, BuildListener listener) {} @Extension public static class DescriptorImpl extends BuildWrapperDescriptor {@Override pravda; } @Nonnull @Override public String getDisplayName () {return "Vytvoriť štatistiku projektu počas zostavovania"; }}}

Dobre, teraz musíme implementovať skutočnú funkčnosť.

Definujme triedu domény pre štatistiku projektu:

trieda ProjectStats {private int classesNumber; private int linesNumber; // štandardné konštruktory / getre}

A napíš kód, ktorý vytvára dáta:

private ProjectStats buildStats (FilePath root) throws IOException, InterruptedException {int classesNumber = 0; int linesNumber = 0; Stack toProcess = nový Stack (); toProcess.push (root); while (! toProcess.isEmpty ()) {cesta k FilePath = toProcess.pop (); if (path.isDirectory ()) {toProcess.addAll (path.list ()); } else if (path.getName (). endsWith (". java")) {classesNumber ++; linesNumber + = countLines (cesta); }} vrátiť nové ProjectStats (classesNumber, linesNumber); }

Nakoniec musíme štatistiku ukázať koncovým používateľom. Vytvorme pre to šablónu HTML:

    $ PROJECT_NAME $ Projekt $ PROJECT_NAME $: 
Počet triedČíslo riadku
$ CLASSES_NUMBER $$ LINES_NUMBER $

A vyplňte ho počas zostavovania:

public class ProjectStatsBuildWrapper rozširuje BuildWrapper {@Override public Environment setUp (AbstractBuild build, Launcher launcher, BuildListener listener) {return new Environment () {@Override public boolean tearDown (AbstractBuild build, BuildListener listener) hodí IOException, InterruptedException {ProjectStats statistics = buildStats build.getWorkspace ()); Reťazcový report = generateReport (build.getProject (). GetDisplayName (), stats); Súbor artifactsDir = build.getArtifactsDir (); Cesta reťazca = artifactsDir.getCanonicalPath () + REPORT_TEMPLATE_PATH; Súbor reportFile = nový súbor ("cesta"); // zapíše text správy do súboru správy}}; }}

5. Použitie

Je čas spojiť všetko, čo sme doteraz vytvorili - a vidieť to v praxi.

Predpokladá sa, že Jenkins je v lokálnom prostredí funkčný. Inak si prečítajte podrobnosti o inštalácii.

5.1. Pridajte doplnok k Jenkinsovi

Poďme si teraz zostaviť náš doplnok:

inštalácia mvn

Týmto sa vytvorí * .hpi súbor v cieľ adresár. Musíme to skopírovať do adresára Jenkinsových doplnkov (~ / .jenkins / plugin predvolene):

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

Nakoniec reštartujeme server a uistite sa, že je doplnok použitý:

  1. Otvorte informačný panel CI na adrese // localhost: 8080
  2. Prejdite na Spravujte Jenkinsa | Spravovať doplnky | Nainštalované
  3. Nájdite náš doplnok

5.2. Nakonfigurujte Jenkins Job

Vytvorme novú prácu pre open-source projekt Apache commons-lang a nakonfigurujme tam cestu k jeho Git repo:

Na to musíme tiež povoliť náš doplnok:

5.3. Skontrolujte výsledky

Teraz sme všetci pripravení, poďme skontrolovať, ako to funguje.

Môžeme zostaviť projekt a prejsť k výsledkom. Môžeme vidieť, že a stats.html súbor je k dispozícii tu:

Poďme to otvoriť:

To sme očakávali - jediná trieda, ktorá má tri riadky kódu.

6. Záver

V tomto návode sme vytvorili a Jenkins plugin od nuly a zabezpečil jeho funkčnosť.

Prirodzene, nepokryli sme všetky aspekty vývoja rozšírení CI, poskytli sme iba základný prehľad, návrhové nápady a počiatočné nastavenie.

A ako vždy, zdrojový kód nájdete na GitHub.