Este blog explica como criar um pipeline de implantação usando o Jenkins e o Docker para um aplicativo Java que se comunica com um banco de dados.
O Jenkins oferece suporte à criação de pipelines. Eles são criados com scripts de texto simples que usam uma DSL (linguagem específica de domínio) de pipeline baseada na linguagem de programação Groovy. O script, normalmente chamado de Arquivo Jenkins
, define vários
para executar tarefas simples e complexas de acordo com os parâmetros que você estabelece. Uma vez criados, os pipelines podem desenvolver código e orquestrar o trabalho necessário para conduzir os aplicativos do commit à entrega.
Um pipeline consiste em etapas, nó e estágio. Um pipeline é executado em um nó - um computador que faz parte da instalação do Jenkins. Um pipeline geralmente consiste em várias etapas. Um estágio consiste em várias etapas. Ler
Primeiros passos com o Pipeline para obter mais detalhes.
Para o nosso aplicativo, aqui está o fluxo básico:
O código-fonte completo do aplicativo usado está em github.com/arun-gupta/docker-jenkins-pipeline.
O aplicativo é definido no aplicativo da web
diretório. Ele abre uma conexão com o diretório Couchbase e armazena um documento JSON simples usando SDK Java do Couchbase.
O aplicativo também tem um teste que verifica se o banco de dados realmente contém o documento que foi persistido.
Muito obrigado a @alexsotob por me ajudar com a configuração do Jenkins.
Vamos começar!
Faça o download e instale o Jenkins
- Faça o download do Jenkins em jenkins.io. Isso foi testado com Jenkins 2.21.
- Iniciar Jenkins:
1JENKINS_HOME=~/.jenkins java -frasco ~/Downloads/jenkins-2.21.war --httpPort=9090
Esse comando inicia o Jenkins especificando o diretório inicial onde todas as informações de configuração são armazenadas. Ele também define a porta na qual o Jenkins
está ouvindo,9090
neste caso. - A primeira inicialização do Jenkins mostra a seguinte mensagem no console:
1234567891011121314***************************************************************************************************************************************************************************************Jenkins inicial configuração é necessário. Um administrador usuário tem foram criado e a senha gerado.Por favor uso o seguintes senha para prosseguir para instalação:3521fbc3d40448efa8942f8e464b2dd9Isso pode também ser encontrado em: /Usuários/arungupta/.jenkins/segredos/initialAdminPassword***************************************************************************************************************************************************************************************
Copie a senha mostrada aqui. Ela será usada para desbloquear o Jenkins. - Acesse o console do Jenkins em localhost:9090 e cole a senha:
Clique emPróximo
. - Crie o primeiro usuário administrador conforme mostrado:
Clique emSalvar e finalizar
. - Clique em
Instalar os plug-ins sugeridos
:
Vários plug-ins padrão estão instalados:
Achei surpreendente o fato de o Ant e o Subversion serem os plug-ins padrão. - A tela de login é exibida.
Digite o nome de usuário e a senha especificados anteriormente. - Finalmente, o Jenkins está pronto para ser usado:
São muitas etapas para começar a usar o Jenkins básico. Eu realmente preciso passar por todos esses obstáculos para começar a usar o Jenkins? Existe uma maneira mais fácil, mais simples, mais burra, mais preguiçosa de começar a usar o Jenkins? Siga a Convenção sobre Configuração
e me dar uma instalação pré-configurada com um clique.
Instalar os plug-ins do Jenkins
Instale os plug-ins necessários no Jenkins.
- Se o seu projeto Java for criado usando o Maven, você precisará configurar o Maven no Jenkins. Clique em
Gerenciar o Jenkins
,Configuração global da ferramenta
,Instalações do Maven
e especifique o local do Maven.
Nomeie a ferramenta comoMaven3
Mais uma vez, é um pouco chato, porque Jenkins não pode pegar o local padrão do Maven em vez de esperar que o usuário especifique um local. - Clique em
Gerenciar o Jenkins
,Gerenciar plug-ins
,Disponível
procure portubo de encaixe
. SelecionePipeline do Docker da CloudBees
, clique emInstalar sem reiniciar
.
Clique emInstalar sem reiniciar
.Plug-in de pipeline do Docker O plug-in entende o arquivo do Jenkins e executa
os comandos listados ali. - A próxima tela mostra a lista de plug-ins instalados:
A última linha mostra que o plug-in do Docker Pipeline da CloudBees foi instalado com êxito. SelecioneReiniciar o Jenkins
caixa de seleção. Isso também instalará a reinicialização do Jenkins.
Criar trabalho Jenkins
Vamos criar um trabalho no Jenkins que executará o pipeline.
- Depois que o Jenkins for reiniciado, ele mostrará a tela de login. Digite o nome de usuário e a senha criados anteriormente. Isso o leva de volta a
Instalação de plug-ins/atualizações
página. Clique no ícone do Jenkins no canto superior esquerdo para ver o painel principal:
- Clique em
criar novos empregos
, forneça o nome comolinha de base do docker-jenkins
e escolha o tipo como Pipeline:
Clique em OK. - Configure o Pipeline conforme mostrado:
O repositório git local é usado nesse caso. Você certamente pode escolher um repositório hospedado no github. Além disso, esse repositório pode ser configurado com um git hook ou sondagem em um intervalo constante para acionar o pipeline. Clique em
Salvar
para salvar a configuração.
Executar o Jenkins Build
Antes de iniciar o trabalho, o banco de dados do Couchbase precisa ser iniciado explicitamente como:
1 |
doca executar -d --nome db -p 8091-8093:8091-8093 -p 11210:11210 arungupta/oreilly-couchbase:mais recente |
Isso será resolvido após #9 foi corrigido. Verifique se você pode acessar o Couchbase em http://localhost:8091, use Administrador
como o login e senha
como a senha. Clique em Compartimentos de dados
e veja a guia livros
balde criado.
Clique em Construir agora
e você verá um resultado semelhante a:
Todo verde é bom!
Vamos tentar entender o que aconteceu nos bastidores. Arquivo Jenkins descreve como o pipeline é criado. No nível superior, ele tem quatro estágios - Package, Create
Imagem do Docker, Executar aplicativo e Executar testes. Cada estágio é mostrado como uma caixa no painel do Jenkins. O tempo total gasto em cada estágio é mostrado na caixa.
Vamos entender o que acontece em cada estágio.
- Pacote - O código-fonte do aplicativo reside no diretório
aplicativo da web
diretório. Comando Mavenmvn clean package -DskipTests
é usado para criar um arquivo JAR do aplicativo. Observe que o projeto maven também inclui
os testes e são explicitamente ignorados usando-DskipTests
. Normalmente, os testes estariam em um projeto separado a jusanteO projeto Maven cria um arquivo JAR distante
do aplicativo e inclui todas as dependências. - Criar imagem do Docker - A imagem do Docker do aplicativo é criada usando o Dockerfile no
aplicativo da web
diretório.
A imagem simplesmente inclui o JAR fat e o executa usandojava -jar
Cada imagem é marcada com o número de compilação usando${env.BUILD_NUMBER}
. - Executar aplicativo - A execução do aplicativo envolve a execução do contêiner do Docker do aplicativo. O endereço IP do contêiner do banco de dados é identificado usando o parâmetro
inspeção de docas
O contêiner do banco de dados e o aplicativo
estão ambos em execução no contêiner padrãoponte
rede. Isso permite que os dois contêineres se comuniquem entre si. Outro aprimoramento seria executar o pipeline em um cluster no modo swarm. Isso exigiria a criação de
e usar umsobreposição
rede. - Executar testes - Os testes são executados no contêiner usando o
teste mvn
comando. Se os testes forem aprovados, a imagem será enviada para o Docker Hub. Os resultados do teste são capturados de qualquer maneira. Esse estágio também mostra o uso detentar
/captura
/finalmente
no Jenkinsfile. Se os testes forem aprovados, a imagem será enviada para o Docker Hub. Nesse caso, ela está disponível em hub.docker.com/r/arungupta/docker-jenkins-pipeline/tags/.
Algumas tarefas ...
- Mova os testes para um projeto downstream (#7)
- Use o Git hook ou poll para acionar o pipeline (#8)
- Automatizar a inicialização/desligamento do banco de dados (#9)
- Execute o pipeline em um cluster de Docker Engines com o modo Swarm (#10)
- Mostrar configuração alternativa para enviar a imagem para o bintray (#11)
Outro ponto problemático é que a sintaxe das variáveis globais não parece estar documentada em lugar algum. Ela só está disponível em :/job/docker-jenkins-pipeline/pipeline-syntax/globals. Mais uma vez, isso é um pouco ruim!
”
Não é impossível, apenas ainda não foi implementado" #sadpanda
Algumas referências adicionais para ler:
- Primeiros passos com o Jenkinsfile
- Plug-in de pipeline do Docker da CloudBees
- Guia do usuário do plug-in do pipeline do Docker da CloudBees
- Referência do Jenkinsfile DSL
- Palestra sobre o pipeline Jenkins do JavaZone 2016
Mais informações sobre o Couchbase:
Sinta-se à vontade para registrar bugs em github.com/arun-gupta/docker-jenkins-pipeline/issues ou enviar RP.