Bom dia, Habr!
Hoje gostaria de compartilhar uma das maneiras 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.
Tarefa
Crie um trabalho Jenkins conveniente que iniciará a construção e (ou) implantação do microsserviço selecionado de uma determinada versão.
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:
- A URL do repositório com o código do microsserviço que queremos construir e implantar ao executar o trabalho.
- 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.
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.
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.
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:
- Nome - nome do parâmetro.
- 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).
- Descrição – breve descrição do parâmetro.
- Tipo de escolha – o tipo de objeto retornado pelo script (no nosso caso retornaremos o código html).
- Parâmetro referenciado – o nome do parâmetro, quando seu valor for alterado, o código da seção Script será executado.
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:
Se você selecionou o microsserviço test2:
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