Jenkins bővítmény írása

1. Áttekintés

A Jenkins egy nyílt forráskódú folyamatos integrációs szerver, amely lehetővé teszi egyedi plugin létrehozását egy adott feladat / környezet számára.

Ebben a cikkben végigvesszük a kiterjesztés létrehozásának teljes folyamatát, amely statisztikákat ad hozzá a build kimenetéhez, nevezetesen az osztályok és a kódsorok számát.

2. Beállítás

Az első dolog a projekt beállítása. Szerencsére Jenkins kényelmes Maven archetípusokat biztosít azért.

Csak futtassa az alábbi parancsot egy héjból:

mvn archetípus: generál -Dfilter = io.jenkins.archetypes: plugin

A következő kimenetet kapjuk:

[INFO] Projekt generálása interaktív módban [INFO] Nincs archetípus meghatározva. A maven-archetype-quickstart (org.apache.maven.archetypes: maven-archetype-quickstart: 1.0) használata egy üres forrásfa.) 2: remote -> io.jenkins.archetypes: global-configuration-plugin (Jenkins plugin csontváza POM-mal és a globális konfiguráció példadarabjával.) 3: remote -> io.jenkins.archetypes : hello-world-plugin (Jenkins plugin csontváza egy POM-mal és egy példával az elkészítéshez.)

Most válassza az első opciót, és határozza meg a group / artefact / package elemet az interaktív módban. Ezt követően finomítani kell a pom.xml - mivel olyan bejegyzéseket tartalmaz, mint TODO plugin.

3. Jenkins Plugin Design

3.1. Hosszabbító pontok

Jenkins számos kiterjesztési pontot biztosít. Ezek olyan interfészek vagy absztrakt osztályok, amelyek meghatározott felhasználási esetekre vonatkozóan határozzák meg a szerződéseket, és lehetővé teszik más beépülő modulok számára a megvalósítást.

Például minden build sok lépésből áll, pl. „Pénztár a VCS-től”, „Fordítás”, "Teszt","Összeszerelni", stb. Jenkins meghatározza hudson.tasks.BuildStep kiterjesztési pont, így megvalósíthatjuk, hogy egyedi lépést biztosítsunk, amely konfigurálható.

Egy másik példa az hudson.tasks.BuildWrapper - ez lehetővé teszi számunkra az előtti / utáni műveletek meghatározását.

Van egy nem központi e-mail kiterjesztés bővítményünk is, amely meghatározza a hudson.plugins.emailext.plugins.RecipientProvider kiterjesztési pont, amely lehetővé teszi az e-mail címzettek megadását. A megvalósítás példája itt érhető el: hudson.plugins.emailext.plugins.recipients.UpstreamComitterRecipientProvider.

Megjegyzés: van egy régi megközelítés, ahol a plugin osztálynak bővülnie kell hudson.Plugin. Azonban, most ajánlott hosszabbító pontokat használni helyettük.

3.2. A beépülő modul inicializálása

El kell mondani Jenkins-nek a kiterjesztésünket és azt, hogy miként kell azt példányosítani.

Először definiálunk egy statikus belső osztályt a beépülő modulban, és megjelöljük a hudson.Hosszabbítás kommentár:

A MyPlugin kiterjeszti a BuildWrapper {@Extension public static osztályt, a } @Orride public String getDisplayName () {return "name to show in UI"; }}}

Másodszor meg kell határoznunk egy konstruktort, amelyet a plugin objektumának példányosításához használunk, és jelöljük azt a org.kohsuke.stapler.DataBoundConstructor annotáció.

Paramétereket lehet használni hozzá. UI-ban jelennek meg, és Jenkins automatikusan kézbesíti őket.

Például. fontolja meg a Maven plugint:

@DataBoundConstructor public Maven (Stringcélok, String neve, String pom, String tulajdonságok, String jvmOptions, logikai használatPrivateRepository, SettingsProvider settings, GlobalSettingsProvider globalSettings, boolean injectBuildVariables) {...}

A következő felhasználói felülethez van hozzárendelve:

Használható is org.kohsuke.stapler.DataBoundSetter feljegyzés a beállítókkal.

4. A beépülő modul megvalósítása

Alapvető statisztikai statisztikákat kívánunk gyűjteni egy építkezés során, ezért hudson.tasks.BuildWrapper a helyes út errefelé.

Végezzük el:

class ProjectStatsBuildWrapper kiterjeszti a BuildWrapper {@DataBoundConstructor public ProjectStatsBuildWrapper () {} @Override public Environment setUp (AbstractBuild build, Launcher launcher, BuildListener listener) {} @Extension public static class DescriptorImpl extends BuildWrapplet igaz; } @Nonnull @Orride public String getDisplayName () {return "A projekt statisztikáinak összeállítása az összeállítás során"; }}}

Ok, most végre kell hajtanunk a tényleges funkcionalitást.

Határozzunk meg egy tartományi osztályt a projekt statisztikáihoz:

osztály ProjectStats {privát int osztályok száma; magán int sorok száma; // szabványos kivitelezők / szerelők}

És írja be az adatokat létrehozó kódot:

privát ProjectStats buildStats (FilePath gyökér) dobja az IOException, InterruptedException {int classNumber = 0; int sorok száma = 0; Verem a folyamathoz = új Verem (); toProcess.push (gyökér); while (! toProcess.isEmpty ()) {FilePath elérési útja = toProcess.pop (); if (path.isDirectory ()) {toProcess.addAll (path.list ()); } else if (path.getName (). endWith (". java")) {classNumber ++; linesNumber + = countLines (elérési út); }} return new ProjectStats (classNumber, linesNumber); }

Végül meg kell mutatnunk a statisztikákat a végfelhasználóknak. Hozzunk létre egy HTML sablont ehhez:

    $ PROJECT_NAME $ projekt: $ PROJECT_NAME $: 
Osztályok számaVonalszám
$ CLASSES_NUMBER $$ LINES_NUMBER $

És töltse fel az építkezés során:

public class ProjectStatsBuildWrapper kiterjeszti a BuildWrapper {@Override public Environment setUp (AbstractBuild build, Launcher launcher, BuildListener listener) {return new Environment () {@Override public boolean tearDown (AbstractBuild build, BuildListener listener) dobja az IOExxs build.getWorkspace ()); Karakterlánc-jelentés = generatorReport (build.getProject (). GetDisplayName (), stats); Fájl artifactsDir = build.getArtifactsDir (); Karakterlánc útvonala = artifactsDir.getCanonicalPath () + REPORT_TEMPLATE_PATH; File reportFile = új fájl ("elérési út"); // a jelentés szövegének írása a jelentés fájljába}}; }}

5. Használat

Itt az ideje, hogy összekapcsoljuk mindazt, amit eddig létrehoztunk - és működés közben lássuk.

Feltételezzük, hogy Jenkins a helyi környezetben működik és működik. Kérjük, különben olvassa el a telepítés részleteit.

5.1. Adja hozzá a bővítményt a Jenkinshez

Most készítsük el a bővítményünket:

mvn install

Ez létrehozza a * .hpi fájl a cél Könyvtár. Át kell másolnunk a Jenkins plugins könyvtárba (~ / .jenkins / plugin alapértelmezés szerint):

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

Végül indítsuk újra a kiszolgálót, és győződjünk meg arról, hogy a bővítményt alkalmazzuk:

  1. Nyissa meg a CI irányítópultot itt: // localhost: 8080
  2. Navigáljon ide Jenkins kezelése | A bővítmények kezelése | Telepítve
  3. Keresse meg bővítményünket

5.2. Konfigurálja Jenkins Jobot

Hozzunk létre egy új feladatot egy nyílt forráskódú Apache commons-lang projekt számára, és ott konfiguráljuk a Git repo elérési útját:

Ehhez engedélyeznünk kell a beépülő modulunkat is:

5.3. Ellenőrizze az eredményeket

Most minden készen áll, ellenőrizzük, hogy működik.

Felépíthetjük a projektet, és eljuthatunk az eredményekig. Láthatjuk, hogy a stats.html fájl itt érhető el:

Nyissuk meg:

Erre számítottunk - egyetlen osztály, amelynek három sor kódja van.

6. Következtetés

Ebben az oktatóanyagban létrehoztuk a Jenkins plugint a semmiből, és biztosította annak működését.

Természetesen nem terjedt ki a CI kiterjesztések fejlesztésének minden aspektusára, csupán egy alapvető áttekintést, tervezési ötleteket és egy kezdeti beállítást nyújtottunk be.

És mint mindig, a forráskód megtalálható a GitHubon.