Створення динамічних параметрів у Jenkins job, або як зробити ваше завдання user-friendly

Доброго часу доби, Хабр!

Сьогодні я хотів би поділитися одним із способів, як за допомогою Active Choices Plugin зробити завдання в Дженкінс найбільш уніфікованою та зрозумілою для користувача.

Запровадження

Така абревіатура, як DevOps, вже давно не є чимось новим для IT спільноти. У багатьох людей фраза «зробити DevOps» асоціюється з якоюсь чарівною кнопкою, при натисканні на яку код програми автоматично перетворюється на розгорнутий і протестований додаток (все насправді складніше, але ми абстрагуємося від усіх процесів).

Отже, нам надійшло замовлення зробити таку чарівну кнопку, щоб адміністратори могли розгортати програму по одному клацанню. Є різні види реалізації цього завдання: починаючи від написання робота для будь-якого з месенджерів і закінчуючи розробкою окремої програми. Проте мета всього цього одна - зробити запуск складання і розгортання програми найбільш прозорим і зручним.

У нашому випадку ми будемо використовувати Дженкінс.


Створення динамічних параметрів у Jenkins job, або як зробити ваше завдання user-friendly

Завдання

Створити зручну Jenkins job, яка запускатиме складання та (або) деплою вибраного мікросервісу певної версії.

Створення динамічних параметрів у Jenkins job, або як зробити ваше завдання user-friendly

Вхідні дані

У нас є кілька репозиторіїв, у яких лежить вихідний код різних мікросервісів.

визначення параметрів

На вхід нашій джобі повинні надходити такі параметри:

  1. URL-репозиторія з кодом мікросервісу, який ми хочемо зібрати і розгорнути при запуску джоби.
  2. ID комміту, з якого відбуватиметься складання.

ЯК Є

Найпростіший спосіб виконати поставлене завдання – створити два параметри з типом String.

Створення динамічних параметрів у Jenkins job, або як зробити ваше завдання user-friendly

У цьому випадку користувачеві потрібно буде вводити вручну шлях до репозиторію та id комміту, що, погодьтеся, не зовсім зручно.

Створення динамічних параметрів у Jenkins job, або як зробити ваше завдання user-friendly

AS TO BE

А тепер спробуємо інший тип параметрів, щоб розглянути його переваги.
Створимо перший параметр із типом Choice Parameter, другий - Active Choices Reactive Reference Parameter. У параметр із типом Choice додамо вручну в полі Choices імена репозиторіїв, де зберігається код наших мікросервісів.

Створення динамічних параметрів у Jenkins job, або як зробити ваше завдання user-friendly

Якщо ця стаття сподобається аудиторії, то наступній статті опишу процес конфігурування завдань у Jenkins, використовуючи опис через код (Configuration as code), тобто. нам не потрібно буде вручну вводити імена репозиторіїв та створювати параметри, все відбудеться автоматично (наш код отримає список репозиторіїв із SCM та створить параметр із цим списком).

Значення другого параметра у нас будуть наповнюватися динамічно, залежно від того, яке значення прийме перший параметр (test1 або test2), адже кожен репозиторій має свій список коммітів.

Active Choices Reactive Reference Parameter має такі поля для заповнення:

  1. ІМ'Я - Ім'я параметра.
  2. Script – код, який буде виконуватися щоразу, коли значення параметра з поля Referenced parameter буде змінено (у нашому випадку, коли вибиратимемо між test1 та test2).
  3. Опис - Короткий опис параметра.
  4. Choice Type – тип об'єкта, що повертається скриптом (у нашому випадку повертатимемо html код).
  5. Referenced parameter – ім'я параметра, при зміні значення якого виконуватиметься код із секції Script.

Створення динамічних параметрів у Jenkins job, або як зробити ваше завдання user-friendly

Перейдемо безпосередньо до заповнення найголовнішого поля у цьому параметрі. На вибір нам пропонують два види реалізації: використання Сценарій 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:

Створення динамічних параметрів у Jenkins job, або як зробити ваше завдання user-friendly

Якщо вибрали мікросервіс test2:

Створення динамічних параметрів у Jenkins job, або як зробити ваше завдання user-friendly

Погодьтеся, що користувач буде набагато зручніше взаємодіяти з вашим завданням даним способом, ніж щоразу копіювати url і шукати потрібний commit id.

PS У цій статті наведено дуже спрощений приклад, який, можливо, не має практичного застосування в такому вигляді, оскільки складання мають набагато більше різних параметрів, але метою даної статті було показати роботу інструменту, а не надати робочого рішення.

PSS Як вже писав раніше, якщо дана стаття буде корисною, то наступна буде про динамічне конфігурування задач Jenkins за допомогою коду.

Джерело: habr.com

Додати коментар або відгук