Vytvorenie dynamických parametrov v Jenkins job, alebo ako spraviť vašu úlohu user-friendly

Dobrý deň, Habr!

Dnes by som sa chcel podeliť o jeden zo spôsobov, ako pomocou Active Choices Plugin uskutočniť úlohu v Jenkins najviac jednotnom a užívateľsky prívetivom formáte.

Úvod

Skratka DevOps už dávno nie je novinkou pre IT komunitu. U mnohých ľudí sa fráza „urobiť DevOps“ spája s nejakým magickým tlačidlom, ktorým kliknutím sa kód aplikácie automaticky premení na nasadenú a testovanú aplikáciu (v skutočnosti je to všetko zložitejšie, ale abstrahujeme od všetkých procesov).

Takže sme dostali objednávku na vytvorenie takého magického tlačidla, aby administrátori mohli nasadiť aplikáciu na jedno kliknutie. Existujú rôzne spôsoby realizácie tejto úlohy: od napísania bota pre niektorého z messengerov až po vyvinutie samostatnej aplikácie. Napriek tomu je cieľom všetkého jediné – spraviť spustenie kompilácie a nasadenia aplikácie čo najpriehľadnejšie a najpohodlnejšie.

V našom prípade budeme používať Jenkins.


Vytvorenie dynamických parametrov v Jenkins job, alebo ako spraviť vašu úlohu user-friendly

Úloha

Vytvoriť pohodlnú Jenkins úlohu, ktorá spustí kompiláciu a (alebo) nasadenie vybraného mikroslužby určitej verzie.

Vytvorenie dynamických parametrov v Jenkins job, alebo ako spraviť vašu úlohu user-friendly

Vstupy

Máme niekoľko repozitárov, v ktorých leží zdrojový kód rôznych mikroslužieb.

Definovanie parametrov

Na vstup našej úlohe by mali prichádzať nasledujúce parametre:

  1. URL repozitára s kódom mikroslužby, ktorú chceme skompilovať a nasadiť pri spustení úlohy.
  2. ID commitu, z ktorého sa bude kompilácia vykonávať.

AS IS

Najjednoduchší spôsob, ako splniť stanovenú úlohu, je vytvoriť dva parametre s typom String.

Vytvorenie dynamických parametrov v Jenkins job, alebo ako spraviť vašu úlohu user-friendly

V tomto prípade bude používateľ musieť manuálne zadať cestu k repozitáru a ID commitu, čo, uznajme, nie je úplne pohodlné.

Vytvorenie dynamických parametrov v Jenkins job, alebo ako spraviť vašu úlohu user-friendly

AS TO BE

A teraz vyskúšajme iný typ parametrov, aby sme zvážili všetky jeho výhody.
Vytvoríme prvý parameter s typom Choice Parameter, druhý — Active Choices Reactive Reference Parameter. Do parametra s typom Choice manuálne pridáme do poľa Choices mená repozitárov, kde je uložený kód našich mikroslužieb.

Vytvorenie dynamických parametrov v Jenkins job, alebo ako spraviť vašu úlohu user-friendly

Ak táto článok zaujal publikum, v nasledujúcom článku opíšem proces konfigurácie úloh v Jenkins, používajúc popis cez kód (Configuration as code), t.j. nebudeme musieť manuálne zadávať názvy repozitárov a vytvárať parametre, všetko sa udeje automaticky (náš kód získa zoznam repozitárov z SCM a vytvorí parameter s týmto zoznamom).

Hodnoty druhého parametra sa budú dynamicky napĺňať v závislosti od toho, akú hodnotu preberie prvý parameter (test1 alebo test2), veď každý repozitár má svoj vlastný zoznam commitov.

Active Choices Reactive Reference Parameter má nasledujúce polia na vyplnenie:

  1. Názov – názov parametra.
  2. Script – kód, ktorý sa vykoná vždy, keď sa zmení hodnota parametra z poľa Referenced parameter (v našom prípade, keď budeme vyberať medzi test1 a test2).
  3. Description – krátky popis parametra.
  4. Choice Type – typ objektu vracaného skriptom (v našom prípade budeme vracať html kód).
  5. Referenced parameter – názov parametra, pri zmene hodnoty ktorého sa vykoná kód z sekcie Script.

Vytvorenie dynamických parametrov v Jenkins job, alebo ako spraviť vašu úlohu user-friendly

Prejdeme priamo k vyplneniu najdôležitejšieho poľa v tomto parametri. Na výber máme dve možnosti implementácie: použitie Groovy Script alebo Scriptler Script.
Vyberáme prvé, pretože Scriptler je iba plugin, ktorý uchováva už predtým napísané skripty a umožňuje ich používať v iných úlohách bez opakovaného copy-past.

Groovy kód na získanie všetkých commitov z vybraného repozitára:

AUTH = "používateľské meno a heslo v Base64"                           
GIT_URL = "url na vašu SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "názov projektového priestoru, kde sa nachádzajú repozitáre"

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

Ak sa nebudeme zaoberať detailmi, tento kód získa na vstupe názov mikroslužby (MICROSERVICE_NAME), pošle požiadavku na Bitbucket (metóda getCommitsForMicroservice), využívajúc jeho API, a získa id a commit message všetkých commitov pre túto mikroslužbu.
Ako už bolo spomenuté, tento kód by mal vracať html, ktoré sa zobrazí na stránke Build with Parameters v Jenkins, preto všetky získané hodnoty z Bitbucket obalíme do zoznamu a pridáme do select.

Po vykonaní všetkých akcií by sme mali získať takúto peknú stránku Build with Parameters.

Ak sme vybrali mikroslužbu test1:

Vytvorenie dynamických parametrov v Jenkins job, alebo ako spraviť vašu úlohu user-friendly

Ak sme vybrali mikroslužbu test2:

Vytvorenie dynamických parametrov v Jenkins job, alebo ako spraviť vašu úlohu user-friendly

Súhlasíte, že používateľovi bude omnoho pohodlnejšie interagovať s vašou úlohou týmto spôsobom, ako každý raz kopírovať url a hľadať potrebný commit id.

P.S. V tomto článku je uvedený veľmi zjednodušený príklad, ktorý možno nemá praktické využitie v tejto podobe, pretože zostavy majú oveľa viac rôznych parametrov, ale cieľom tohto článku bolo ukázať fungovanie nástroja, a nie poskytnúť funkčné riešenie.

P.S.S. Ako som už predtým písal, ak bude tento článok užitočný, nasledujúci bude o dynamickom konfigurácii úloh Jenkins pomocou kódu.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster