Tere hea päeva! Habr!
Täna soovin jagada üht viisi, kuidas kasutades teha ülesanne Jenkinsile kõige ühtlasemaks ja arusaadavamaks kasutajale.
Sissejuhatus
Selline lühend nagu DevOps ei ole IT kogukonna jaoks enam ammu midagi uut. Paljudele inimestele seondub fraas „teha DevOps” mingi maagilise nupuga, millele vajutades rakenduskood muudetakse automaatselt rakenduseks, mis on juurutatud ja testitud (kõik on tegelikult keerulisem, kuid me abstraheerime kõigist protsessidest).
Nii et saime tellimuse teha selline maagiline nupp, et administraatorid saaksid rakendust ühe klikiga juurutada. Selle ülesande täitmiseks on erinevaid lahendusi: alates bot'i kirjutamisest mõnesse messengeri kuni eraldi rakenduse väljatöötamiseni. Siiski on eesmärk kõigil neil ühesugune – muuta rakenduse kogumise ja juurutamise käivitamine võimalikult läbipaistvaks ja mugavaks.
Meie puhul kasutame Jenkinsile.

Ülesanne
Looge mugav Jenkins job, mis käivitab valitud mikroteenuse kogumise ja (või) juurutamise kindla versiooni jaoks.

Sisendandmed
Meil on mitu hoidlat, kus asub erinevate mikroteenuste lähtekood.
Parameetrite määramine
Meie jobisse peaksid sisestama järgmised parameetrid:
- Hoia URL mikroteenuse koodiga, mida soovime koguda ja juurutada jobi käivitamise ajal.
- Commit ID, millest käivitamine toimub.
AS IS
Lihtsaim viis antud ülesande täitmiseks on luua kaks parameetrit tüübiga String.

Sel juhul peab kasutaja käsitsi sisestama tee hoidlasse ja commit ID, mis, olgem ausad, ei ole just kõige mugavam.

AS TO BE
Nüüd proovime teist tüüpi parameetreid, et vaadata kõiki selle eeliseid.
Loome esimese parameetri tüübi Choice Parameter, teise – Active Choices Reactive Reference Parameter. Choice tüüpi parameetrisse lisame käsitsi Choices väljal mikroteenuste koodide hoidlate nimed.

Kui see artikkel publikule meeldib, siis järgmises artiklis kirjeldan Jenkinsis ülesannete konfigureerimise protsessi, kasutades koodi kaudu konfigureerimist (Configuration as code), st me ei pea manuaalselt sisestama hoidlate nimesid ega looma parameetreid, kõik toimub automaatselt (meie kood saab SCM-ist hoidlate nimekirja ja loob parameetri koos selle nimekirjaga).
Teise parameetri väärtused täidetakse meil dünaamiliselt, sõltuvalt sellest, millise väärtuse esimene parameeter (test1 või test2) võtab, sest igal hoidlal on oma kommi nimekiri.
Active Choices Reactive Reference Parameter on järgmised täitmiseks vajalikud väljad:
- Nimi – parameetri nimi.
- Script – kood, mis täidetakse iga kord, kui Referenced parameter väljalt parameetri väärtus muutub (meie puhul, kui valime test1 või test2).
- Kirjeldus – parameetri lühikirjeldus.
- Choice Type – objekti tüüp, mille skript tagastab (meie puhul tagastame HTML-koodi).
- Referenced parameter – parameetri nimi, mille väärtuse muutumisel käivitatakse kood Scripti sektsioonis.

Liigume edasi selle parameetri kõige olulisema väljandi täitmise juurde. Meile pakutakse valida kahe rakendamise variandi vahel: kasutades Groovy Script või Scriptler Script.
Valime esimese, kuna Scriptler on lihtsalt plugin, mis salvestab teie varem kirjutatud skriptid ja võimaldab neid kasutada teistes ülesannetes ilma uue copy-pasteta.
Groovy kood, et saada kõik kommid valitud hoidlast:
AUTH = "kasutajanimi ja parool Base64 formaadis"
GIT_URL = "url teie SCM jaoks (https://bitbucket.org/)"
PROJECT_NAME = "projekti valdkonna nimi, kus asuvad hoidlatega seotud allikad"
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()Kui mitte minna detailidesse, siis see kood võtab sisendina mikroteenuse nime (MICROSERVICE_NAME), saadab päringu Bitbucket (meetod getCommitsForMicroservice), kasutades selle API-d, ja saab kõikide kommitte id-d ja merge sõnumid antud mikroteenusele.
Nagu juba varem öeldud, peab see kood tagastama HTML-i, mis kuvatakse lehel Build with Parameters Jenkinsis, seetõttu ümbritseme kõik saadud väärtused Bitbucket'is nimekirjaga ja lisame need select-i.
Pärast kõigi toimingute lõpetamist peaksime saama sellise ilusa lehe. Build with Parameters.
Kui valiti mikroteenus test1:

Kui valiti mikroteenus test2:

Nõustute, et kasutajal on märksa mugavam suhelda teie ülesandega nii, kui iga kord url-i kopeerida ja vajalikku commit id-d otsida.
P.S. Selles artiklis on toodud väga lihtsustatud näide, mis võib-olla ei oma praktilist rakendust sellisel kujul, kuna seadistustel on palju rohkem erinevaid parameetreid, kuid selle artikli eesmärk oli näidata tööriista toimimist, mitte pakkuda toimivat lahendust.
P.S.S. Nagu juba varem mainitud, kui see artikkel osutub kasulikuks, siis järgmine on teemal Jenkins'i ülesannete dünaamiline konfigureerimine koodi abil.
Allikas: habr.com
