Tworzenie dynamicznych parametrów w zadaniu Jenkins, czyli jak uczynić swoje zadanie bardziej przyjaznym dla użytkownika

Dzień dobry, Hub!

Dzisiaj chciałbym podzielić się jednym ze sposobów, jak za pomocą wtyczki Active Choices wykonać zadanie w Jenkins najbardziej unifikujący i zrozumiały sposób dla użytkownika.

Wprowadzenie

Akronim DevOps od dawna nie jest niczym nowym dla społeczności IT. Wielu ludzi kojarzy frazę „wprowadzić DevOps” z jakimś magicznym przyciskiem, po naciśnięciu którego kod aplikacji automatycznie zamienia się w wdrożoną i przetestowaną aplikację (wszystko jest w rzeczywistości bardziej skomplikowane, ale abstrahujemy od wszystkich procesów).

Zatem otrzymaliśmy zamówienie na stworzenie takiego magicznego przycisku, aby administratorzy mogli wdrażać aplikację za jednym kliknięciem. Istnieją różne sposoby realizacji tego zadania: od napisania bota dla dowolnego z komunikatorów do opracowania oddzielnej aplikacji. Niemniej jednak celem jest uczynienie uruchamiania kompilacji i wdrażania aplikacji najbardziej przejrzystym i wygodnym.

W naszym przypadku użyjemy Jenkins.


Tworzenie dynamicznych parametrów w zadaniu Jenkins, czyli jak uczynić swoje zadanie bardziej przyjaznym dla użytkownika

Zadanie

Stworzyć wygodną pracę w Jenkins, która będzie uruchamiać kompilację i (lub) wdrożenie wybranego mikroserwisu w określonej wersji.

Tworzenie dynamicznych parametrów w zadaniu Jenkins, czyli jak uczynić swoje zadanie bardziej przyjaznym dla użytkownika

Dane wejściowe

Mamy kilka repozytoriów, w których znajduje się kod źródłowy różnych mikroserwisów.

Określenie parametrów

Do naszej pracy powinny trafiać następujące parametry:

  1. URL repozytorium z kodem mikroserwisu, który chcemy skompilować i wdrożyć podczas uruchamiania pracy.
  2. ID commita, z którego będzie pochodziła kompilacja.

AS IS

Najprostszym sposobem wykonania zadania jest stworzenie dwóch parametrów typu String.

Tworzenie dynamicznych parametrów w zadaniu Jenkins, czyli jak uczynić swoje zadanie bardziej przyjaznym dla użytkownika

W tym przypadku użytkownik będzie musiał ręcznie wprowadzić ścieżkę do repozytorium i id commita, co, przyznacie, nie jest zbyt wygodne.

Tworzenie dynamicznych parametrów w zadaniu Jenkins, czyli jak uczynić swoje zadanie bardziej przyjaznym dla użytkownika

AS TO BE

A teraz spróbujmy innego typu parametrów, aby omówić wszystkie jego zalety.
Utworzymy pierwszy parametr typu Choice Parameter, a drugi — Active Choices Reactive Reference Parameter. Do parametru typu Choice ręcznie dodamy w polu Choices nazwy repozytoriów, w których przechowywany jest kod naszych mikroserwisów.

Tworzenie dynamicznych parametrów w zadaniu Jenkins, czyli jak uczynić swoje zadanie bardziej przyjaznym dla użytkownika

Jeśli ten artykuł spodoba się czytelnikom, w następnym opiszemy proces konfigurowania zadań w Jenkins, używając opisu przez kod (Configuration as Code), co oznacza, że nie będziemy musieli ręcznie wprowadzać nazw repozytoriów i tworzyć parametrów, wszystko odbędzie się automatycznie (nasz kod otrzyma listę repozytoriów z SCM i stworzy parametr z tą listą).

Wartości drugiego parametru będą wypełniane dynamicznie, w zależności od tego, jakie wartość przyjmie pierwszy parametr (test1 lub test2), ponieważ każde repozytorium ma swoją własną listę commitów.

Active Choices Reactive Reference Parameter ma następujące pola do wypełnienia:

  1. Nazwa – nazwa parametru.
  2. Script – kod, który będzie wykonywany za każdym razem, gdy wartość parametru w polu Referenced parameter zostanie zmieniona (w naszym przypadku, kiedy będziemy wybierać między test1 a test2).
  3. Opis – krótki opis parametru.
  4. Choice Type – typ obiektu zwracanego przez skrypt (w naszym przypadku będziemy zwracać kod html).
  5. Referenced parameter – nazwa parametru, przy zmianie wartości którego będzie wykonywany kod z sekcji Script.

Tworzenie dynamicznych parametrów w zadaniu Jenkins, czyli jak uczynić swoje zadanie bardziej przyjaznym dla użytkownika

Przejdźmy bezpośrednio do wypełnienia najważniejszego pola w tym parametrze. Mamy do wyboru dwa rodzaje realizacji: użycie Groovy Script lub Scriptler Script.
Wybieramy pierwsze, ponieważ Scriptler to tylko wtyczka, która przechowuje wcześniej napisane skrypty i pozwala używać ich w innych zadaniach bez ponownego kopiowania i wklejania.

Kod Groovy do uzyskania wszystkich commitów z wybranego repozytorium:

AUTH = "login i hasło w Base64"                           
GIT_URL = "url do Twojego SCM (https://bitbucket.org/)"                       
PROJECT_NAME = "nazwa obszaru projektu, w którym znajdują się repozytoria"

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

Nie wdając się w szczegóły, kod ten przyjmuje nazwę mikrousługi (MICROSERVICE_NAME), wysyła zapytanie do Bitbucket (metoda getCommitsForMicroservice), używając jej API, i otrzymuje id oraz wiadomość commitów dla danej mikrousługi.
Jak już wcześniej wspomniano, kod ten powinien zwracać html, który będzie wyświetlany na stronie Build with Parameters w Jenkins, dlatego wszystkie uzyskane wartości z Bitbucket opakowujemy w listę i dodajemy do select.

Po wykonaniu wszystkich czynności powinniśmy uzyskać taką ładną stronę. Build with Parameters.

Jeśli wybrano mikrousługę test1:

Tworzenie dynamicznych parametrów w zadaniu Jenkins, czyli jak uczynić swoje zadanie bardziej przyjaznym dla użytkownika

Jeśli wybrano mikrousługę test2:

Tworzenie dynamicznych parametrów w zadaniu Jenkins, czyli jak uczynić swoje zadanie bardziej przyjaznym dla użytkownika

Zgadzam się, że użytkownikowi wygodniej będzie współpracować z twoim zadaniem w ten sposób, niż za każdym razem kopiować URL i szukać odpowiedniego id commitu.

P.S. W tym artykule przedstawiono bardzo uproszczony przykład, który być może nie ma praktycznego zastosowania w tej formie, ponieważ konfiguracje mają znacznie więcej różnych parametrów, ale celem tego artykułu było pokazanie działania narzędzia, a nie przedstawienie gotowego rozwiązania.

P.S.S. Jak już wcześniej pisałem, jeśli ten artykuł okaże się przydatny, to następny będzie dotyczył dynamicznego konfigurowania zadań Jenkins za pomocą kodu.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster