Erstellen Sie dynamische Parameter in einem Jenkins-Job oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Guten Tag, Habr!

Heute möchte ich Ihnen eine der Verwendungsmöglichkeiten vorstellen Active Choices-Plugin Erledige die Aufgabe in Jenkins das einheitlichste und verständlichste für den Benutzer.

Einführung

Eine solche Abkürzung wie DevOps ist für die IT-Community schon lange nichts Neues. Für viele Menschen ist der Ausdruck „DevOps erstellen“ mit einer Art magischem Knopf verbunden, bei dem sich der Anwendungscode automatisch in eine bereitgestellte und getestete Anwendung verwandelt (es ist eigentlich komplizierter, aber wir abstrahieren von allen Prozessen).

Daher erhielten wir den Auftrag, einen solchen magischen Knopf zu erstellen, damit Administratoren die Anwendung mit einem Klick bereitstellen können. Es gibt verschiedene Arten der Umsetzung dieser Aufgabe: angefangen beim Schreiben eines Bots für einen der Messenger bis hin zur Entwicklung einer separaten Anwendung. Dennoch ist das Ziel bei alledem dasselbe: den Start, die Zusammenstellung und Bereitstellung der Anwendung so transparent und bequem wie möglich zu gestalten.

In unserem Fall verwenden wir Jenkins.


Erstellen Sie dynamische Parameter in einem Jenkins-Job oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Aufgabe

Erstellen Sie einen praktischen Jenkins-Job, der die Assembly und (oder) Bereitstellung des ausgewählten Microservices einer bestimmten Version ausführt.

Erstellen Sie dynamische Parameter in einem Jenkins-Job oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Eingabedaten

Wir verfügen über mehrere Repositories, die den Quellcode verschiedener Microservices enthalten.

Parameter definieren

Der Input unseres Jobs sollte folgende Parameter erhalten:

  1. Die URL des Repositorys mit dem Microservice-Code, den wir beim Ausführen des Jobs erstellen und bereitstellen möchten.
  2. Die ID des Commits, aus dem erstellt werden soll.

WIE ES IST

Der einfachste Weg, diese Aufgabe zu erfüllen, besteht darin, zwei Parameter vom Typ String zu erstellen.

Erstellen Sie dynamische Parameter in einem Jenkins-Job oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

In diesem Fall muss der Benutzer den Pfad zum Repository und die Commit-ID manuell eingeben, was, wie Sie sehen, nicht sehr praktisch ist.

Erstellen Sie dynamische Parameter in einem Jenkins-Job oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

WIE SEIN

Probieren wir nun einen anderen Parametertyp aus, um alle Vorteile zu sehen.
Erstellen wir den ersten Parameter mit dem Typ „Choice Parameter“, den zweiten mit „Active Choices Reactive Reference Parameter“. Im Parameter mit dem Typ „Choice“ fügen wir manuell die Namen der Repositorys im Feld „Choices“ hinzu, in denen der Code unserer Microservices gespeichert ist.

Erstellen Sie dynamische Parameter in einem Jenkins-Job oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Wenn dem Publikum dieser Artikel gefällt, werde ich im nächsten Artikel den Prozess der Konfiguration von Aufgaben in Jenkins anhand der Beschreibung durch den Code (Konfiguration als Code) beschreiben, d. h. Wir müssen die Namen der Repositorys nicht manuell eingeben und Parameter erstellen, alles geschieht automatisch (unser Code ruft die Liste der Repositorys vom SCM ab und erstellt mit dieser Liste einen Parameter).

Die Werte des zweiten Parameters werden dynamisch gefüllt, je nachdem, welchen Wert der erste Parameter annimmt (test1 oder test2), da jedes Repository seine eigene Liste von Commits hat.

Active Choices Reaktiver Referenzparameter hat die folgenden Felder auszufüllen:

  1. Name und Vorname - Parametername.
  2. Skript – Code, der jedes Mal ausgeführt wird, wenn der Wert des Parameters aus dem Feld „Referenzierter Parameter“ geändert wird (in unserem Fall, wenn wir zwischen test1 und test2 wählen).
  3. Beschreibung – kurze Beschreibung des Parameters.
  4. Auswahltyp - der Typ des vom Skript zurückgegebenen Objekts (in unserem Fall geben wir den HTML-Code zurück).
  5. referenzierter Parameter – der Name des Parameters, bei dessen Wertänderung der Code aus dem Abschnitt „Skript“ ausgeführt wird.

Erstellen Sie dynamische Parameter in einem Jenkins-Job oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Fahren wir direkt mit dem Ausfüllen des wichtigsten Felds in diesem Parameter fort. Uns stehen zwei Arten der Implementierung zur Auswahl: Verwenden Grooviges Skript oder Scriptler-Skript.
Wir entscheiden uns für die erste Variante, da Scriptler nur ein Plugin ist, das die von Ihnen bereits geschriebenen Skripte speichert und es Ihnen ermöglicht, sie in anderen Aufgaben zu verwenden, ohne sie erneut zu kopieren und einzufügen.

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

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

Ohne auf Details einzugehen, empfängt dieser Code den Namen des Microservices (MICROSERVICE_NAME) als Eingabe und sendet eine Anfrage an Bit Bucket (Methode getCommitsForMicroservice) mithilfe seiner API und ruft die ID und Commit-Nachricht aller Commits für den angegebenen Microservice ab.
Wie bereits erwähnt, sollte dieser Code den HTML-Code zurückgeben, der auf der Seite angezeigt wird Mit Parametern erstellen in Jenkins, also packen wir alle von Bitbucket empfangenen Werte in eine Liste und fügen sie der Auswahl hinzu.

Nachdem wir alle Schritte ausgeführt haben, sollten wir eine so schöne Seite erhalten Mit Parametern erstellen.

Wenn Sie den Microservice test1 ausgewählt haben:

Erstellen Sie dynamische Parameter in einem Jenkins-Job oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Wenn Sie den Microservice test2 ausgewählt haben:

Erstellen Sie dynamische Parameter in einem Jenkins-Job oder wie Sie Ihre Aufgabe benutzerfreundlich gestalten

Stimmen Sie zu, dass es für den Benutzer viel bequemer ist, auf diese Weise mit Ihrer Aufgabe zu interagieren, als jedes Mal die URL zu kopieren und nach der erforderlichen Commit-ID zu suchen.

PS Dieser Artikel ist ein sehr vereinfachtes Beispiel, das in dieser Form möglicherweise keinen praktischen Nutzen hat, da Baugruppen viel mehr unterschiedliche Parameter haben. Der Zweck dieses Artikels bestand jedoch darin, die Funktionsweise des Tools zu zeigen, und nicht darin, eine funktionierende Lösung bereitzustellen.

Pss Wie ich bereits geschrieben habe: Wenn dieser Artikel nützlich ist, dann wird es im nächsten darum gehen dynamische Konfiguration von Jenkins-Aufgaben per Code.

Source: habr.com

Kommentar hinzufügen