[JAVA] Comment créer un plug-in Jenkins

introduction

Je l'ai écrit parce qu'il y avait peu de documents japonais décrivant comment développer le plug-in Jenkins. Il résume les connaissances dont vous aurez besoin si vous essayez d'aller plus loin à partir de Tutorial. Information en avril 2018.

Créer un environnement de développement

Installez les outils requis

JDK et maven sont nécessaires pour le développement de plug-ins. Installez jdk et maven en vous référant au Tutoriel de développement de plugins.

Créer un modèle pour le projet

Générez un modèle de projet avec maven.

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

Lorsque vous exécutez la commande, des questions telles que le type de modèle et l'ID d'artefact (nom du plugin) vous seront posées de manière interactive, veuillez donc répondre de manière appropriée. Après avoir créé le modèle, vérifiez que Jenkins démarre à http: // localhost: 8080 / jenkins avec la commande suivante.

mvn hpi:run

Le plug-in développé sera inséré dans Jenkins commencé ici. Vous pouvez vérifier le fonctionnement du plug-in sur ce Jenkins.

Flux de base du développement de plug-ins

Faire une classe de corps

Le plug-in est une classe qui hérite des [Extension Points] de Jenkins (https://jenkins.io/doc/developer/extensions/jenkins-core/). Lors de la création d'un plug-in, sélectionnez un point d'extension qui correspond à la fonction à étendre par le plug-in et créez une classe qui en hérite. Ensuite, nous implémenterons la fonction en remplaçant la méthode du point d'extension. Par exemple, si vous remplacez la méthode perform dans une classe qui hérite de Builder, qui est un point d'extension de la procédure de construction, un plug-in qui ajoute une nouvelle procédure de construction. Vous pouvez faire une auberge.

La Liste des points d'extension vous permet de voir des exemples réels de plug-ins créés en l'héritant pour chaque point d'extension. Utile pour sélectionner et implémenter des points d'extension.

Informer Jenkins de l'existence du plug-in

Vous ne pouvez pas utiliser le plug-in de Jenkins simplement en créant la classe de corps principale. Pour utiliser le plugin, vous devez informer Jenkins de l'existence du plugin. Pour ce faire, vous devez créer un Desctiptor comme classe interne de la classe body et ajouter l'annotation @ Extention.

Par exemple, si vous regardez AWS CodeBuild Plugin Body Class, la classe Descript Il est défini comme une classe interne et annoté avec @ Extension. DescriptorImpl hérite de BuildStepDescriptor, mais Descriptor défini comme une classe interne comme celle-ci doit hériter du Descriptor existant. Le descripteur à hériter est différent pour chaque point d'extension. Vous pouvez trouver quel descripteur doit être hérité de l'exemple dans Liste des points d'extension.

Ajouter des paramètres au plug-in

Les plugins peuvent avoir deux paramètres, global et par travail. Les paramètres généraux sont affichés dans «Gestion Jenkins-> Paramètres système» sur la page principale de Jenkins, et les paramètres spécifiques à la tâche sont affichés dans «Paramètres» pour chaque tâche. Voici comment ajouter chaque paramètre.

Ajouter des paramètres globaux

Créez global.jelly pour afficher le formulaire de saisie des paramètres. Si le corps du plugin se trouve dans src / main / java / jenkins / plugins / hoge / fuga, alors global.jelly doit être situé dans src / main / ** resources ** / jenkins / plugins / hoge / fuga .. Il est bon de se référer au plug-in existant pour savoir comment écrire global.jelly. Par exemple, si vous souhaitez ajouter le nom de MyPlugin comme paramètre, créez le global.jelly suivant.

<?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>

Ensuite, modifiez le descripteur afin qu'il puisse lire les paramètres saisis. Les paramètres sont transmis à la méthode de configuration Descriptor en tant qu'argument de type JSONObject. Dans le cas de global.jelly ci-dessus, vous pouvez récupérer le nom en modifiant le descripteur comme suit.

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

    private String name;

    public DescriptorImpl(){
        load(); //Charger les paramètres globaux précédemment enregistrés
    }

    @Override
    public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
        json = json.getJSONObject("MyPlugin"); //Les paramètres globaux sont passés à l'argument json
        name = json.getString("name");
        save();//Enregistrer les paramètres globaux
        return true;
    }

    public String getName(){ //Préparez un getter pour que la classe body puisse récupérer le nom
        return name;
    }
    .
    .
    .

La classe body doit récupérer la valeur du Descriptor pour tirer parti des paramètres globaux. Pour ce faire, apportez les modifications suivantes à la classe body.

public class MyPlugin extends Builder implements SimpleBuildStep {

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

    @Override
    public void perform(Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
        getDescriptor().getName(); //Obtenir le nom du descripteur
    }
    .
    .
    .
}

Ajouter des paramètres pour chaque tâche

Créez config.jelly pour afficher le formulaire d'entrée de configuration. Si le corps du plugin se trouve dans src / main / java / jenkins / plugins / hoge / fuga, tout comme lors de l'ajout de paramètres globaux, config.jelly sera dans src / main / ** resources ** / Placez-le dans jenkins / plugins / hoge / fuga. Par exemple, si vous souhaitez ajouter une couleur en tant que paramètre, créez le config.jelly suivant.

<?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>

Afin d'utiliser les paramètres de chaque travail dans la classe body, il est nécessaire d'ajouter l'annotation @ DataBoundConstructor au constructeur et d'ajouter l'argument.

@DataBoundConstructor
public class MyPlugin extends Builder implements SimpleBuildStep {

    final private String color;

    @DataBoundConstructor
    public MyPlugin(String color){
        this.color = color; //Les paramètres spécifiques à la tâche sont transmis en tant qu'arguments
    }
    .
    .
    .
}

en conclusion

J'ai expliqué la méthode de développement de base du plug-in Jenkins. Je pense que vous devriez apprendre des choses plus pratiques à partir des exemples dans Extension Points.

Référence: documentation officielle utile pour le développement de plugins

document URL
Documentation développeur Jenkins https://jenkins.io/doc/developer/
Tutoriel de création de plug-ins https://jenkins.io/doc/developer/tutorial/
Liste des fonctions pouvant être étendues avec des plug-ins https://jenkins.io/doc/developer/extensions/jenkins-core/
Wiki développeur Jenkins https://wiki.jenkins.io/display/JENKINS/Extend+Jenkins
Jenkins JavaDoc http://javadoc.jenkins-ci.org/

Recommended Posts

Comment créer un plug-in Jenkins
Comment créer un conteneur Java
Comment créer un écran de démarrage
Comment faire un projet Maven
Comment créer un tableau Java
Comment créer un robot Discord (Java)
Comment faire un pot ombré
Comment créer un JRE léger pour la distribution
Comment créer un plug-in natif Unity (version Android)
Comment créer une application avec un mécanisme de plug-in [C # et Java]
Comment laisser un commentaire
[Rails] Comment faire des graines
Comment insérer une vidéo
Comment créer une méthode
Comment faire fonctionner JavaScript sur une page spécifique
Comment faire un cache sans trop réfléchir
Comment faire un MOD pour Slay the Spire
Comment créer un plugin Vagrant que vous avez appris lorsque vous avez forké et publié vagrant-mutagen
Essayez de faire un simple rappel
Comment signer Minecraft MOD
Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions
[Swift] Comment envoyer une notification
Essayez de créer un itérateur qui puisse être vu
[Android] Comment créer un fragment de dialogue
Comment créer un hinadan pour un projet Spring Boot à l'aide de SPRING INITIALIZR
Comment créer un fichier jar sans dépendances dans Maven
[Unity] J'ai essayé de créer un plug-in natif UniNWPathMonitor en utilisant NWPathMonitor
Comment identifier le chemin sur lequel il est facile de se tromper
Comment faire un diamant révolutionnaire en utilisant Java pour déclaration wwww
Comment exécuter un contrat avec web3j
Comment trier une liste à l'aide du comparateur
[Basique] Comment écrire un auto-apprentissage Dockerfile ②
Comment insérer une vidéo dans Rails
Comment ajouter un nouveau hachage / tableau
Comment créer un référentiel Maven pour 2020
[Swift5] Comment créer un écran de démarrage
[rails] Comment créer un modèle partiel
Comment publier une bibliothèque dans jCenter
[SpringBoot] Comment écrire un test de contrôleur
Réglage des performances JVM: qu'est-ce que le réglage et comment élaborer un bon plan
Rails: comment bien écrire une tâche de râteau
Comment créer une base de données H2 n'importe où
[Rails] Comment écrire lors de la création d'une sous-requête
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
[Android] Comment convertir une chaîne de caractères en resourceId
Faire une marge à gauche du TextField
Comment obtenir un heapdump à partir d'un conteneur Docker
Comment afficher une page Web en Java
Comment réduire l'image de Spring Boot Docker
Comment supprimer un contrôleur, etc. à l'aide d'une commande
[Ethereum] Comment exécuter un contrat en utilisant web3j-Part 2-
Comment créer des pages pour le tableau "kaminari"