Dynamische parameters maken in een Jenkins-taak, of hoe u uw taak gebruiksvriendelijk kunt maken

Goededag, Habr!

Vandaag wil ik graag een van de manieren delen die je kunt gebruiken Actieve keuzes plug-in voer de taak uit Jenkins de meest uniforme en gebruiksvriendelijke.

Introductie

Zo’n afkorting als DevOps is niet meer iets nieuws voor de IT-gemeenschap. Voor veel mensen wordt de uitdrukking “doe DevOps” geassocieerd met een soort magische knop; wanneer erop wordt geklikt, verandert de applicatiecode automatisch in een geïmplementeerde en geteste applicatie (alles is eigenlijk ingewikkelder, maar we abstraheren van alle processen).

We kregen dus de opdracht om zo’n magische knop te maken, zodat beheerders de applicatie met één klik konden implementeren. Er zijn verschillende soorten implementatie van deze taak: van het schrijven van een bot voor een van de instant messengers tot het ontwikkelen van een afzonderlijke applicatie. Niettemin heeft dit alles hetzelfde doel: het starten van de bouw en implementatie van de applicatie zo transparant en gemakkelijk mogelijk maken.

In ons geval zullen we gebruiken Jenkins.


Dynamische parameters maken in een Jenkins-taak, of hoe u uw taak gebruiksvriendelijk kunt maken

Taak

Creëer een handige Jenkins-taak die de build en (of) implementatie van de geselecteerde microservice van een bepaalde versie start.

Dynamische parameters maken in een Jenkins-taak, of hoe u uw taak gebruiksvriendelijk kunt maken

Invoergegevens

We hebben verschillende repositories met de broncode van verschillende microservices.

Parameters definiëren

De volgende parameters moeten worden ontvangen als invoer voor onze taak:

  1. De URL van de repository met de microservicecode die we willen bouwen en implementeren bij het uitvoeren van de taak.
  2. ID van de commit waaruit de build zal plaatsvinden.

ZOALS HET IS

De eenvoudigste manier om deze taak te volbrengen is door twee parameters van het type String te maken.

Dynamische parameters maken in een Jenkins-taak, of hoe u uw taak gebruiksvriendelijk kunt maken

In dit geval zal de gebruiker handmatig het pad naar de repository en de commit-ID moeten invoeren, wat, zoals je ziet, niet helemaal handig is.

Dynamische parameters maken in een Jenkins-taak, of hoe u uw taak gebruiksvriendelijk kunt maken

ZOALS TE ZIJN

Laten we nu een ander type parameters proberen om alle voordelen ervan te overwegen.
Laten we de eerste parameter maken met het type Choice Parameter, de tweede - Active Choices Reactive Reference Parameter. In de parameter met het type Keuze voegen we in het veld Keuzes handmatig de namen toe van de repositories waar de code van onze microservices is opgeslagen.

Dynamische parameters maken in een Jenkins-taak, of hoe u uw taak gebruiksvriendelijk kunt maken

Als het publiek dit artikel leuk vindt, zal ik in het volgende artikel het proces van het configureren van taken in Jenkins beschrijven, met behulp van een beschrijving via code (Configuratie als code), d.w.z. we hoeven niet handmatig repositorynamen in te voeren en parameters aan te maken, alles gebeurt automatisch (onze code ontvangt een lijst met repository's van SCM en maakt met deze lijst een parameter aan).

De waarden van de tweede parameter worden dynamisch gevuld, afhankelijk van welke waarde de eerste parameter aanneemt (test1 of test2), omdat elke repository zijn eigen lijst met commits heeft.

Actieve keuzes Reactieve referentieparameter heeft de volgende velden om in te vullen:

  1. Naam - parameternaam.
  2. Script – code die wordt uitgevoerd telkens wanneer de waarde van de parameter uit het veld Referentieparameter wordt gewijzigd (in ons geval wanneer we kiezen tussen test1 en test2).
  3. Omschrijving – korte beschrijving van de parameter.
  4. Keuze soort – het type object dat door het script wordt geretourneerd (in ons geval zullen we html-code retourneren).
  5. Parameter waarnaar wordt verwezen – de naam van de parameter, wanneer de waarde ervan wordt gewijzigd, wordt de code uit de Script-sectie uitgevoerd.

Dynamische parameters maken in een Jenkins-taak, of hoe u uw taak gebruiksvriendelijk kunt maken

Laten we direct doorgaan met het invullen van het belangrijkste veld in deze parameter. Er worden ons twee soorten implementaties aangeboden waaruit u kunt kiezen: gebruiken Groovy script of Scriptler-script.
We kiezen voor de eerste, omdat Scriptler slechts een plug-in is die scripts opslaat die u eerder hebt geschreven, zodat u ze voor andere taken kunt gebruiken zonder opnieuw te hoeven kopiëren en plakken.

Groovy code om alle commits uit de geselecteerde repository te halen:

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

Zonder in details te treden: deze code ontvangt de microservicenaam (MICROSERVICE_NAME) als invoer en stuurt een verzoek naar BitBucket (methode getCommitsForMicroservice) met behulp van zijn API, en haalt de id en het commit-bericht op van alle commits voor een bepaalde microservice.
Zoals eerder vermeld, zou deze code html moeten retourneren die op de pagina wordt weergegeven Bouw met parameters in Jenkins, dus we verpakken alle ontvangen waarden van Bitbucket in een lijst en voegen ze toe om te selecteren.

Nadat we alle stappen hebben voltooid, zouden we zo'n mooie pagina moeten krijgen Bouw met parameters.

Als u test1 microservice hebt geselecteerd:

Dynamische parameters maken in een Jenkins-taak, of hoe u uw taak gebruiksvriendelijk kunt maken

Als u test2 microservice hebt geselecteerd:

Dynamische parameters maken in een Jenkins-taak, of hoe u uw taak gebruiksvriendelijk kunt maken

Ben het ermee eens dat het voor de gebruiker veel handiger is om op deze manier met uw taak te communiceren dan elke keer de url te kopiëren en naar de vereiste commit-ID te zoeken.

PS Dit artikel geeft een zeer vereenvoudigd voorbeeld, dat in deze vorm misschien niet van praktisch nut is, omdat samenstellingen veel meer verschillende parameters hebben, maar het doel van dit artikel was om te laten zien hoe de tool werkt, niet om een ​​werkende oplossing te bieden.

PSS Zoals ik eerder schreef: als dit artikel nuttig is, gaat het volgende over dynamische configuratie van Jenkins-taken via code.

Bron: www.habr.com

Voeg een reactie