Dobrý den, Habr!
Dnes bych chtěl sdílet jeden z způsobů, jak pomocí provést úkol v Jenkins nejvíce sjednoceném a uživatelsky přívětivém formátu.
Úvod
Zkratka DevOps dávno není pro komunitu IT ničím novým. Pro mnohé lidí je fráze „udělat DevOps“ spojena s jakousi kouzelnou tlačítkem, po jehož stisknutí se kód aplikace automaticky promění v nasazenou a testovanou aplikaci (ve skutečnosti je všechno složitější, ale od všech procesů se nyní odpoutáme).
Takže jsme dostali objednávku na vytvoření takového kouzelného tlačítka, aby administrátoři mohli nasazovat aplikaci jedním kliknutím. Existují různé způsoby, jak tohoto úkolu dosáhnout: od napsání bota pro některý z messengerů až po vývoj samostatné aplikace. Nicméně cíl všech těchto snah je stejný – učinit spuštění sestavení a nasazení aplikace co nejtransparentnějším a nejpohodlnějším.
V našem případě budeme používat Jenkins.

Úkol
Vytvořit uživatelsky přívětivou úlohu Jenkins, která spustí sestavení a (nebo) nasazení vybraného mikroslužby určité verze.

Vstupní data
Máme několik repozitářů, ve kterých se nachází zdrojový kód různých mikroslužeb.
Definice parametrů
Naše úloha by měla přijímat následující parametry:
- URL repozitáře s kódem mikroslužby, kterou chceme sestavit a nasadit při spuštění úlohy.
- ID commitu, ze kterého bude probíhat sestavení.
AS IS
Nejjednodušší způsob, jak splnit daný úkol, je vytvořit dva parametry typu String.

V tomto případě bude uživatel muset ručně zadat cestu k repozitáři a ID commitu, což, uznejte, není zrovna pohodlné.

AS TO BE
A nyní zkusíme jiný typ parametrů, abychom prozkoumali všechny jeho výhody.
Vytvoříme první parametr typu Choice Parameter, druhý – Active Choices Reactive Reference Parameter. Do parametru typu Choice ručně přidáme názvy repozitářů, kde je uložen kód našich mikroslužeb.

Pokud se tento článek bude líbit publiku, v dalším článku popíšu proces konfigurace úloh v Jenkins pomocí popisu skrze kód (Configuration as code), tedy nebudeme muset ručně zadávat názvy repozitářů a vytvářet parametry, vše proběhne automaticky (náš kód získá seznam repozitářů ze SCM a vytvoří parametr s tímto seznamem).
Hodnoty druhého parametru se u nás budou plnit dynamicky, v závislosti na tom, jakou hodnotu přijme první parametr (test1 nebo test2), neboť každý repozitář má svůj vlastní seznam commitů.
Aktivní volby reaktivní referenční parametr má následující pole k vyplnění:
- Název – název parametru.
- Skript – kód, který bude vykonáván pokaždé, když se hodnota parametru v poli Referenced parameter změní (v našem případě, když budeme vybírat mezi test1 a test2).
- Popis – stručný popis parametru.
- Typ volby – typ objektu vráceného skriptem (v našem případě budeme vracet html kód).
- Odkazovaný parametr – název parametru, při změně jehož hodnoty se vykoná kód z části Skript.

Přejdeme přímo k vyplnění nejdůležitějšího pole v tomto parametru. Na výběr máme dvě varianty realizace: použití Groovy Script nebo Scriptler Script.
Volíme první, jelikož Scriptler je pouze plugin, který ukládá již dříve napsané skripty a umožňuje jejich použití v jiných úlohách bez opětovného copy-past.
Groovy kód pro získání všech commitů z vybraného repozitáře:
AUTH = "uživatelské jméno a heslo v Base64"
GIT_URL = "url k vašemu SCM (https://bitbucket.org/)"
PROJECT_NAME = "název projektové oblasti, kde se nacházejí repozitáře"
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()Pokud se nebudeme zabývat detaily, tento kód přijímá jako vstup název mikroslužby (MICROSERVICE_NAME), posílá žádost do Bitbucket (metoda getCommitsForMicroservice), používající její API, a získává id a commit message všech commitů pro danou mikroslužbu.
Jak již bylo zmíněno dříve, tento kód by měl vracet html, které bude zobrazeno na stránce Build with Parameters v Jenkins, proto všechny získané hodnoty z Bitbucket obalujeme do seznamu a přidáváme do select.
Po provedení všech kroků bychom měli získat takto krásnou stránku Build with Parameters.
Pokud jsme vybrali mikroslužbu test1:

Pokud jsme vybrali mikroslužbu test2:

Souhlasíte, že by bylo uživateli mnohem pohodlnější interagovat s vaší úlohou tímto způsobem, než pokaždé kopírovat url a hledat potřebné commit id.
P.S. V tomto článku je uveden velmi zjednodušený příklad, který možná nemá praktické využití v této podobě, protože sestavení má mnohem více různých parametrů, ale cílem tohoto článku bylo ukázat funkci nástroje, nikoli poskytnout hotové řešení.
P.S.S. Jak jsem již psal dříve, pokud bude tento článek užitečný, příští bude o dynamickém konfigurování úloh Jenkins pomocí kódu.
Zdroj: habr.com
