Integração Contínua / Entrega Contínua— Parte 1
- Parte 1 — Início
- Parte 2 — Jenkins Pipeline
- Parte 3 — Análise Estática de Código
- Parte 4 — Entrega com Ansible (AWX)
Integração contínua é um processo fundamental para o desenvolvimento de aplicações de qualidade em ambientes ágeis. Com um processo de integração contínua implementado, é possível que os desenvolvedores tenham sempre a última versão de um sistema, com a garantia de que esta versão está funcionando corretamente (e testada). Já o deploy contínuo torna mais fácil a entrega de releases ao cliente (ou clientes) e a ambientes de teste.
Imagine que você faz parte de um time que utiliza o scrum como metodologia de gerenciamento, e foi determinado que seja usado TDD (Test Driven Development) durante o desenvolvimento das funcionalidades. Para controle de código no repositório foi eleito o Git Flow. Diante deste cenário, como organizar o fluxo de desenvolvimento a fim de automatizar os processos (para otimizar o tempo), garantir a integridade da ultima versão do código, e garantir a disponibilidade desta executando no servidor?
Nesta série de artigos será desenvolvido um fluxo de integração contínua e deploy contínuo completo para um ou mais destinos, de uma aplicação node com TypeScript, de forma a atender o cenário descrito acima, de acordo com a imagem abaixo:
Ferramentas usadas no projeto:
- Gitlab — Aplicação para controle de código fonte.
- Jenkins — Servidor open-source de automação de tarefas.
- Sonarqube — Servidor de inspeção de código, para fins de qualidade.
- Ansible (AWX) — Ferramenta para automação de tarefas em servidores e grupos de servidores.
Obs.: Para agilizar o processo de instalação das ferramentas e servidores, será usado o Docker. Apesar de ser possível fazer toda a instalação dos servidores localmente, recomendo que possua conhecimento básico de docker (e docker-compose) para acompanhar este projeto.
Primeiros passos
Para iniciar, precisamos instalar e configurar o GitLab e o Jenkins, criar um repositório para nossa aplicação, e fazer com que haja a comunicação entre estes através de um webhook. Usando o docker-compose.yml abaixo, podemos subir um container de cada serviço.
Execute o compose e aguarde até que os servidores iniciem. Ao acessar http://localhost:1080, chegamos na tela inicial do Gitlab. Nesta tela, devemos escolher uma senha para o usuário padrão (root). Após alterar a senha, podemos logar no servidor.
Com o login feito, vamos criar o repositório da aplicação. Selecione Create a project e siga as instruções.
Agora para as configurações no jenkins. Acesse http://localhost:2080. No primeiro acesso, o sistema pede uma senha inicial. Para obter esta senha, digite, na mesma pasta do docker-compose.yml, o seguinte comando:
cat jenkins/secrets/initialAdminPassword
Copie a senha obtida na caixa de texto, e siga o processo de instalação, selecionando a instalação dos plugins recomendados.
Ao finalizar o processo de instalação, você poderá acessar o painel de controle do jenkins.
Obs.: Se depois de finalizar, aparecer só uma tela branca, reinicie o conteiner do jenkins.
Navegue até Manage Jenkins > Manage Plugins e selecione a aba Available. Selecione o plugin GitLab Plugin e clique em Install without restart.
Para que o jenkins possa fazer o clone dos repositórios, é preciso adicionar uma chave SSH. Gere uma chave SSH com o seguinte comando:
docker-compose exec jenkins ssh-keygen
Siga os procedimentos da geração da chave e esta será gerada no caminho “jenkins/.ssh”. Copie o conteúdo da chave privada:
cat jenkins/.ssh/id_rsa
No jenkins, navegue até Credentials, clique na seta ao lado de (global) e clique em Add credential.
Adicione a chave SSH gerada.
Com a chave gerada, clique na seta ao lado do nome de seu usuário (neste caso, “root”) e clique em Configure. Clique em Add new token, dê um nome ao token, e clique em Generate. Copie o token gerado.
Na tela inicial do jenkins, clique em New Item para adicionar um novo projeto. Dê um nome ao projeto e selecione o tipo Multibranch Pipeline (será explicado em outro artigo). Ao adicionar, você deverá configurar este projeto.
Em Branch Sources, clique em Add source e selecione Git. O campo Project Repository é onde fica o endereço do seu repositório no gitlab. o seguinte formato deve ser seguido:
git@{ENDEREÇO_GITLAB}:{USUÁRIO_GITLAB}/{NOME_DO_REPOSITÓRIO}.git
Selecione a credencial criada anteriormente no campo Credentials, marque a opção Discard old items e limite a 5 builds (na segunda caixa de digitação). Salve as configurações.
Com tudo configurado no jenkins, vamos de volta ao Gitlab para finalizar a integração. Clique na seta ao lado do seu ícone de usuário e selecione Settings. Nesta tela será cadastrado a chave pública gerada anteriormente. No diretório do docker-compose.yml, digite o comando e copie a chave:
cat jenkins/.ssh/id_rsa.pub
Cole no campo de chave pública no gitlab e salve.
Navegue até o painel de administrador (a chave inglesa no cabeçalho da página) e selecione a opção Network, conforme a imagem.
Expanda a aba Outbound Requests e marque a opção Allow requests to the local network from hooks and services. Salve esta configuração.
Faça um commit qualquer em seu repositório, como a adição de um Readme.
Com o commit feito, navegue até as configurações de seu repositório e selecione Integrations. A URL da integração deve ser preenchida no seguinte formato, onde API_TOKEN é o token gerado anteriormente no Jenkins:
http://{USUARIO_JENKINS}:{API_TOKEN}@{ENDEREÇO_JENKINS}/project/{NOME_PROJETO_JENKINS}
Desmarque a opção Enable SSL Verification e clique em Add webhook. Com o webhook criado, clique no campo Test ao lado e selecione a opção Push events. Se tudo correu certo, você deve ver uma mensagem azul conforme a imagem:
E pronto! Com isso, você tem um ambiente com gitlab e jenkins funcionando e se comunicando corretamente. Mas não acaba aí, aperte o cinto que a viagem ainda é longa 😎
Até a próxima!