Boa tarde, Habr!
Hoje eu gostaria de compartilhar uma das maneiras de como usar para tornar a tarefa em Jenkins a mais unificada e clara para o usuário.
Introdução
A sigla DevOps não é mais uma novidade para a comunidade de TI. Para muitas pessoas, a frase "fazer DevOps" está associada a algum tipo de botão mágico, ao qual, ao ser pressionado, o código do aplicativo automaticamente se transforma em um aplicativo implementado e testado (na verdade, tudo é mais complicado, mas vamos abstrair todos os processos).
Então, recebemos um pedido para criar um botão mágico que permita aos administradores implantar o aplicativo com um único clique. Existem várias formas de implementar essa tarefa: desde escrever um bot para algum mensageiro até desenvolver um aplicativo separado. No entanto, o objetivo de tudo isso é o mesmo – tornar o início da construção e implantação do aplicativo o mais transparente e conveniente possível.
No nosso caso, vamos usar Jenkins.

Tarefa
Criar um trabalho do Jenkins que irá iniciar a construção e (ou) deploy do microserviço escolhido em uma versão específica.

Dados de entrada
Temos vários repositórios onde está o código fonte de diferentes microserviços.
Definição de parâmetros
Os seguintes parâmetros devem ser fornecidos ao nosso trabalho:
- URL do repositório com o código do microserviço que queremos construir e implantar ao iniciar o trabalho.
- ID do commit, do qual será feita a construção.
AS IS
A maneira mais simples de realizar a tarefa proposta é criar dois parâmetros do tipo String.

Nesse caso, o usuário precisará inserir manualmente o caminho até o repositório e o id do commit, o que, convenhamos, não é muito conveniente.

AS TO BE
Agora vamos tentar outro tipo de parâmetros para explorar todas as suas vantagens.
Vamos criar o primeiro parâmetro com o tipo Choice Parameter e o segundo – Active Choices Reactive Reference Parameter. No parâmetro do tipo Choice, adicionaremos manualmente no campo Choices os nomes dos repositórios onde o código dos nossos microserviços está armazenado.

Se este artigo agradar ao público, na próxima matéria descreverei o processo de configuração de tarefas no Jenkins, utilizando a descrição através de código (Configuration as code), ou seja, não precisaremos inserir manualmente os nomes dos repositórios e criar parâmetros, tudo acontecerá automaticamente (nosso código obterá a lista de repositórios do SCM e criará um parâmetro com essa lista).
Os valores do segundo parâmetro serão preenchidos dinamicamente, dependendo do valor que o primeiro parâmetro assumir (test1 ou test2), já que cada repositório possui sua própria lista de commits.
Active Choices Reactive Reference Parameter possui os seguintes campos para preenchimento:
- Nome – nome do parâmetro.
- Script – código que será executado toda vez que o valor do parâmetro do campo Referenced parameter for alterado (no nosso caso, quando estivermos escolhendo entre test1 e test2).
- Descrição – descrição breve do parâmetro.
- Choice Type – tipo de objeto retornado pelo script (neste caso, retornaremos código html).
- Referenced parameter – nome do parâmetro cujo valor alterado resultará na execução do código da seção Script.

Vamos diretamente preencher o campo mais importante deste parâmetro. Para isso, temos duas opções de implementação: usar Groovy Script ou Scriptler Script.
Escolhemos o primeiro, pois o Scriptler é apenas um plugin que salva os scripts que você escreveu anteriormente e permite usá-los em outras tarefas sem repetir o copy-paste.
Código Groovy para obter todos os commits do repositório selecionado:
AUTH = "login e senha em Base64"
GIT_URL = "URL para seu SCM (https://bitbucket.org/)"
PROJECT_NAME = "nome da área do projeto onde os repositórios estão"
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), faz uma requisição ao Bitbucket (método getCommitsForMicroservice), utilizando sua API, e obtém o id e a mensagem de commit de todos os commits para este microsserviço.
Como mencionado anteriormente, este código deve retornar html, que será exibido na página Build with Parameters no Jenkins, então todos os valores obtidos do Bitbucket são envolvidos em uma lista e adicionados ao select.
Após a execução de todas as ações, devemos obter uma página bonita como esta Build with Parameters.
Se escolhemos o microsserviço test1:

Se escolhemos o microsserviço test2:

Concorda que será muito mais conveniente para o usuário interagir com sua tarefa dessa maneira, em vez de copiar a URL e procurar o commit id necessário todas as vezes?
P.S. Este artigo apresenta um exemplo muito simplificado, que pode não ter aplicação prática dessa forma, pois as composições possuem muito mais parâmetros variados, mas o objetivo deste artigo foi mostrar o funcionamento da ferramenta, e não fornecer uma solução operacional.
P.S.S. Como já mencionei anteriormente, se este artigo for útil, o próximo será sobre a configuração dinâmica de tarefas do Jenkins por meio de código.
Fonte: habr.com
