Jó napot kívánok, Habr!
Ma szeretném megosztani az egyik módszert, amellyel készíthetünk feladatot a Jenkins lehető legegységesebb és legátláthatóbb módon a felhasználó számára.
Bevezetés
A DevOps mozaikszó már régóta nem új a IT közösség számára. Sok ember számára a "DevOps végrehajtása" kifejezés egy varázsgombbal asszociálódik, amelynek megnyomásával az alkalmazás kódja automatikusan kiterjesztett és tesztelt alkalmazássá alakul (valójában minden bonyolultabb, de eltávolodunk az összes folytatástól).
Tehát kaptunk egy megbízást, hogy készítsünk ilyen varázsgombot, hogy a rendszergazdák egy kattintással telepíthessék az alkalmazást. Különböző megvalósítási módok léteznek: a botok írásától valamilyen üzenetküldő platformra egészen egy külön alkalmazás fejlesztéséig. Mindazonáltal a cél mindegyik esetben az, hogy a felépítési és telepítési folyamatot a lehető legátláthatóbbá és kényelmesebbé tegyük.
A mi esetünkben az Jenkins.

Feladat
az lesz, hogy egy kényelmes Jenkins job-ot készítünk, amely egy adott verziójú mikroszolgáltatás felépítését és (vagy) telepítését elindítja.

Bemeneti adatok
Több repozitóriumunk van, amelyben különböző mikroszolgáltatások forráskódja található.
Paraméterek meghatározása
A jobunkba a következő paramétereknek kell érkezniük:
- A mikroszolgáltatás kódjának repozitóriumának URL-je, amelyet fel szeretnénk építeni és telepíteni a job elindításakor.
- A commit azonosítója, amelyből a felépítés történik.
AS IS
A feladat elvégzésének legegyszerűbb módja – két String típusú paraméter létrehozása.

Ebben az esetben a felhasználónak manuálisan kell megadnia a repozitórium elérési útját és a commit azonosítót, ami, valljuk be, nem éppen kényelmes.

AS TO BE
Most próbáljuk ki egy másik paramétertípust, hogy feltárjuk az összes előnyét.
Hozzuk létre az első paramétert Choice Parameter típussal, a másodikat pedig Active Choices Reactive Reference Parameter-ként. A Choice paraméterhez manuálisan hozzáadjuk a Choices mezőbe a mikroszolgáltatások kódját tároló repozitóriumok nevét.

Ha ez a cikk tetszik a közönségnek, a következő cikkben bemutatom a feladatok konfigurálásának folyamatát a Jenkinsben, kódon keresztüli leírással (Configuration as code), azaz nem kell kézzel beírnunk a tárolók neveit és létrehoznunk a paramétereket, ez mind automatikusan történik (kódunk a SCM-ből kapja meg a tárolók listáját, és létrehozza a paramétert ezzel a listával).
A második paraméter értékei dinamikusan fognak feltöltődni, attól függően, hogy az első paraméter (test1 vagy test2) milyen értéket vesz fel, mivel minden tárolónak saját commit listája van.
Active Choices Reactive Reference Parameter az alábbi mezőket kell kitölteni:
- Név – a paraméter neve.
- Script – a kód, ami minden alkalommal végrehajtódik, amikor a Referenced parameter mező paraméter értéke megváltozik (a mi esetünkben, amikor a test1 és test2 között választunk).
- Leírás – a paraméter rövid leírása.
- Choice Type – a script által visszaadott objektum típusa (a mi esetünkben HTML kódot fogunk visszaadni).
- Referenced parameter – a paraméter neve, amelynek értéke megváltozása esetén végrehajtódik a Script szakaszbeli kód.

Most pedig térjünk rá a legfontosabb mező kitöltésére ebben a paraméterben. Kétféle megvalósítást kínálnak nekünk: a Groovy Script vagy Scriptler Script.
Az elsőt választjuk, mivel a Scriptler csupán egy plugin, amely a már korábban írt scriptjeidet tárolja, és lehetővé teszi azok használatát más feladatokban anélkül, hogy újra másolnád és beillesztenéd.
Groovy kód a kiválasztott tárolóból származó összes commit megszerzésére:
AUTH = "a felhasználónév és jelszó Base64 formátumban"
GIT_URL = "a SCM URL-je (https://bitbucket.org/)"
PROJECT_NAME = "a projektterület neve, ahol a tárolók találhatóak"
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()Ha nem merülünk el a részletekben, ez a kód bemeneti paraméterként megkapja a mikroszolgáltatás nevét (MICROSERVICE_NAME), és lekérdezést küld a Bitbucket (method getCommitsForMicroservice), az API-ját használva, és visszakapja a megadott mikroszolgáltatás összes commitjának id-ját és commit üzenetét.
Ahogy már említettem, ennek a kódnak HTML-t kell visszaadnia, amely a Jenkins Build with Parameters oldalán fog megjelenni, ezért a Bitbucketből megszerzett összes értéket egy listába csomagolunk, majd hozzáadjuk a select-hez.
Mindezek végrehajtása után egy ilyen szép oldalnak kell kialakulnia: Build with Parameters.
Ha a test1 mikroszolgáltatást választottuk:

Ha a test2 mikroszolgáltatást választottuk:

Egyetértenek, hogy a felhasználónak sokkal kényelmesebb így interakcióba lépni a feladatoddal, mint minden alkalommal lemásolni az URL-t és keresni a megfelelő commit id-t.
P.S. Ebben a cikkben egy nagyon leegyszerűsített példát mutatunk be, amely lehet, hogy így, ebben a formában nem rendelkezik gyakorlati alkalmazással, mivel a beállítások sokkal több különböző paramétert tartalmaznak, de a cikk célja az eszköz működésének bemutatása volt, nem pedig egy működő megoldás nyújtása.
P.S.S. Ahogy korábban írtam, ha ez a cikk hasznos lesz, akkor a következő a Jenkins feladatok dinamikus konfigurálása kód segítségével.
Forrás: habr.com
