Crearea parametrilor dinamici într-un job Jenkins sau cum să vă faceți sarcina ușor de utilizat

O zi buna, Habr!

Astăzi aș dori să vă împărtășesc una dintre modalitățile de utilizare Plugin Active Choices face sarcina în Jenkins cel mai unificat și mai ușor de utilizat.

Introducere

O astfel de abreviere precum DevOps nu mai este ceva nou pentru comunitatea IT. Pentru mulți oameni, expresia „do DevOps” este asociată cu un fel de buton magic, atunci când este apăsat, codul aplicației se transformă automat într-o aplicație implementată și testată (totul este de fapt mai complicat, dar facem abstracție de la toate procesele).

Așadar, am primit o comandă de a face un astfel de buton magic, astfel încât administratorii să poată implementa aplicația cu un singur clic. Există diferite tipuri de implementare a acestei sarcini: de la scrierea unui bot pentru oricare dintre mesageria instantanee până la dezvoltarea unei aplicații separate. Cu toate acestea, toate acestea au același scop - de a face pornirea construcției și implementării aplicației cât mai transparentă și convenabilă posibil.

În cazul nostru vom folosi Jenkins.


Crearea parametrilor dinamici într-un job Jenkins sau cum să vă faceți sarcina ușor de utilizat

Sarcină

Creați un job Jenkins convenabil care va lansa construirea și (sau) implementarea microserviciului selectat al unei anumite versiuni.

Crearea parametrilor dinamici într-un job Jenkins sau cum să vă faceți sarcina ușor de utilizat

Date de intrare

Avem mai multe depozite care conțin codul sursă al diferitelor microservicii.

Definirea parametrilor

Următorii parametri ar trebui să fie primiți ca intrare în munca noastră:

  1. Adresa URL a depozitului cu codul de microserviciu pe care dorim să îl construim și să îl implementăm atunci când rulăm jobul.
  2. ID-ul commit-ului de la care va avea loc construirea.

Aşa cum este

Cel mai simplu mod de a realiza această sarcină este de a crea doi parametri de tip String.

Crearea parametrilor dinamici într-un job Jenkins sau cum să vă faceți sarcina ușor de utilizat

În acest caz, utilizatorul va trebui să introducă manual calea către depozit și ID-ul de comitere, ceea ce, vedeți, nu este în întregime convenabil.

Crearea parametrilor dinamici într-un job Jenkins sau cum să vă faceți sarcina ușor de utilizat

CA A FI

Acum să încercăm un alt tip de parametri pentru a lua în considerare toate avantajele acestuia.
Să creăm primul parametru cu tipul Choice Parameter, al doilea - Active Choices Reactive Reference Parameter. În parametrul cu tipul Choice, vom adăuga manual în câmpul Choices numele depozitelor în care este stocat codul microserviciilor noastre.

Crearea parametrilor dinamici într-un job Jenkins sau cum să vă faceți sarcina ușor de utilizat

Dacă publicului îi place acest articol, atunci în articolul următor voi descrie procesul de configurare a sarcinilor în Jenkins, folosind o descriere prin cod (Configuration as code), adică. nu va trebui să introducem manual nume de depozite și să creăm parametri, totul se va întâmpla automat (codul nostru va primi o listă de depozite de la SCM și va crea un parametru cu această listă).

Valorile celui de-al doilea parametru vor fi completate dinamic, în funcție de valoarea primului parametru (test1 sau test2), deoarece fiecare depozit are propria sa listă de commit-uri.

Parametru de referință reactiv Opțiuni active are de completat următoarele câmpuri:

  1. Nume si Prenume – numele parametrului.
  2. Scenariu – cod care va fi executat de fiecare dată când se modifică valoarea parametrului din câmpul Parametru referit (în cazul nostru, când alegem între test1 și test2).
  3. Descriere – o scurtă descriere a parametrului.
  4. Tip de alegere – tipul de obiect returnat de script (în cazul nostru vom returna cod html).
  5. Parametru referit – numele parametrului, când se modifică valoarea, se va executa codul din secțiunea Script.

Crearea parametrilor dinamici într-un job Jenkins sau cum să vă faceți sarcina ușor de utilizat

Să trecem direct la completarea celui mai important câmp din acest parametru. Ni se oferă două tipuri de implementare din care să alegem: utilizarea Script groovy sau Scriptler Script.
Îl alegem pe primul, 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 copia și lipi din nou.

Cod groovy pentru a obține toate commit-urile din depozitul selectat:

AUTH = "логин и пароль в Base64"                           
GIT_URL = "url до вашей SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "имя проектной области, где находятся репозитории"

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 numele microserviciului (MICROSERVICE_NAME) ca intrare și trimite o solicitare către BitBucket (metodă getCommitsForMicroservice) folosind API-ul său și primește ID-ul și mesajul de comitere al tuturor comiterilor pentru un anumit microserviciu.
După cum am menționat mai devreme, acest cod ar trebui să returneze html care va fi afișat pe pagină Construiți cu parametri în Jenkins, așa că împachetăm toate valorile primite de la Bitbucket într-o listă și le adăugăm pentru a le selecta.

După parcurgerea tuturor pașilor, ar trebui să obținem o pagină atât de frumoasă Construiți cu parametri.

Dacă ați selectat test1 microserviciu:

Crearea parametrilor dinamici într-un job Jenkins sau cum să vă faceți sarcina ușor de utilizat

Dacă ați selectat test2 microserviciu:

Crearea parametrilor dinamici într-un job Jenkins sau cum să vă faceți sarcina ușor de utilizat

Sunteți de acord că va fi mult mai convenabil pentru utilizator să interacționeze cu sarcina dvs. în acest fel decât să copieze adresa URL de fiecare dată și să caute ID-ul de comitere necesar.

PS Acest articol oferă un exemplu foarte simplificat, care poate să nu fie de folos practic în această formă, deoarece ansamblurile au mult mai mulți parametri diferiți, dar scopul acestui articol a fost de a arăta cum funcționează instrumentul, nu de a oferi o soluție de lucru.

PSS După cum am scris mai devreme, dacă acest articol este util, atunci următorul va fi despre configurarea dinamică a sarcinilor Jenkins prin cod.

Sursa: www.habr.com

Adauga un comentariu