Guten Tag, Habr!
Heute möchte ich einen der Wege teilen, wie man mithilfe von 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.

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

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:
- URL des Repositories mit dem Code des Mikrodienstes, den wir bei der AusfĂŒhrung der Job zusammensetzen und bereitstellen wollen.
- 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.

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.

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.

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:
- Name â Parametername.
- 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).
- Beschreibung â kurze Beschreibung des Parameters.
- Choice Type â Typ des von dem Skript zurĂŒckgegebenen Objekts (in unserem Fall geben wir HTML-Code zurĂŒck).
- Referenced parameter â Name des Parameters, dessen WertĂ€nderung den Code aus dem Abschnitt Script ausfĂŒhren wird.

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:

Wenn wir den Mikrodienst test2 ausgewÀhlt haben:

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
