Добрага часу сутак, хабр!
Сёння я хацеў бы падзяліцца адным са спосабаў, як з дапамогай
Увядзенне
Такая абрэвіятура як DevOps ужо даўно не з'яўляецца нечым новым для IT супольнасці. У шматлікіх людзей фраза «зрабіць DevOps» асацыюецца з нейкай чароўнай кнопкай, пры націску на якую код прыкладання аўтаматычна ператвараецца ў разгорнутае і пратэставанае прыкладанне (усё насамрэч складаней, але мы абстрагуемся ад усіх працэсаў).
Такім чынам, нам паступіла замова зрабіць такую чароўную кнопку, каб адміністратары маглі разгортваць прыкладанне па адной пстрычцы. Маюцца розныя віды рэалізацыі дадзенай задачы: пачынаючы ад напісання робата для якога-небудзь з месэнджараў і заканчваючы распрацоўкай асобнага дадатку. Тым не менш мэта ва ўсяго гэтага адна - зрабіць запуск зборкі і разгортванні прыкладання найболей празрыстым і зручным.
У нашым выпадку мы будзем выкарыстоўваць Джэнкінс.
Задача
Стварыць зручную Jenkins job, якая будзе запускаць зборку і (або) дэплой абранага мікрасэрвісу пэўнай версіі.
Уваходныя дадзеныя
У нас маюцца некалькі рэпазітароў, у якіх ляжыць зыходны код розных мікрасэрвісаў.
Вызначэнне параметраў
На ўваход нашай джобе павінны паступаць наступныя параметры:
- URL рэпазітара з кодам мікрасэрвісу, які мы жадаем сабраць і разгарнуць пры запуску джобы.
- ID комміта, з якога будзе адбывацца зборка.
ЯК
Самы просты спосаб выканаць пастаўленую задачу - стварыць два параметры з тыпам String.
У гэтым выпадку карыстачу трэба будзе ўводзіць уручную шлях да рэпазітара і id комміта, што, пагодзіцеся, не зусім зручна.
AS TO BE
А зараз паспрабуем іншы тып параметраў, каб разгледзець усе яго перавагі.
Створым першы параметр з тыпам Choice Parameter, другі - Active Choices Reactive Reference Parameter. У параметр з тыпам Choice дадамо ўручную ў поле Choices імёны рэпазітароў, дзе захоўваецца код нашых мікрасэрвісаў.
Калі дадзены артыкул спадабаецца аўдыторыі, то ў наступным артыкуле апішу працэс канфігуравання задач у Jenkins, выкарыстаючы апісанне праз код (Configuration as code), г.зн. нам не трэба будзе ўручную ўводзіць імёны рэпазітароў і ствараць параметры, усё адбудзецца аўтаматычна (наш код атрымае спіс рэпазітароў з SCM і створыць параметр з дадзеным спісам).
Значэнні другога параметра ў нас будуць напаўняцца дынамічна, у залежнасці ад таго, якое значэнне прыме першы параметр (test1 або test2), бо ў кожнага рэпазітара маецца свой спіс комітаў.
Active Choices Reactive Reference Parameter мае наступныя палі для запаўнення:
- Імя - імя параметра.
- Сцэнар - код, які будзе выконвацца кожны раз, калі значэнне параметру з поля Referenced parameter будзе зменена (у нашым выпадку, калі будзем выбіраць паміж test1 і test2).
- Апісанне - кароткае апісанне параметру.
- Choice Type – тып які вяртаецца скрыптам аб'екта (у нашым выпадку будзем вяртаць html код).
- Referenced parameter - імя параметра, пры змене значэння якога будзе выконвацца код з секцыі Script.
Пяройдзем непасрэдна да запаўнення самага галоўнага поля ў дадзеным параметры. На выбар нам прапануюць два віды рэалізацыі: выкарыстанне Скрыпт Groovy або Scriptler Script.
Выбіраемы першае, бо Scriptler – гэта ўсяго толькі плягін, які захоўвае ўжо раней напісаныя вамі скрыпты і дазваляе выкарыстоўваць іх у іншых задачах без паўторнага copy-past.
Groovy код для атрымання ўсіх комітаў з абранага рэпазітара:
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()
Калі не ўдавацца ў дэталі, то дадзены код атрымлівае на ўваход імя мікрасэрвісу (MICROSERVICE_NAME), адпраўляе запыт у Bitbucket (метад getCommitsForMicroservice), выкарыстоўваючы яго API, і атрымлівае id і commit message усіх коммітаў для дадзенага мікрасэрвісу.
Як ужо гаварылася раней, дадзены код павінен вяртаць html, які будзе адлюстраваны на старонцы Build with Parameters у Jenkins, таму ўсе атрыманыя значэнні з Bitbucket мы абарочваем у спіс і дадаем у select.
Пасля выканання ўсіх дзеянняў мы павінны атрымаць вось такую прыгожую старонку Build with Parameters.
Калі выбралі мікрасэрвіс test1:
Калі выбралі мікрасэрвіс test2:
Пагодзіцеся, што карыстачу будзе нашмат зручней узаемадзейнічаць з вашай задачай дадзеным спосабам, чым кожны раз капіяваць url і шукаць патрэбны commit id.
PS У дадзеным артыкуле прыведзены вельмі спрошчаны прыклад, які, магчыма, не мае практычнага ўжывання ў такім выглядзе, бо зборкі маюць нашмат больш розных параметраў, але мэтай дадзенага артыкула было паказаць працу прылады, а не падаць працоўнае рашэнне.
PSS Як ужо пісаў раней, калі дадзены артыкул будзе карысным, то наступны будзе пра дынамічнае канфігураванне задач Jenkins з дапамогай кода.
Крыніца: habr.com