Krei dinamikajn parametrojn en laboro de Jenkins, aŭ kiel fari vian taskon amika

Bonan tagon, Habr!

Hodiaŭ mi ŝatus dividi unu el la manieroj kiel uzi Aktivaj Elektoj Kromaĵo faru la taskon en Jenkins la plej unuigita kaj komprenebla por la uzanto.

Enkonduko

Tia mallongigo kiel DevOps ne estas io nova por la IT-komunumo dum longa tempo. Por multaj homoj, la frazo "faru DevOps" estas asociita kun ia magia butono, kiam oni klakas, la aplika kodo aŭtomate iĝas deplojita kaj provita aplikaĵo (ĝi estas fakte pli komplika, sed ni abstraktas de ĉiuj procezoj).

Do, ni ricevis ordon fari tian magian butonon por ke administrantoj povu disfaldi la aplikaĵon per unu klako. Estas diversaj specoj de efektivigo de ĉi tiu tasko: komencante de verkado de bot por iu ajn el la mesaĝistoj kaj finiĝante per la disvolviĝo de aparta aplikaĵo. Tamen, la celo de ĉio ĉi estas la sama - fari la lanĉon de la muntado kaj deplojo de la aplikaĵo kiel eble plej travidebla kaj oportuna.

En nia kazo, ni uzos Jenkins.


Krei dinamikajn parametrojn en laboro de Jenkins, aŭ kiel fari vian taskon amika

Objektivo

Kreu oportunan Jenkins-laboron, kiu funkcios la muntadon kaj (aŭ) deplojon de la elektita mikroservo de certa versio.

Krei dinamikajn parametrojn en laboro de Jenkins, aŭ kiel fari vian taskon amika

Eniga datumoj

Ni havas plurajn deponejojn, kiuj enhavas la fontkodon de diversaj mikroservoj.

Difinante parametrojn

La enigo de nia laboro devus ricevi la sekvajn parametrojn:

  1. La URL de la deponejo kun la mikroserva kodo, kiun ni volas konstrui kaj disfaldi dum rulado de la laboro.
  2. La ID de la devoto por konstrui.

KIAL ESTAS

La plej facila maniero por plenumi ĉi tiun taskon estas krei du parametrojn de tipo String.

Krei dinamikajn parametrojn en laboro de Jenkins, aŭ kiel fari vian taskon amika

En ĉi tiu kazo, la uzanto devos permane enigi la vojon al la deponejo kaj la kommit-id, kio, vi vidas, ne estas tre oportuna.

Krei dinamikajn parametrojn en laboro de Jenkins, aŭ kiel fari vian taskon amika

KIEL ESTI

Nun ni provu alian tipon de parametroj por vidi ĉiujn ĝiajn avantaĝojn.
Ni kreu la unuan parametron kun tipo Elekto-Parametro, la duan - Active Choices Reactive Reference Parameter. En la parametro kun la Elekta tipo, ni permane aldonos la nomojn de la deponejoj en la kampo Elektoj, kie la kodo de niaj mikroservoj estas konservita.

Krei dinamikajn parametrojn en laboro de Jenkins, aŭ kiel fari vian taskon amika

Se la publiko ŝatas ĉi tiun artikolon, tiam en la sekva artikolo mi priskribos la procezon de agordo de taskoj en Jenkins uzante la priskribon per la kodo (Agordo kiel kodo), t.e. ni ne bezonos permane enigi la nomojn de la deponejoj kaj krei parametrojn, ĉio okazos aŭtomate (nia kodo ricevos la liston de deponejoj de la SCM kaj kreos parametron kun ĉi tiu listo).

La valoroj de la dua parametro estos plenigitaj dinamike, depende de kia valoro prenas la unua parametro (test1 aŭ test2), ĉar ĉiu deponejo havas sian propran liston de kommitaĵoj.

Aktivaj Elektoj Reaktiva Referenca Parametro havas la sekvajn kampojn por plenigi:

  1. Nomo - parametronomo.
  2. skripto - kodo, kiu estos ekzekutita ĉiufoje kiam la valoro de la parametro el la Referenca parametro-kampo estas ŝanĝita (en nia kazo, kiam ni elektas inter test1 kaj test2).
  3. Priskribo – mallonga priskribo de la parametro.
  4. Elekto-Tipo - la tipo de la objekto redonita de la skripto (en nia kazo, ni resendos la html-kodon).
  5. referencita parametro – la nomo de la parametro, kiam kies valoro ŝanĝiĝas, la kodo de la sekcio Skripto estos ekzekutita.

Krei dinamikajn parametrojn en laboro de Jenkins, aŭ kiel fari vian taskon amika

Ni iru rekte plenigi la plej gravan kampon en ĉi tiu parametro. Oni proponas al ni du specojn de efektivigo por elekti: uzado Groovy SkriptoScriptler Skripto.
Ni elektas la unuan, ĉar Scriptler estas nur kromaĵo, kiu konservas la skriptojn, kiujn vi jam skribis, kaj permesas vin uzi ilin en aliaj taskoj sen kopii-alglui denove.

Groovy kodo por ricevi ĉiujn kommitaĵojn de elektita deponejo:

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()

Sen eniri detalojn, ĉi tiu kodo ricevas la nomon de la mikroservo (MICROSERVICE_NAME) kiel enigo, sendas peton al bitbucket (metodo getCommitsForMicroservice) uzante ĝian API kaj ricevas la identigilon kaj kommit-mesaĝon de ĉiuj komitaĵoj por la donita mikroservo.
Kiel menciite antaŭe, ĉi tiu kodo devus redoni la html kiu estos montrata sur la paĝo Konstruu kun Parametroj en Jenkins, do ni envolvas ĉiujn ricevitajn valorojn de Bitbucket en liston kaj aldonas ilin al la elekto.

Post plenumi ĉiujn paŝojn, ni devus ricevi tian belan paĝon Konstruu kun Parametroj.

Se vi elektis la mikroservon test1:

Krei dinamikajn parametrojn en laboro de Jenkins, aŭ kiel fari vian taskon amika

Se vi elektis la mikroservon test2:

Krei dinamikajn parametrojn en laboro de Jenkins, aŭ kiel fari vian taskon amika

Konsentu, ke estos multe pli oportune por la uzanto interagi kun via tasko tiamaniere ol kopii la url ĉiufoje kaj serĉi la bezonatan kommit-id.

PS Ĉi tiu artikolo estas tre simpligita ekzemplo, kiu eble ne estas de praktika uzo en ĉi tiu formo, ĉar asembleoj havas multe pli da malsamaj parametroj, sed la celo de ĉi tiu artikolo estis montri kiel la ilo funkcias, ne provizi funkciantan solvon.

PSS Kiel mi skribis pli frue, se ĉi tiu artikolo estas utila, tiam la sekva temas pri dinamika agordo de Jenkins-taskoj per kodo.

fonto: www.habr.com

Aldoni komenton