Erstellung dynamischer Parameter in Jenkins-Jobs oder wie Sie Ihre Aufgabe benutzerfreundlicher gestalten können

Guten Tag, Habr!

Heute möchte ich eine der Möglichkeiten teilen, wie man mit Hilfe von Active Choices Plugin eine Aufgabe in Jenkins der für den Benutzer am verständlichsten und einheitlichsten Weise erledigen kann.

Einführung

Der Begriff DevOps ist bereits seit geraumer Zeit im IT-Umfeld etabliert. Viele Menschen assoziieren den Satz „DevOps umsetzen“ mit einer Art Zaubertaste, bei deren Betätigung der Anwendungscode automatisch in eine bereitgestellte und getestete Anwendung umgewandelt wird (in Wirklichkeit ist es jedoch komplizierter, aber wir abstrahieren von allen Prozessen).

Also haben wir den Auftrag erhalten, eine solche Zaubertaste zu entwickeln, damit Administratoren die Anwendung mit einem Klick bereitstellen können. Es gibt verschiedene Ansätze zur Realisierung dieser Aufgabe: von der Programmierung eines Bots für einen Messenger bis hin zur Entwicklung einer eigenständigen Anwendung. Dennoch haben alle diese Ansätze dasselbe Ziel – den Start der Erstellung und Bereitstellung der Anwendung so transparent und benutzerfreundlich wie möglich zu gestalten.

In unserem Fall werden wir Jenkins.


Erstellung dynamischer Parameter in Jenkins-Jobs oder wie Sie Ihre Aufgabe benutzerfreundlicher gestalten können

Ziel

einen benutzerfreundlichen Jenkins-Job erstellen, der den Build und (oder) die Bereitstellung des ausgewählten Microservice einer bestimmten Version ausführt.

Erstellung dynamischer Parameter in Jenkins-Jobs oder wie Sie Ihre Aufgabe benutzerfreundlicher gestalten können

Eingabedaten

Wir haben mehrere Repositories, die den Quellcode verschiedener Mikrodienste enthalten.

Parameterdefinition

Folgende Parameter müssen als Eingabe für unseren Job bereitgestellt werden:

  1. Die URL des Repositories mit dem Quellcode des Mikrodienstes, den wir beim Start des Jobs bauen und bereitstellen möchten.
  2. Die Commit-ID, von der der Build erfolgen soll.

IST-Zustand

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

Erstellung dynamischer Parameter in Jenkins-Jobs oder wie Sie Ihre Aufgabe benutzerfreundlicher gestalten können

In diesem Fall muss der Benutzer den Pfad zum Repository und die Commit-ID manuell eingeben, was, wie Sie zugeben müssen, nicht ganz praktisch ist.

Erstellung dynamischer Parameter in Jenkins-Jobs oder wie Sie Ihre Aufgabe benutzerfreundlicher gestalten können

SOLL-Zustand

Jetzt probieren wir einen anderen Parametertyp aus, um alle Vorteile zu betrachten.
Wir erstellen den ersten Parameter vom Typ Wahlparameter und den zweiten – einen aktiven Wahl-Referenzparameter. Im Auswahlparameter fügen wir manuell die Namen der Repositories in das Feld Auswahl ein, in denen der Code unserer Mikrodienste gespeichert ist.

Erstellung dynamischer Parameter in Jenkins-Jobs oder wie Sie Ihre Aufgabe benutzerfreundlicher gestalten können

Wenn dieser Artikel bei der Leserschaft gut ankommt, werde ich im nächsten Artikel den Prozess der Konfiguration von Aufgaben in Jenkins beschreiben, unter Verwendung von Code-Definitionen (Configuration as Code). Das bedeutet, dass wir nicht manuell die Namen der Repositories eingeben und Parameter erstellen müssen; alles geschieht automatisch (unser Code wird die Liste der Repositories aus dem SCM abrufen und einen Parameter mit dieser Liste erstellen).

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

Active Choices Reactive Reference Parameter hat folgende Felder zur Eingabe:

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

Erstellung dynamischer Parameter in Jenkins-Jobs oder wie Sie Ihre Aufgabe benutzerfreundlicher gestalten können

Kommen wir direkt zur wichtigsten Einstellung in diesem Parameter. Uns werden zwei Arten der Implementierung angeboten: die Verwendung von Groovy Script oder Scriptler Script.
Wir wählen die erste Option, da Scriptler nur ein Plugin ist, das bereits geschriebene Skripte speichert und es ermöglicht, diese in anderen Aufgaben ohne erneutes Copy-Paste zu verwenden.

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

AUTH = "Login und Passwort in Base64"                           
GIT_URL = "URL zu Ihrer SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "Name des Projektbereichs, in dem sich die Repositories befinden"

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

Um es einfach zu halten, erhält dieser Code den Namen des Mikrodienstes (MICROSERVICE_NAME), sendet eine Anfrage an Bitbucket (Methode getCommitsForMicroservice), verwendet dessen API und erhält die ID und die Commit-Nachricht 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 verpacken wir alle erhaltenen Werte aus Bitbucket in eine Liste und fügen sie in das Select-Feld ein.

Nach der Durchführung aller Schritte sollten wir eine so ansprechende Seite erhalten: Build with Parameters.

Wenn der Mikrodienst test1 ausgewählt wurde:

Erstellung dynamischer Parameter in Jenkins-Jobs oder wie Sie Ihre Aufgabe benutzerfreundlicher gestalten können

Wenn der Mikrodienst test2 ausgewählt wurde:

Erstellung dynamischer Parameter in Jenkins-Jobs oder wie Sie Ihre Aufgabe benutzerfreundlicher gestalten können

Stimmen Sie zu, dass es für den Benutzer viel einfacher wäre, 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 stark vereinfachtes Beispiel vorgestellt, das möglicherweise in dieser Form keine praktische Anwendung hat, da Build-Konfigurationen viele verschiedene Parameter beinhalten. Das Ziel dieses Artikels war es, die Funktionsweise des Werkzeugs zu demonstrieren, nicht eine vollständige Lösung bereitzustellen.

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

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster