Vytváření dynamických parametrů v Jenkins jobu, neboli jak udělat váš úkol uživatelsky přívětivý

Dobrý den, Habr!

Dnes bych chtěl sdílet jeden z způsobů, jak pomocí Active Choices Plugin 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.


Vytváření dynamických parametrů v Jenkins jobu, neboli jak udělat váš úkol uživatelsky přívětivý

Úkol

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

Vytváření dynamických parametrů v Jenkins jobu, neboli jak udělat váš úkol uživatelsky přívětivý

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:

  1. URL repozitáře s kódem mikroslužby, kterou chceme sestavit a nasadit při spuštění úlohy.
  2. 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.

Vytváření dynamických parametrů v Jenkins jobu, neboli jak udělat váš úkol uživatelsky přívětivý

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

Vytváření dynamických parametrů v Jenkins jobu, neboli jak udělat váš úkol uživatelsky přívětivý

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.

Vytváření dynamických parametrů v Jenkins jobu, neboli jak udělat váš úkol uživatelsky přívětivý

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í:

  1. Název – název parametru.
  2. 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).
  3. Popis – stručný popis parametru.
  4. Typ volby – typ objektu vráceného skriptem (v našem případě budeme vracet html kód).
  5. Odkazovaný parametr – název parametru, při změně jehož hodnoty se vykoná kód z části Skript.

Vytváření dynamických parametrů v Jenkins jobu, neboli jak udělat váš úkol uživatelsky přívětivý

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:

Vytváření dynamických parametrů v Jenkins jobu, neboli jak udělat váš úkol uživatelsky přívětivý

Pokud jsme vybrali mikroslužbu test2:

Vytváření dynamických parametrů v Jenkins jobu, neboli jak udělat váš úkol uživatelsky přívětivý

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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster