Tere päevast, Habr!
Täna sooviksin jagada ühte meetodit, kuidas kasutada ülesande täitmiseks Jenkins kõige ühtsama ja kasutajasõbralikuma viisi leidmiseks.
Sissejuhatus
Acronym DevOps ei ole IT-kogukonnale enam midagi uut. Paljude inimeste jaoks seondub fraas «teha DevOps» mingi maagilise nupuga, millele vajutades muutub rakenduse kood automaatselt täielikult välja arendatud ja testitud rakenduseks (kõik on tegelikult keerulisem, kuid me abstraheerime kõik protsessid).
Seega oleme saanud tellimuse sellise maagilise nupu loomiseks, et administraatorid saaksid rakendust ühe klõpsuga välja lasta. Erinevaid viise selle ülesande täitmiseks on mitmeid: alates messažerite bot'i kirjutamisest kuni eraldi rakenduse arendamiseni. Siiski on kõigi nende eesmärk sama – muuta rakenduse kogumise ja juurutamise võimalikult selgeks ja mugavaks.
Meie puhul kasutame Jenkins.

Ülesanne
Kergesti kasutatava Jenkins'i ülesande loomine, mis käivitab valitud mikroteenuse konkreetse versiooni kogumise ja (või) juurutamise.

Sisendandmed
Meil on mitu hoidlat, kus asub erinevate mikroteenuste lähtekood.
Parameetrite määratlemine
Meie tööle peab saabuma järgmised parameetrid:
- Mikroteenuse koodi hoidla URL, mida soovime töö käivitamisel koguda ja juurutada.
- Commit ID, mille põhjal toimub kogumine.
AS IS
Lihtsaim viis antud ülesande täitmiseks on luua kaks String-tüüpi parameetrit.

Sellisel juhul peab kasutaja käsitsi sisestama hoidla tee ja commit ID, mis, nagu nõustute, ei ole just kõige mugavam.

AS TO BE
Nüüd proovime teist tüüpi parameetreid, et vaadata kõiki nende eeliseid.
Loon esimese parameetri Choice Parameter tüüpi, teise – Active Choices Reactive Reference Parameter. Choice tüüpi parameetrisse lisame käsitsi Choices väljale meie mikroteenuste koodi hoidlate nimed.

Kui see artikkel meeldib lugejatele, siis järgmisel korral kirjeldan, kuidas konfigureerida ülesandeid Jenkinsis, kasutades konfiguratsiooni kaudu koodi (Configuration as code), st me ei pea käsitsi sisestama reposte nimesid ega looma parameetreid, kõik toimib automaatselt (meie kood saab SCM-ist reposte nimekirja ja loob parameetri ühe nende nimekirjaga).
Teise parameetri väärtused täiendatakse dünaamiliselt, sõltuvalt esimesest parameetrist (test1 või test2), kuna igal repol on oma commitide nimekiri.
Active Choices Reactive Reference Parameter omab järgmisi täitmiseks vajalikku välja:
- Nimi – parameetri nimi.
- Script – kood, mis käivitatakse iga kord, kui Referenced parameter väljal parameetri väärtus muutub (meie puhul, kui valime test1 või test2).
- Kirjeldus – lühike parameetri kirjeldus.
- Choice Type – objekti tüüp, mille skript tagastab (meie puhul tagastame html koodi).
- Referenced parameter – parameetri nimi, mille väärtuse muutumise korral käivitatakse kood sektsioonis Script.

Liigume edasi selle parameetri kõige olulisema välja täitmise juurde. Valimiseks on meil kaks varianti: Groovy Script või Scriptler Script.
Valime esimese, kuna Scriptler on vaid plugin, mis salvestab teie varem kirjutatud skriptid ja võimaldab neid kasutada muudes ülesannetes ilma korduvat copy-pastet.
Groovy kood, et saada kõik commit'id valitud hoidlast:
AUTH = "kas ja parool Base64 formaadis"
GIT_URL = "url teie SCM (https://bitbucket.org/)"
PROJECT_NAME = "projekti ala nimi, kus asuvad hoidlad"
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 detailidesse laskuda, siis see kood võtab sisendiks mikroservise nime (MICROSERVICE_NAME), saadab päringu Bitbucket (meetod getCommitsForMicroservice), kasutades selle API-t, ja saab id ning commit message kõikide sellele mikroservisele kuuluvate commit'ide kohta.
Nagu juba varem mainitud, peab see kood tagastama html, mis kuvatakse lehel Build with Parameters Jenkins'is, seega ümberpaigutame kõik Bitbucketist saadud väärtused nimekirja ja lisame need select'i.
Pärast kõigi toimingute lõpetamist peaksime saama sellise ilusa lehe Build with Parameters.
Kui valisite mikroservise test1:

Kui valisite mikroservise test2:

Leppige, et kasutajal on teie ülesandega interakteeruda oluliselt mugavamalt, kui iga kord URL-i kopeerida ja vajaliku commit id otsida.
P.S. Selles artiklis on toodud väga lihtsustatud näide, mis võib-olla ei oma praktilist rakendust sellisel kujul, kuna koosted omavad palju rohkem erinevaid parameetreid, kuid selle artikli eesmärk oli näidata tööriista toimimist, mitte pakkuda töötavat lahendust.
P.S.S. Nagu ma juba varem mainisin, kui see artikkel on kasulik, siis järgmine räägib Jenkins'i ülesannete dünaamilisest konfigureerimisest koodi abil.
Allikas: habr.com
