Доброго часу доби, Хабр!
Сьогодні я хотів би поділитися одним із способів, як за допомогою
Запровадження
Така абревіатура, як 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 має такі поля для заповнення:
- ІМ'Я - Ім'я параметра.
- Script – код, який буде виконуватися щоразу, коли значення параметра з поля 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), надсилає запит у Бітбукет (метод getCommitsForMicroservice), використовуючи його API, та отримує id та commit message всіх коммітів для даного мікросервісу.
Як уже говорилося раніше, цей код повинен повертати html, який буде відображено на сторінці Збірка з параметрами у Jenkins, тому всі отримані значення з Bitbucket ми обертаємо до списку та додаємо у select.
Після виконання всіх дій ми повинні отримати таку красиву сторінку Збірка з параметрами.
Якщо вибрали мікросервіс test1:
Якщо вибрали мікросервіс test2:
Погодьтеся, що користувач буде набагато зручніше взаємодіяти з вашим завданням даним способом, ніж щоразу копіювати url і шукати потрібний commit id.
PS У цій статті наведено дуже спрощений приклад, який, можливо, не має практичного застосування в такому вигляді, оскільки складання мають набагато більше різних параметрів, але метою даної статті було показати роботу інструменту, а не надати робочого рішення.
PSS Як вже писав раніше, якщо дана стаття буде корисною, то наступна буде про динамічне конфігурування задач Jenkins за допомогою коду.
Джерело: habr.com