[JAVA] So erstellen Sie ein Jenkins-Plug-In

Einführung

Ich habe es geschrieben, weil es nur wenige japanische Dokumente gab, in denen beschrieben wurde, wie das Jenkins-Plug-In entwickelt wird. Es fasst das Wissen zusammen, das Sie benötigen, um einen Schritt weiter von Tutorial zu gehen. Informationen ab April 2018.

Erstellen Sie eine Entwicklungsumgebung

Installieren Sie die erforderlichen Werkzeuge

JDK und Maven werden für die Plug-Entwicklung benötigt. Installieren Sie jdk und maven unter Plugin Development Tutorial.

Erstellen Sie eine Vorlage für das Projekt

Generieren Sie eine Projektvorlage mit maven.

mvn -U archetype:generate -Dfilter=io.jenkins.archetypes:

Wenn Sie den Befehl ausführen, werden Ihnen einige Fragen wie der Vorlagentyp und die Artefakt-ID (Plugin-Name) interaktiv gestellt. Antworten Sie daher bitte entsprechend. Überprüfen Sie nach dem Erstellen der Vorlage, ob Jenkins mit dem folgenden Befehl unter http: // localhost: 8080 / jenkins startet.

mvn hpi:run

Das entwickelte Plug-In wird hier in Jenkins eingefügt. Sie können die Funktion des Plug-Ins auf diesem Jenkins überprüfen.

Grundlegender Ablauf der Plug-In-Entwicklung

Machen Sie eine Körperklasse

Das Plug-In ist eine Klasse, die Jenkins '[Erweiterungspunkt] erbt (https://jenkins.io/doc/developer/extensions/jenkins-core/). Wählen Sie beim Erstellen eines Plug-Ins einen Erweiterungspunkt aus, der der vom Plug-In zu erweiternden Funktion entspricht, und erstellen Sie eine Klasse, die es erbt. Anschließend implementieren wir die Funktion, indem wir die Erweiterungspunktmethode überschreiben. Wenn Sie beispielsweise die perform-Methode in einer Klasse überschreiben, die [Builder] erbt (http://javadoc.jenkins-ci.org/hudson/tasks/Builder.html). Dies ist ein Erweiterungspunkt der Erstellungsprozedur, ein Plug, der eine neue Erstellungsprozedur hinzufügt. Sie können ein Gasthaus machen.

Mit Erweiterungspunktliste können Sie aktuelle Beispiele für Plug-Ins anzeigen, die durch Erben für jeden Erweiterungspunkt erstellt wurden. Nützlich für die Auswahl und Implementierung von Erweiterungspunkten.

Informieren Sie Jenkins über das Vorhandensein des Plug-Ins

Sie können das Plug-In von Jenkins nicht einfach durch Erstellen der Hauptkörperklasse verwenden. Um das Plugin verwenden zu können, müssen Sie Jenkins über die Existenz des Plugins informieren. Dazu müssen Sie einen Desctiptor als innere Klasse der Body-Klasse erstellen und die Annotation "@ Extention" hinzufügen.

Wenn Sie sich beispielsweise [AWS CodeBuild Plugin Body Class] ansehen (https://github.com/awslabs/aws-codebuild-jenkins-plugin/blob/9541d89e6ad44bb049c013cd44166eae30192fb1/src/main/java/CodeBuilder.java) Es ist als innere Klasse definiert und mit "@ Extension" versehen. DescriptorImpl erbt BuildStepDescriptor, aber Descriptor, der als solche innere Klasse definiert ist, muss vom vorhandenen Descriptor erben. Der zu erbende Deskriptor ist für jeden Erweiterungspunkt unterschiedlich. Welchen Deskriptor aus dem Beispiel erben soll, erfahren Sie in Erweiterungspunktliste.

Fügen Sie dem Plug-In Einstellungen hinzu

Das Plug-In kann zwei Arten von Einstellungen haben, global und pro Job. Globale Einstellungen werden unter "Jenkins-Verwaltung-> Systemeinstellungen" auf der Jenkins-Startseite angezeigt, und auftragsspezifische Einstellungen werden für jeden Auftrag unter "Einstellungen" angezeigt. Hier erfahren Sie, wie Sie die einzelnen Einstellungen hinzufügen.

Fügen Sie globale Einstellungen hinzu

Erstellen Sie global.jelly, um das Eingabeformular für Einstellungen anzuzeigen. Wenn sich der Hauptteil des Plugins in src / main / java / jenkins / plugins / hoge / fuga befindet, sollte sich global.jelly in src / main / ** resources ** / jenkins / plugins / hoge / fuga befinden .. Informationen zum Schreiben von global.jelly finden Sie im vorhandenen Plug-In. Wenn Sie beispielsweise den Namen MyPlugin als Einstellung hinzufügen möchten, erstellen Sie die folgende Datei global.jelly.

<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:f="/lib/form">

  <f:section title="${%MyPlugin}" name="MyPlugin">
    <f:entry title="${%name}" field="name">
      <f:textbox />
    </f:entry>
  </f:section>

</j:jelly>

Ändern Sie als Nächstes den Deskriptor so, dass er die eingegebenen Einstellungen lesen kann. Die Einstellungen werden als Argument vom Typ JSONObject an die Descriptor-Konfigurationsmethode übergeben. Im Fall von global.jelly oben können Sie den Namen abrufen, indem Sie den Deskriptor wie folgt ändern.

@Extension
public static class DescriptorImpl extends BuildStepDescriptor<Builder> {

    private String name;

    public DescriptorImpl(){
        load(); //Laden Sie zuvor gespeicherte globale Einstellungen
    }

    @Override
    public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
        json = json.getJSONObject("MyPlugin"); //Globale Einstellungen werden an das json-Argument übergeben
        name = json.getString("name");
        save();//Speichern Sie die globalen Einstellungen
        return true;
    }

    public String getName(){ //Bereiten Sie einen Getter vor, damit die Körperklasse den Namen abrufen kann
        return name;
    }
    .
    .
    .

Die Body-Klasse muss den Wert aus dem Deskriptor abrufen, um die globalen Einstellungen nutzen zu können. Nehmen Sie dazu die folgenden Änderungen an der Body-Klasse vor.

public class MyPlugin extends Builder implements SimpleBuildStep {

    @Override
    public Descriptor getDescriptor() { //Deskriptor Getter
        return (Descriptor) super.getDescriptor();
    }

    @Override
    public void perform(Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
        getDescriptor().getName(); //Holen Sie sich den Namen von Descriptor
    }
    .
    .
    .
}

Fügen Sie Einstellungen für jeden Job hinzu

Erstellen Sie config.jelly, um das Konfigurationseingabeformular anzuzeigen. Befindet sich der Hauptteil des Plugins in src / main / java / jenkins / plugins / hoge / fuga, genau wie beim Hinzufügen globaler Einstellungen, befindet sich config.jelly in src / main / ** resources ** / Legen Sie es in Jenkins / Plugins / Hoge / Fuga. Wenn Sie beispielsweise Farbe als Einstellung hinzufügen möchten, erstellen Sie die folgende config.jelly.

<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:f="/lib/form">

    <f:entry title="${%Color}" field="color">
        <f:textbox />
    </f:entry>

</j:jelly>

Um die Einstellungen für jeden Job in der Body-Klasse zu verwenden, muss dem Konstruktor die Annotation @ DataBoundConstructor hinzugefügt und das Argument hinzugefügt werden.

@DataBoundConstructor
public class MyPlugin extends Builder implements SimpleBuildStep {

    final private String color;

    @DataBoundConstructor
    public MyPlugin(String color){
        this.color = color; //Auftragsspezifische Einstellungen werden als Argumente übergeben
    }
    .
    .
    .
}

abschließend

Ich habe die grundlegende Entwicklungsmethode des Jenkins-Plug-Ins erklärt. Ich denke, Sie sollten mehr praktische Dinge aus den Beispielen in Erweiterungspunkte lernen.

Referenz: Offizielle Dokumentation, die für die Plug-Entwicklung nützlich ist

Dokument URL
Jenkins Entwicklerdokumentation https://jenkins.io/doc/developer/
Tutorial zum Erstellen von Plug-Ins https://jenkins.io/doc/developer/tutorial/
Liste der Funktionen, die mit Plug-Ins erweitert werden können https://jenkins.io/doc/developer/extensions/jenkins-core/
Jenkins Entwickler-Wiki https://wiki.jenkins.io/display/JENKINS/Extend+Jenkins
Jenkins JavaDoc http://javadoc.jenkins-ci.org/

Recommended Posts

So erstellen Sie ein Jenkins-Plug-In
So erstellen Sie einen Java-Container
So erstellen Sie einen Begrüßungsbildschirm
Wie erstelle ich ein Maven-Projekt?
So erstellen Sie ein Java-Array
Wie erstelle ich einen Discord Bot (Java)
Wie man ein schattiertes Glas macht
So erstellen Sie eine leichte JRE für den Vertrieb
Wie erstelle ich Unity Native Plugin (Android-Version)
So erstellen Sie eine App mit einem Plug-In-Mechanismus [C # und Java]
Wie hinterlasse ich einen Kommentar?
[Schienen] Wie man Samen macht
So fügen Sie ein Video ein
So erstellen Sie eine Methode
So funktioniert JavaScript auf einer bestimmten Seite
Wie man einen Cache erstellt, ohne zu viel nachzudenken
Wie erstelle ich einen MOD für Slay the Spire?
Wie erstelle ich ein Vagrant Plugin, das Sie gelernt haben, als Sie Vagrant-Mutagen gegabelt und veröffentlicht haben?
Versuchen Sie, einen einfachen Rückruf zu tätigen
Wie unterschreibe ich Minecraft MOD?
Ruby mit AtCoder lernen 13 So erstellen Sie ein zweidimensionales Array
[Swift] So senden Sie eine Benachrichtigung
Versuchen Sie, einen Iterator zu erstellen, der einen Blick darauf werfen kann
[Android] So erstellen Sie ein Dialogfragment
So erstellen Sie mit SPRING INITIALIZR einen Hinadan für ein Spring Boot-Projekt
So erstellen Sie eine JAR-Datei ohne Abhängigkeiten in Maven
[Unity] Ich habe mit NWPathMonitor ein natives Plug-In UniNWPathMonitor erstellt
So identifizieren Sie den Pfad, auf dem leicht Fehler gemacht werden können
Wie man einen revolutionären Diamanten mit Java für Aussage macht wwww
So führen Sie einen Vertrag mit web3j aus
So sortieren Sie eine Liste mit Comparator
[Basic] So schreiben Sie ein Dockerfile Selbstlernend ②
So fügen Sie ein Video in Rails ein
So fügen Sie einen neuen Hash / Array hinzu
So erstellen Sie ein Maven-Repository für 2020
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
[Rails] So erstellen Sie eine Teilvorlage
So veröffentlichen Sie eine Bibliothek in jCenter
[SpringBoot] So schreiben Sie einen Controller-Test
JVM-Leistungsoptimierung: Was ist Optimierung und wie erstellt man einen guten Plan?
Schienen: Wie man eine Rechenaufgabe schön schreibt
So erstellen Sie überall eine H2-Datenbank
[Rails] Wie schreibe ich, wenn ich eine Unterabfrage mache?
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
[Android] So konvertieren Sie eine Zeichenfolge in resourceId
Machen Sie einen Rand links vom TextField
So erhalten Sie einen Heapdump aus einem Docker-Container
So zeigen Sie eine Webseite in Java an
So verkleinern Sie das Spring Boot Docker-Image
So löschen Sie einen Controller usw. mit einem Befehl
[Ethereum] So führen Sie einen Vertrag mit web3j-Teil 2 aus
So erstellen Sie Pagenationen für das "Kaminari" -Array