Crearea parametrilor dinamici în job-ul Jenkins, sau cum să faci sarcina ta user-friendly

Bună ziua, Habr!

Astăzi aș dori să împărtășesc una dintre modalitățile de a utiliza Active Choices Plugin pentru a face sarcina în Jenkins cea mai uniformă și ușor de înțeles pentru utilizator.

Introducere

Acronimul DevOps nu mai este demult un concept nou pentru comunitatea IT. Pentru mulți oameni, fraza „a realiza DevOps” este asociată cu un fel de buton magic, apăsând pe care codul aplicației se transformă automat într-o aplicație desfășurată și testată (totul este de fapt mai complicat, dar ne vom abține de la toate procesele).

Așadar, am primit comanda de a crea un astfel de buton magic, astfel încât administratorii să poată desfășura aplicația cu un singur clic. Există diverse modalități de implementare a acestei sarcini: de la scrierea unui bot pentru unul dintre mesageri până la dezvoltarea unei aplicații separate. Totuși, scopul acestora este același – de a face lansarea compilării și desfășurarea aplicației cât mai transparentă și convenabilă.

În cazul nostru, vom folosi Jenkins.


Crearea parametrilor dinamici în job-ul Jenkins, sau cum să faci sarcina ta user-friendly

Sarcină

Crearea unei sarcini Jenkins convenabile, care va lansa compilarea și/sau desfășurarea unui microserviciu ales, de o anumită versiune.

Crearea parametrilor dinamici în job-ul Jenkins, sau cum să faci sarcina ta user-friendly

Date de intrare

Avem câteva depozite în care se află codul sursă al diferitelor microservicii.

Definirea parametrilor

La intrarea în sarcina noastră, trebuie să vină următorii parametri:

  1. URL-ul depozitului cu codul microserviciului pe care dorim să-l compilăm și să-l desfășurăm la lansarea sarcinii.
  2. ID-ul commit-ului din care va proveni compilarea.

AS IS

Cel mai simplu mod de a realiza sarcina dată este să creăm doi parametri de tip String.

Crearea parametrilor dinamici în job-ul Jenkins, sau cum să faci sarcina ta user-friendly

În acest caz, utilizatorul va trebui să introducă manual calea către depozit și ID-ul commit-ului, ceea ce, admiteți, nu este tocmai convenabil.

Crearea parametrilor dinamici în job-ul Jenkins, sau cum să faci sarcina ta user-friendly

AS TO BE

Și acum să încercăm un alt tip de parametrii, pentru a examina toate avantajele sale.
Vom crea primul parametru cu tipul Choice Parameter, iar al doilea - Active Choices Reactive Reference Parameter. În parametrul cu tipul Choice, vom adăuga manual în câmpul Choices numele depozitelor în care se află codul microserviciilor noastre.

Crearea parametrilor dinamici în job-ul Jenkins, sau cum să faci sarcina ta user-friendly

Dacă acest articol va plăcea publicului, în articolul următor voi descrie procesul de configurare a sarcinilor în Jenkins, folosind descrierea prin cod (Configuration as code), adică nu va trebui să introducem manual numele repository-urilor și să creăm parametrii, totul se va întâmpla automat (codul nostru va obține lista repository-urilor din SCM și va crea un parametru cu această listă).

Valorile celui de-al doilea parametru vor fi umplute dinamic, în funcție de valoarea pe care o va lua primul parametru (test1 sau test2), deoarece fiecare repository are propria listă de commit-uri.

Active Choices Reactive Reference Parameter are următoarele câmpuri de completat:

  1. Name – numele parametrului.
  2. Script – codul care va fi executat de fiecare dată când valoarea parametrului din câmpul Referenced parameter se va schimba (în cazul nostru, când vom alege între test1 și test2).
  3. Description – o scurtă descriere a parametrului.
  4. Choice Type – tipul obiectului returnat de script (în cazul nostru, vom returna cod html).
  5. Referenced parameter – numele parametrului, la modificarea cărui valoare va fi executat codul din secțiunea Script.

Crearea parametrilor dinamici în job-ul Jenkins, sau cum să faci sarcina ta user-friendly

Să trecem direct la completarea celui mai important câmp din acest parametru. La alegere ne sunt oferite două tipuri de implementare: utilizarea Groovy Script sau Scriptler Script.
Alegem prima opțiune, deoarece Scriptler este doar un plugin care salvează scripturile pe care le-ați scris anterior și vă permite să le utilizați în alte sarcini fără a fi nevoie de copiere și lipire repetată.

Cod Groovy pentru a obține toate commit-urile din repository-ul selectat:

AUTH = "login și parolă în Base64"                           
GIT_URL = "url-ul pentru SCM-ul dumneavoastră (https://bitbucket.org/)"                       
PROJECT_NAME = "numele domeniului de proiect, unde se află repozitoarele"

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

Fără a intra în detalii, acest cod primește ca input numele microserviciului (MICROSERVICE_NAME), trimite o cerere în Bitbucket (metoda getCommitsForMicroservice), folosind API-ul său, și obține id-ul și mesajul commit-ului pentru toate commit-urile acestui microserviciu.
Așa cum s-a menționat anterior, acest cod ar trebui să returneze html, care va fi afișat pe pagina Build with Parameters în Jenkins, așa că toate valorile obținute din Bitbucket sunt învelite într-o listă și adăugate în select.

După finalizarea tuturor acțiunilor, ar trebui să obținem o pagină frumoasă Build with Parameters.

Dacă am ales microserviciul test1:

Crearea parametrilor dinamici în job-ul Jenkins, sau cum să faci sarcina ta user-friendly

Dacă am ales microserviciul test2:

Crearea parametrilor dinamici în job-ul Jenkins, sau cum să faci sarcina ta user-friendly

Sunteți de acord că utilizatorului îi va fi mult mai convenabil să interacționeze cu sarcina dumneavoastră în acest mod decât să copieze de fiecare dată URL-ul și să caute commit id-ul dorit.

P.S. Acest articol oferă un exemplu foarte simplificat, care, probabil, nu are aplicabilitate practică în această formă, deoarece configurațiile au mult mai multe variante diferite, dar scopul acestui articol a fost să ilustreze funcționarea instrumentului, nu să ofere o soluție funcțională.

P.S.S. Așa cum am menționat anterior, dacă acest articol va fi util, următorul va fi despre configurarea dinamică a sarcinilor Jenkins prin intermediul codului.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster