Erstellung dynamscher Parameter in Jenkins Jobs oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Guten Tag, Habr!

Heute möchte ich einen der Wege teilen, wie man mithilfe von Active Choices Plugin eine Aufgabe in Jenkins der benutzerfreundlichsten und verständlichsten Art und Weise umsetzen kann.

Einführung

Das Akronym DevOps ist für die IT-Community schon längst nichts Neues mehr. Viele Menschen verbinden den Ausdruck „DevOps umsetzen“ mit einer Art Zaubertaste, bei deren Betätigung der Anwendungscode automatisch in eine bereitgestellte und getestete Anwendung umgewandelt wird (in Wirklichkeit ist alles viel komplexer, aber wir abstrahieren von den gesamten Prozessen).

Wir haben also den Auftrag erhalten, solch eine Zaubertaste zu erstellen, damit Administratoren die Anwendung mit einem Klick bereitstellen können. Es gibt verschiedene Möglichkeiten, diese Aufgabe umzusetzen: angefangen bei der Erstellung eines Bots für einen der Messenger bis hin zur Entwicklung einer separaten Anwendung. Dennoch bleibt das Ziel dasselbe – den Start des Builds und die Bereitstellung der Anwendung so transparent und bequem wie möglich zu gestalten.

In unserem Fall werden wir nutzen Jenkins.


Erstellung dynamscher Parameter in Jenkins Jobs oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Aufgabe

Eine benutzerfreundliche Jenkins-Job zu erstellen, die den Build und (oder) das Deployment des ausgewählten Mikrodienstes in einer bestimmten Version startet.

Erstellung dynamscher Parameter in Jenkins Jobs oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Eingabedaten

Wir haben mehrere Repositories, in denen der Quellcode verschiedener Mikrodienste liegt.

Festlegung der Parameter

Die folgenden Parameter müssen in unsere Job eingegeben werden:

  1. URL des Repositories mit dem Code des Mikrodienstes, den wir bei der Ausführung der Job zusammensetzen und bereitstellen wollen.
  2. ID des Commits, von dem der Build erfolgen soll.

AS IS

Der einfachste Weg, die gestellte Aufgabe zu erfüllen, ist, zwei Parameter vom Typ String zu erstellen.

Erstellung dynamscher Parameter in Jenkins Jobs oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

In diesem Fall muss der Benutzer den Pfad zum Repository und die ID des Commits manuell eingeben, was, seien wir ehrlich, nicht gerade bequem ist.

Erstellung dynamscher Parameter in Jenkins Jobs oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

AS TO BE

Jetzt versuchen wir einen anderen Parameter-Typ, um alle seine Vorteile zu betrachten.
Wir erstellen den ersten Parameter vom Typ Choice Parameter, den zweiten – Active Choices Reactive Reference Parameter. In das Choice-Feld geben wir manuell die Namen der Repositories ein, in denen der Code unserer Mikrodienste gespeichert ist.

Erstellung dynamscher Parameter in Jenkins Jobs oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Wenn dieser Artikel dem Publikum gefällt, werde ich im nächsten Artikel den Prozess der Konfiguration von Aufgaben in Jenkins beschreiben, wobei ich die Beschreibung über Code (Configuration as code) verwenden werde, d.h. wir müssen die Repository-Namen nicht manuell eingeben und Parameter erstellen, alles wird automatisch geschehen (unser Code erhält die Liste der Repositories aus SCM und erstellt einen Parameter mit dieser Liste).

Die Werte des zweiten Parameters werden dynamisch ausgefüllt, abhängig davon, welchen Wert der erste Parameter (test1 oder test2) annimmt, denn jedes Repository hat seine eigene Liste von Commits.

Active Choices Reactive Reference Parameter hat folgende Felder zur Ausfüllung:

  1. Name – Parametername.
  2. Script – Code, der jedes Mal ausgeführt wird, wenn sich der Wert des Parameters im Feld Referenced parameter ändert (in unserem Fall, wenn wir zwischen test1 und test2 auswählen).
  3. Beschreibung – kurze Beschreibung des Parameters.
  4. Choice Type – Typ des von dem Skript zurückgegebenen Objekts (in unserem Fall geben wir HTML-Code zurück).
  5. Referenced parameter – Name des Parameters, dessen Wertänderung den Code aus dem Abschnitt Script ausführen wird.

Erstellung dynamscher Parameter in Jenkins Jobs oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Kommen wir direkt zum Ausfüllen des wichtigsten Feldes in diesem Parameter. Zur Auswahl stehen uns zwei Implementierungsarten: Verwendung von Groovy Script oder Scriptler Script.
Wir wählen das erste, da Scriptler nur ein Plugin ist, das bereits von Ihnen erstellte Skripte speichert und deren Verwendung in anderen Aufgaben ohne wiederholtes Copy-Paste ermöglicht.

Groovy-Code zum Abrufen aller Commits aus dem ausgewählten Repository:

AUTH = "Benutzername und Passwort in Base64"                           
GIT_URL = "URL zu Ihrem SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "Name des Projekt-Containers, in dem die Repositories liegen"

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()

Wenn wir nicht ins Detail gehen, dann erhält dieser Code den Namen des Mikrodienstes (MICROSERVICE_NAME), sendet eine Anfrage an Bitbucket (Methode getCommitsForMicroservice), indem er dessen API verwendet, und erhält die ID und den Commit-Message aller Commits für diesen Mikrodienst.
Wie bereits erwähnt, sollte dieser Code HTML zurückgeben, das auf der Seite Build with Parameters in Jenkins angezeigt wird, deshalb wickeln wir alle erhaltenen Werte aus Bitbucket in eine Liste und fügen sie in das Select-Element ein.

Nach all diesen Aktionen sollten wir eine so schöne Seite erhalten. Build with Parameters.

Wenn wir den Mikrodienst test1 ausgewählt haben:

Erstellung dynamscher Parameter in Jenkins Jobs oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Wenn wir den Mikrodienst test2 ausgewählt haben:

Erstellung dynamscher Parameter in Jenkins Jobs oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Sie werden zustimmen, dass es für den Benutzer viel angenehmer sein wird, auf diese Weise mit Ihrer Aufgabe zu interagieren, als jedes Mal die URL zu kopieren und die benötigte Commit-ID zu suchen.

P.S. In diesem Artikel wird ein sehr vereinfachtes Beispiel vorgestellt, das möglicherweise in dieser Form keine praktische Anwendung hat, da Assemblierungen weitaus mehr verschiedene Parameter aufweisen. Ziel dieses Artikels war es jedoch, die Funktionsweise des Werkzeugs zu demonstrieren und nicht eine sofortige Lösung anzubieten.

P.S.S. Wie bereits zuvor erwähnt, wenn dieser Artikel nützlich ist, wird der nächste über dynamische Konfiguration von Jenkins-Aufgaben über Code.

Quelle: habr.com

60GB SSD 8Gb DDR4