Oprettelse af dynamiske parametre i et Jenkins job, eller hvordan du gør din opgave brugervenlig

God dag, Habr!

I dag vil jeg gerne dele en af ​​måderne, hvordan man bruger Aktive valg plugin udføre opgaven i Jenkins den mest ensartede og forståelige for brugeren.

Indledning

Sådan en forkortelse som DevOps er ikke noget nyt for it-miljøet i lang tid. For mange mennesker er sætningen "lav DevOps" forbundet med en slags magisk knap, når der klikkes på den, bliver applikationskoden automatisk til en installeret og testet applikation (det er faktisk mere kompliceret, men vi abstraherer fra alle processer).

Så vi modtog en ordre om at lave sådan en magisk knap, så administratorer kan implementere applikationen med et enkelt klik. Der er forskellige typer implementering af denne opgave: startende fra at skrive en bot til nogen af ​​budbringerne og slutte med udviklingen af ​​en separat applikation. Ikke desto mindre er målet med alt dette det samme - at gøre lanceringen af ​​​​samlingen og implementeringen af ​​applikationen så gennemsigtig og bekvem som muligt.

I vores tilfælde vil vi bruge Jenkins.


Oprettelse af dynamiske parametre i et Jenkins job, eller hvordan du gør din opgave brugervenlig

Opgave

Opret et praktisk Jenkins-job, der vil køre sammensætningen og (eller) implementeringen af ​​den valgte mikroservice af en bestemt version.

Oprettelse af dynamiske parametre i et Jenkins job, eller hvordan du gør din opgave brugervenlig

Indtast data

Vi har flere repositories, der indeholder kildekoden til forskellige mikrotjenester.

Definition af parametre

Input af vores job bør modtage følgende parametre:

  1. URL'en på lageret med mikroservicekoden, som vi vil bygge og implementere, når vi kører jobbet.
  2. ID'et for den forpligtelse, der skal bygges ud fra.

SOM DET ER

Den nemmeste måde at udføre denne opgave på er at oprette to parametre af typen String.

Oprettelse af dynamiske parametre i et Jenkins job, eller hvordan du gør din opgave brugervenlig

I dette tilfælde skal brugeren manuelt indtaste stien til depotet og commit-id'et, hvilket du kan se, ikke er særlig praktisk.

Oprettelse af dynamiske parametre i et Jenkins job, eller hvordan du gør din opgave brugervenlig

SOM AT VÆRE

Lad os nu prøve en anden type parametre for at se alle dens fordele.
Lad os oprette den første parameter med typen Choice Parameter, den anden - Active Choices Reactive Reference Parameter. I parameteren med Choice-typen vil vi manuelt tilføje navnene på depoterne i feltet Choices, hvor koden for vores mikrotjenester er gemt.

Oprettelse af dynamiske parametre i et Jenkins job, eller hvordan du gør din opgave brugervenlig

Hvis publikum kan lide denne artikel, så vil jeg i den næste artikel beskrive processen med at konfigurere opgaver i Jenkins ved hjælp af beskrivelsen gennem koden (Configuration as code), dvs. vi behøver ikke manuelt at indtaste navnene på lagrene og oprette parametre, alt vil ske automatisk (vores kode vil hente listen over lagre fra SCM og oprette en parameter med denne liste).

Værdierne af den anden parameter vil blive udfyldt dynamisk, afhængigt af hvilken værdi den første parameter tager (test1 eller test2), fordi hvert lager har sin egen liste over commits.

Aktive valg Reaktiv referenceparameter har følgende felter at udfylde:

  1. Navn – parameternavn.
  2. Script - kode, der vil blive udført hver gang værdien af ​​parameteren fra feltet Referenced parameter ændres (i vores tilfælde, når vi vælger mellem test1 og test2).
  3. Beskrivelse – kort beskrivelse af parameteren.
  4. Valg Type - typen af ​​objektet, der returneres af scriptet (i vores tilfælde returnerer vi html-koden).
  5. refererede parameter – navnet på parameteren, når værdien ændres, vil koden fra Script-sektionen blive eksekveret.

Oprettelse af dynamiske parametre i et Jenkins job, eller hvordan du gør din opgave brugervenlig

Lad os fortsætte direkte med at udfylde det vigtigste felt i denne parameter. Vi tilbydes to typer implementering at vælge imellem: ved at bruge Groovy script eller Scriptler Script.
Vi vælger den første, da Scriptler blot er et plugin, der gemmer de scripts, du allerede har skrevet, og giver dig mulighed for at bruge dem i andre opgaver uden at kopiere og indsætte igen.

Groovy kode for at få alle commits fra et valgt lager:

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

Uden at gå i detaljer, modtager denne kode navnet på mikrotjenesten (MICROSERVICE_NAME) som input, sender en anmodning til Bitbucket (metode getCommitsForMicroservice) ved at bruge sin API og får id'et og commit-meddelelsen for alle commits for den givne mikrotjeneste.
Som nævnt tidligere, skal denne kode returnere den html, der vil blive vist på siden Byg med parametre i Jenkins, så vi pakker alle de modtagne værdier fra Bitbucket i en liste og føjer dem til det udvalgte.

Efter at have gennemført alle trinene, skulle vi få sådan en smuk side Byg med parametre.

Hvis du vælger test1-mikrotjenesten:

Oprettelse af dynamiske parametre i et Jenkins job, eller hvordan du gør din opgave brugervenlig

Hvis du vælger test2-mikrotjenesten:

Oprettelse af dynamiske parametre i et Jenkins job, eller hvordan du gør din opgave brugervenlig

Enig, at det vil være meget mere bekvemt for brugeren at interagere med din opgave på denne måde end at kopiere url'en hver gang og lede efter det påkrævede commit-id.

PS Denne artikel er et meget forenklet eksempel, som måske ikke er til praktisk brug i denne form, da samlinger har mange flere forskellige parametre, men formålet med denne artikel var at vise, hvordan værktøjet fungerer, ikke at give en fungerende løsning.

PSS Som jeg skrev tidligere, hvis denne artikel er nyttig, vil den næste handle om dynamisk konfiguration af Jenkins opgaver via kode.

Kilde: www.habr.com

Tilføj en kommentar