Criando parâmetros dinâmicos em um trabalho Jenkins ou como tornar sua tarefa fácil de usar

Bom dia, Habr !


Hoje, gostaria de compartilhar uma das maneiras de usar o Active Choices Plugin para tornar a tarefa no Jenkins a mais unificada e compreensível para o usuário.


1. Introdução


Uma abreviação como DevOps não é mais algo novo para a comunidade de TI. Para muitas pessoas, a frase "make DevOps" está associada a algum tipo de botão mágico; quando você clica nele, o código do aplicativo se transforma automaticamente em um aplicativo implantado e testado (tudo é realmente mais complicado, mas abstraímos todos os processos).


Portanto, recebemos um pedido para criar um botão tão mágico para que os administradores possam implantar o aplicativo com um clique. Existem vários tipos de implementação desta tarefa: desde a criação de um bot para qualquer um dos mensageiros até o desenvolvimento de um aplicativo separado. No entanto, o objetivo de tudo isso é o mesmo - tornar o lançamento da montagem e a implantação do aplicativo o mais transparente e conveniente.


No nosso caso, usaremos o Jenkins .



Desafio


Crie um trabalho conveniente do Jenkins que executará a montagem e / ou a implantação do microsserviço selecionado de uma determinada versão.



Dados de entrada


Temos vários repositórios que contêm o código fonte de vários microsserviços.


Definição de Parâmetros


Os seguintes parâmetros devem inserir a entrada do nosso trabalho:


  1. A URL do repositório com o código de microsserviço que queremos coletar e implantar ao iniciar o trabalho.
  2. ID da confirmação a partir da qual a montagem ocorrerá.

COMO ESTÁ


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



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



COMO ESTÁ


Agora vamos tentar um tipo diferente de parâmetro para considerar todas as suas vantagens.
Crie o primeiro parâmetro do tipo Parâmetro de escolha, o segundo - Parâmetro de referência reativa de opções ativas. No parâmetro com o tipo Choice, adicionaremos manualmente os nomes dos repositórios em que o código de nossos microsserviços está armazenado no campo Opções.



Se o público gostar deste artigo, no próximo artigo, descreverei o processo de configuração de tarefas no Jenkins usando a descrição através do código (Configuração como código), ou seja, não precisamos inserir manualmente os nomes dos repositórios 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 receber (test1 ou test2), porque cada repositório possui sua própria lista de confirmações.


O parâmetro de referência reativa de opções ativas possui os seguintes campos a serem preenchidos:


  1. Nome - o nome do parâmetro.
  2. Script - o código que será executado sempre que o valor do parâmetro no campo Parâmetro referenciado for alterado (no nosso caso, quando escolhermos entre test1 e test2).
  3. Descrição - uma breve descrição do parâmetro.
  4. Tipo de escolha - o tipo do objeto retornado pelo script (no nosso caso, retornaremos o código html).
  5. Parâmetro referenciado - o nome do parâmetro, ao alterar o valor em que o código da seção Script será executado.


Prosseguimos diretamente no preenchimento do campo principal neste parâmetro. Nos são oferecidos dois tipos de implementação: usando Groovy Script ou Scriptler Script .
Selecionamos o primeiro, já que o Scriptler é apenas um plug-in que salva os scripts que você já escreveu e permite que você os use em outras tarefas sem ter que copiar novamente.


Código Groovy para obter todas as confirmações 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, esse código recebe o nome do microsserviço (MICROSERVICE_NAME) como uma entrada, envia uma solicitação ao Bitbucket (método getCommitsForMicroservice ) usando sua API e recebe a mensagem de identificação e confirmação de todos os commits desse microsserviço.
Como mencionado anteriormente, esse código deve retornar o html que será exibido na página Compilar com Parâmetros no Jenkins, portanto, agrupamos todos os valores recebidos do Bitbucket na lista e adicionamos para selecionar.


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


Se você selecionar microsserviço test1:



Se você escolher o microsserviço test2:



Concorde que será muito mais conveniente para o usuário interagir com sua tarefa dessa maneira do que copiar o URL a cada vez e procurar o ID de confirmação necessário.


PS Este artigo fornece um exemplo muito simplificado, que pode não ter aplicação prática neste formulário, pois os conjuntos têm parâmetros muito mais diferentes, mas o objetivo deste artigo era mostrar o funcionamento da ferramenta e não fornecer uma solução funcional.


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

Source: https://habr.com/ru/post/pt485664/


All Articles