Стварэнне дынамічных параметраў у 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. Сцэнар - код, які будзе выконвацца кожны раз, калі значэнне параметру з поля 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), адпраўляе запыт у Bitbucket (метад getCommitsForMicroservice), выкарыстоўваючы яго API, і атрымлівае id і commit message усіх коммітаў для дадзенага мікрасэрвісу.
Як ужо гаварылася раней, дадзены код павінен вяртаць html, які будзе адлюстраваны на старонцы Build with Parameters у Jenkins, таму ўсе атрыманыя значэнні з Bitbucket мы абарочваем у спіс і дадаем у select.

Пасля выканання ўсіх дзеянняў мы павінны атрымаць вось такую ​​прыгожую старонку Build with Parameters.

Калі выбралі мікрасэрвіс test1:

Стварэнне дынамічных параметраў у Jenkins job, ці як зрабіць вашу задачу user-friendly

Калі выбралі мікрасэрвіс test2:

Стварэнне дынамічных параметраў у Jenkins job, ці як зрабіць вашу задачу user-friendly

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

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

PSS Як ужо пісаў раней, калі дадзены артыкул будзе карысным, то наступны будзе пра дынамічнае канфігураванне задач Jenkins з дапамогай кода.

Крыніца: habr.com

Дадаць каментар