Créer des paramètres dynamiques dans un job Jenkins, ou comment rendre votre tâche conviviale

Bonne journée, Habr!

Aujourd'hui, j'aimerais partager l'une des façons d'utiliser Plugin de choix actifs faire la tâche dans Jenkins le plus unifié et le plus convivial.

introduction

Une abréviation telle que DevOps n'est plus quelque chose de nouveau pour la communauté informatique. Pour beaucoup de gens, l'expression « faire DevOps » est associée à une sorte de bouton magique, lorsque vous cliquez dessus, le code de l'application se transforme automatiquement en une application déployée et testée (tout est en réalité plus compliqué, mais nous faisons abstraction de tous les processus).

Nous avons donc reçu l'ordre de créer un tel bouton magique afin que les administrateurs puissent déployer l'application en un seul clic. Il existe différents types de mise en œuvre de cette tâche : de l'écriture d'un bot pour n'importe quelle messagerie instantanée au développement d'une application distincte. Néanmoins, tout cela a le même objectif : rendre le démarrage de la construction et du déploiement de l'application aussi transparent et pratique que possible.

Dans notre cas, nous utiliserons Jenkins.


Créer des paramètres dynamiques dans un job Jenkins, ou comment rendre votre tâche conviviale

Tâche

Créez une tâche Jenkins pratique qui lancera la construction et (ou) le déploiement du microservice sélectionné d'une certaine version.

Créer des paramètres dynamiques dans un job Jenkins, ou comment rendre votre tâche conviviale

Données d'entrée

Nous disposons de plusieurs référentiels contenant le code source de divers microservices.

Définir les paramètres

Les paramètres suivants doivent être reçus en entrée de notre travail :

  1. L'URL du référentiel avec le code du microservice que nous souhaitons créer et déployer lors de l'exécution du travail.
  2. ID du commit à partir duquel la build aura lieu.

AS IS

Le moyen le plus simple d’accomplir cette tâche consiste à créer deux paramètres de type String.

Créer des paramètres dynamiques dans un job Jenkins, ou comment rendre votre tâche conviviale

Dans ce cas, l'utilisateur devra saisir manuellement le chemin d'accès au référentiel et l'identifiant de validation, ce qui, voyez-vous, n'est pas tout à fait pratique.

Créer des paramètres dynamiques dans un job Jenkins, ou comment rendre votre tâche conviviale

QUANT À ÊTRE

Essayons maintenant un autre type de paramètres pour considérer tous ses avantages.
Créons le premier paramètre avec le type Choice Parameter, le second - Active Choices Reactive Reference Parameter. Dans le paramètre de type Choice, nous ajouterons manuellement dans le champ Choices les noms des référentiels où est stocké le code de nos microservices.

Créer des paramètres dynamiques dans un job Jenkins, ou comment rendre votre tâche conviviale

Si le public aime cet article, dans le prochain article, je décrirai le processus de configuration des tâches dans Jenkins, en utilisant une description via le code (Configuration as code), c'est-à-dire nous n'aurons pas besoin de saisir manuellement les noms des référentiels et de créer des paramètres, tout se fera automatiquement (notre code recevra une liste de référentiels de SCM et créera un paramètre avec cette liste).

Les valeurs du deuxième paramètre seront remplies dynamiquement, en fonction de la valeur prise par le premier paramètre (test1 ou test2), car chaque référentiel possède sa propre liste de commits.

Paramètre de référence réactif de choix actifs a les champs suivants à remplir :

  1. Nom - le nom du paramètre.
  2. scénario – code qui sera exécuté à chaque fois que la valeur du paramètre du champ Paramètre référencé est modifiée (dans notre cas, lorsque nous choisissons entre test1 et test2).
  3. Description – brève description du paramètre.
  4. Type de choix – le type d'objet renvoyé par le script (dans notre cas nous renverrons du code html).
  5. Paramètre référencé – le nom du paramètre dont la valeur est modifiée, le code de la section Script sera exécuté.

Créer des paramètres dynamiques dans un job Jenkins, ou comment rendre votre tâche conviviale

Passons directement au remplissage du champ le plus important de ce paramètre. Deux types de mise en œuvre nous sont proposés : en utilisant Script Groovy ou Script du scripteur.
Nous choisissons le premier, puisque Scriptler n'est qu'un plugin qui enregistre les scripts que vous avez précédemment écrits et vous permet de les utiliser dans d'autres tâches sans les copier-coller à nouveau.

Code Groovy pour obtenir tous les commits du référentiel sélectionné :

AUTH = "логин и пароль в Base64"                           
GIT_URL = "url до вашей SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "имя проектной области, где находятся репозитории"

def htmlBuild() {
    html = """
            <html>
            <head>
            <meta charset="windows-1251">
            <style type="text/css">
            div.grayTable {
            text-align: left;
            border-collapse: collapse;
            }
            .divTable.grayTable .divTableCell, .divTable.grayTable .divTableHead {
            padding: 0px 3px;
            }
            .divTable.grayTable .divTableBody .divTableCell {
            font-size: 13px;
            }
            </style>
            </head>
            <body>
        """

    def commitOptions = ""
    getCommitsForMicroservice(MICROSERVICE_NAME).each {
        commitOptions += "<option style='font-style: italic' value='COMMIT=${it.getKey()}'>${it}</option>"
    }
    html += """<p style="display: inline-block;">
        <select id="commit_id" size="1" name="value">
            ${commitOptions}
        </select></p></div>"""

    html += """
            </div>
            </div>
            </div>
            </body>
            </html>
         """
    return html
}

def getCommitsForMicroservice(microserviceRepo) {
    def commits = [:]
    def endpoint = GIT_URL + "/rest/api/1.0/projects/${PROJECT_NAME}/repos/${microserviceRepo}/commits"
    def conn = new URL(endpoint).openConnection()
    conn.setRequestProperty("Authorization", "Basic ${AUTH}")
    def response = new groovy.json.JsonSlurper().parseText(conn.content.text)
    response.values.each {
        commits.put(it.displayId, it.message)
    }
    return commits
}

return htmlBuild()

Sans entrer dans les détails, ce code reçoit le nom du microservice (MICROSERVICE_NAME) en entrée et envoie une requête à bitbucket (méthode getCommitsForMicroservice) à l'aide de son API, et obtient l'identifiant et le message de validation de toutes les validations pour un microservice donné.
Comme mentionné précédemment, ce code doit renvoyer du code HTML qui sera affiché sur la page Construire avec des paramètres dans Jenkins, nous enveloppons donc toutes les valeurs reçues de Bitbucket dans une liste et les ajoutons pour les sélectionner.

Après avoir terminé toutes les étapes, nous devrions obtenir une si belle page Construire avec des paramètres.

Si vous avez sélectionné le microservice test1 :

Créer des paramètres dynamiques dans un job Jenkins, ou comment rendre votre tâche conviviale

Si vous avez sélectionné le microservice test2 :

Créer des paramètres dynamiques dans un job Jenkins, ou comment rendre votre tâche conviviale

Convenez qu'il sera beaucoup plus pratique pour l'utilisateur d'interagir avec votre tâche de cette manière que de copier l'URL à chaque fois et de rechercher l'ID de validation requis.

PS Cet article fournit un exemple très simplifié, qui peut ne pas être d'une utilité pratique sous cette forme, car les assemblages ont beaucoup plus de paramètres différents, mais le but de cet article était de montrer comment fonctionne l'outil, et non de fournir une solution efficace.

PSS Comme je l'ai écrit plus tôt, si cet article est utile, le prochain portera sur configuration dynamique des tâches Jenkins via du code.

Source: habr.com

Ajouter un commentaire