God eftermiddag, Habr!
Idag skulle jag vilja dela med mig av ett av sÀtten att anvÀnda för att göra uppgiften i Jenkins ett mer enhetligt och anvÀndarvÀnligt sÀtt.
Introduktion
Akronymen DevOps Àr sedan lÀnge inte nÄgot nytt för IT-gemenskapen. MÄnga associerar frasen "göra DevOps" med en slags magisk knapp som, nÀr den trycks ned, automatiskt omvandlar applikationskoden till en distribuerad och testad applikation (det Àr mer komplicerat, men lÄt oss abstrahera frÄn alla processer).
SĂ„, vi har fĂ„tt i uppdrag att skapa en sĂ„dan magisk knapp sĂ„ att administratörer kan distribuera applikationen med ett enda klick. Det finns olika sĂ€tt att genomföra denna uppgift: allt frĂ„n att skriva en bot för nĂ„gon av meddelandetjĂ€nsterna till att utveckla en separat applikation. MĂ„let Ă€r dessvĂ€rre detsamma â att göra start av bygg och distribution av applikationen sĂ„ transparent och anvĂ€ndarvĂ€nlig som möjligt.
I vÄrt fall kommer vi att anvÀnda Jenkins.

Uppgift
Skapa ett anvÀndarvÀnligt Jenkins-jobb som kommer att starta bygg och (eller) distribuera den valda mikrotjÀnsten av en viss version.

Indata
Vi har flera repository dÀr kildekoden för olika mikrotjÀnster ligger.
Definiera parametrar
Indata till vÄrt jobb ska bestÄ av följande parametrar:
- URL till repository med koden för mikrotjÀnsten som vi vill bygga och distribuera nÀr jobbet körs.
- ID för commit som byggprocessen ska utgÄ ifrÄn.
SOM DET ĂR
Det enklaste sÀttet att utföra uppgiften Àr att skapa tvÄ parametrar av typen String.

I det hÀr fallet mÄste anvÀndaren manuellt ange sökvÀgen till repositoryn och commit-id, vilket, medge, inte Àr sÀrskilt bekvÀmt.

AS TO BE
Nu ska vi prova en annan typ av parametrar för att se alla dess fördelar.
Vi skapar den första parametern av typen Choice Parameter och den andra â Active Choices Reactive Reference Parameter. I parametern av typen Choice lĂ€gger vi manuellt till namnen pĂ„ repositoryn dĂ€r vĂ„r mikrotjĂ€nsters kod förvaras i Choices-fĂ€ltet.

Om denna artikel tilltalar publiken kommer jag i nÀsta artikel att beskriva processen för att konfigurera uppgifter i Jenkins, med hjÀlp av beskrivning genom kod (Configuration as Code), vilket innebÀr att vi inte behöver ange namn pÄ lagren manuellt och skapa parametrar; allt kommer att ske automatiskt (vÄr kod kommer att fÄ en lista med lagren frÄn SCM och skapa en parameter med denna lista).
VÀrdena för den andra parametern kommer att fyllas dynamiskt, beroende pÄ vilket vÀrde den första parametern antar (test1 eller test2), dÄ varje lager har sin egen lista med commits.
Aktiva Val Reaktiv Referensparameter har följande fÀlt att fylla i:
- Namn â namn pĂ„ parametern.
- Script â koden som kommer att köras varje gĂ„ng vĂ€rdet av parametern i fĂ€ltet Referenced parameter Ă€ndras (i vĂ„rt fall, nĂ€r vi vĂ€ljer mellan test1 och test2).
- Beskrivning â en kort beskrivning av parametern.
- Valtyp â typ av objekt som kommer att returneras av skriptet (i vĂ„rt fall kommer vi att returnera html-kod).
- Refererad parameter â namnet pĂ„ parametern vars vĂ€rdeĂ€ndring kommer att köra koden frĂ„n sektionen Script.

LÄt oss gÄ vidare till att fylla i det mest grundlÀggande fÀltet i denna parameter. Vi har tvÄ alternativ att vÀlja mellan: anvÀndning av Groovy-skript eller Scriptler-skript.
Vi vÀljer det första, eftersom Scriptler bara Àr ett plugin som sparar de skript du tidigare har skrivit och lÄter dig anvÀnda dem i andra uppgifter utan att behöva kopiera och klistra in igen.
Groovy-kod för att hÀmta alla commits frÄn det valda lagret:
AUTH = "användarnamn och lösenord i Base64"
GIT_URL = "url till din SCM (https://bitbucket.org/)"
PROJECT_NAME = "namnet på projektområdet där repository finns"
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()Om man inte gÄr in pÄ detaljer fÄr denna kod namnet pÄ mikrotjÀnsten (MICROSERVICE_NAME) som indata, skickar en begÀran till Bitbucket (metod getCommitsForMicroservice), anvÀnder dess API och hÀmtar id och commit message för alla commits för denna mikrotjÀnst.
Som nÀmnts tidigare ska denna kod returnera html som kommer att visas pÄ sidan Bygg med parametrar i Jenkins, sÄ vi omsluter alla erhÄllna vÀrden frÄn Bitbucket i en lista och lÀgger till dem i select.
Efter att ha utfört alla dessa steg bör vi fÄ en sÄdan vacker sida. Bygg med parametrar.
Om vi valde mikrotjÀnsten test1:

Om vi valde mikrotjÀnsten test2:

HÄller ni med om att det kommer att vara mycket mer bekvÀmt för anvÀndaren att interagera med er uppgift pÄ detta sÀtt, istÀllet för att behöva kopiera url och leta efter rÀtt commit id varje gÄng.
P.S. I denna artikel ges ett mycket förenklat exempel som kanske inte har praktisk tillÀmpning i detta format, eftersom byggnader har betydligt fler olika parametrar, men syftet med denna artikel var att visa hur verktyget fungerar, snarare Àn att ge en fungerande lösning.
P.S.S. Som jag tidigare nÀmnt, om denna artikel Àr anvÀndbar, sÄ kommer nÀsta att handla om dynamisk konfiguration av Jenkins-uppgifter via kod.
KĂ€lla: habr.com
