Criando parâmetros dinâmicos em um trabalho Jenkins ou como tornar sua tarefa amigável

Bom dia, Habr!

Hoje gostaria de compartilhar uma das maneiras de usar Plug-in de escolhas ativas faça a tarefa em Jenkins o mais unificado e fácil de usar.

Introdução

Uma abreviatura como DevOps não é mais algo novo para a comunidade de TI. Para muitas pessoas, a frase “fazer DevOps” está associada a uma espécie de botão mágico, ao ser clicado, o código da aplicação automaticamente se transforma em uma aplicação implantada e testada (na verdade tudo é mais complicado, mas estamos abstraindo de todos os processos).

Então, recebemos um pedido para fazer um botão mágico para que os administradores pudessem implantar o aplicativo com um clique. Existem vários tipos de implementação desta tarefa: desde escrever um bot para qualquer um dos mensageiros instantâneos até desenvolver um aplicativo separado. No entanto, tudo isso tem o mesmo objetivo - tornar o início da construção e implantação do aplicativo o mais transparente e conveniente possível.

No nosso caso usaremos Jenkins.


Criando parâmetros dinâmicos em um trabalho Jenkins ou como tornar sua tarefa amigável

Tarefa

Crie um trabalho Jenkins conveniente que iniciará a construção e (ou) implantação do microsserviço selecionado de uma determinada versão.

Criando parâmetros dinâmicos em um trabalho Jenkins ou como tornar sua tarefa amigável

Dados de entrada

Temos vários repositórios contendo o código-fonte de vários microsserviços.

Definição de parâmetro

Os seguintes parâmetros devem ser recebidos como entrada para nosso trabalho:

  1. A URL do repositório com o código do microsserviço que queremos construir e implantar ao executar o trabalho.
  2. ID do commit a partir do qual a compilação ocorrerá.

COMO ESTÁ

A maneira mais fácil de realizar esta tarefa é criar dois parâmetros do tipo String.

Criando parâmetros dinâmicos em um trabalho Jenkins ou como tornar sua tarefa amigável

Nesse caso, o usuário precisará inserir manualmente o caminho do repositório e o ID do commit, o que, você vê, não é totalmente conveniente.

Criando parâmetros dinâmicos em um trabalho Jenkins ou como tornar sua tarefa amigável

COMO SER

Agora vamos tentar outro tipo de parâmetro para considerar todas as suas vantagens.
Vamos criar o primeiro parâmetro com o tipo Choice Parameter, o segundo - Active Choices Reactive Reference Parameter. No parâmetro com o tipo Choice, adicionaremos manualmente no campo Choices os nomes dos repositórios onde está armazenado o código dos nossos microsserviços.

Criando parâmetros dinâmicos em um trabalho Jenkins ou como tornar sua tarefa amigável

Se o público gostar deste artigo, no próximo artigo irei descrever o processo de configuração de tarefas no Jenkins, utilizando uma descrição por meio de código (Configuração como código), ou seja. não precisaremos inserir nomes de repositórios manualmente e criar parâmetros, tudo acontecerá automaticamente (nosso código receberá uma lista de repositórios do SCM e criará um parâmetro com esta lista).

Os valores do segundo parâmetro serão preenchidos dinamicamente, dependendo do valor que o primeiro parâmetro assume (test1 ou test2), pois cada repositório possui sua própria lista de commits.

Parâmetro de referência reativa de opções ativas possui os seguintes campos para preenchimento:

  1. Nome - nome do parâmetro.
  2. Script – código que será executado toda vez que o valor do parâmetro do campo Parâmetro referenciado for alterado (no nosso caso, quando escolhemos entre teste1 e teste2).
  3. Descrição – breve descrição do parâmetro.
  4. Tipo de escolha – o tipo de objeto retornado pelo script (no nosso caso retornaremos o código html).
  5. Parâmetro referenciado – o nome do parâmetro, quando seu valor for alterado, o código da seção Script será executado.

Criando parâmetros dinâmicos em um trabalho Jenkins ou como tornar sua tarefa amigável

Vamos prosseguir diretamente para o preenchimento do campo mais importante deste parâmetro. São oferecidos dois tipos de implementação para você escolher: usando Script Groovy ou Scriptler Script.
Escolhemos o primeiro, pois o Scriptler é apenas um plugin que salva scripts que você escreveu anteriormente e permite utilizá-los em outras tarefas sem copiar e colar novamente.

Código bacana para obter todos os commits do repositório selecionado:

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

Sem entrar em detalhes, este código recebe como entrada o nome do microsserviço (MICROSERVICE_NAME) e envia uma solicitação para bitbucket (método getCommitsForMicroservice) usando sua API e obtém o ID e a mensagem de confirmação de todos os commits para um determinado microsserviço.
Conforme mencionado anteriormente, este código deve retornar o html que será exibido na página Construir com parâmetros no Jenkins, então agrupamos todos os valores recebidos do Bitbucket em uma lista e os adicionamos para seleção.

Depois de concluir todas as etapas, devemos obter uma página tão bonita Construir com parâmetros.

Se você selecionou o microsserviço test1:

Criando parâmetros dinâmicos em um trabalho Jenkins ou como tornar sua tarefa amigável

Se você selecionou o microsserviço test2:

Criando parâmetros dinâmicos em um trabalho Jenkins ou como tornar sua tarefa amigável

Concorde que será muito mais conveniente para o usuário interagir com sua tarefa dessa forma do que copiar o URL todas as vezes e procurar o ID de commit necessário.

PS Este artigo fornece um exemplo muito simplificado, que pode não ser de uso prático nesta forma, uma vez que as montagens possuem muito mais parâmetros diferentes, mas o objetivo deste artigo foi mostrar como a ferramenta funciona, não fornecer uma solução funcional.

PSS Como escrevi anteriormente, se este artigo for útil, o próximo será sobre configuração dinâmica de tarefas Jenkins via código.

Fonte: habr.com

Adicionar um comentário