Integração e Entrega continua com gitlab, google cloud, kubernetes e café

Como criar um processo de teste, integração e deploy continuo usando o fantástico recurso de Auto DevOps do GitLab?

Hoje muito se fala em DevOps. Mas o que é DevOps?
DevOps é a junção das palavras "desenvolvimento" e "operação". Uma proposta que tomou força por diversos fatores. No lado técnico, as complexidades em entregar um software de forma ágil dependendo de outro time, ou talvez uma motivação natural pela gama de ferramentas e a tão difundida computação na nuvem, ou mesmo (para os que gostam de conspiração), uma força do mundo corporativo para reduzir os gastos com profissionais de TI centralizando os esforços em um mesmo time. Enfim, isso é meio que como aquela história do quem nasceu primeiro...

Fato que é DevOps está longe de ser uma novidade. Já amplamente praticado, principalmente por Startups que podem se dar ao luxo de criar seu software escolhendo entre centenas de softwares e hardwares gratuitos ou muito acessíveis e colocar seu negócio em produção quase que instantaneamente.

Falou, falou, falou e não disse nada!

É verdade! rsrs

Nos últimos dias estive avaliando uma serie de ferramentas e oportunidades de integração entre elas. Focando em 3 coisas: praticidade, custo e integração entre elas. Brinquei com bitbucket, github, docker hub, gitlab, docker registry, aws, jira, tfs, google cloud, jenkins, tfs e muitas outras. Meu objetivo era elencar ferramentas para montar um pipeline com no minimo teste automatizado, build, deploy e integração com uma ferramenta de projetos. Depois de muito teste e avaliação das ferramentas, cheguei a conclusão que o mais pratico, melhor custo beneficio e com ótimo custo seria trabalhar com gitlab integrado ao jira, utilizando o pipeline do próprio gitlab para o build e testes, bem como o container registry dele para armazenar as imagens e para o deploy uma integração bem bacana que o gitlab oferece dentro da ferramenta deles. O Gitlab Auto DevOps trabalha preferencialmente com Kubernetes no Google Cloud. Então, isso nos permite criar um pipeline completo sem muito trabalho. Abaixo vou descrever os passos de cada ferramenta e algumas observações que ninguém nos conta e acabamos por descobrir depois de apanhar um pouco.

Instalações. Não!

Tem um custo que não levamos em consideração, que é o custo para manter hardware e software. Então, resolvi me dar ao luxo de usar tudo na nuvem.

Então, vamos aos cadastros

  • Crie uma conta no http://gitlab.com
    • Crie um grupo (isso vai evitar que você tenha que configurar cluster kubernetes por projeto)
      • No menu superior "Grupos"
    • Crie um projeto (aqui não vou sugerir que usem algum pronto pois foi o que mais vi nos tutorias e quando montamos o nosso, não funciona)
      • Crie o projeto dentro do Grupo que você criou.
    • Clone o repositório do projeto criado na sua maquina, crie uma aplicação simples que possa ser compilada e em seguida, crie um Dockerfile para esse projeto. Única observação é que exporte a porta 5000 (vi isso em uma das documentações do Auto DevOps e no meu caso só funcionou quando usei a porta 5000)
      • Seria bacana criar também um teste dentro do projeto
  • Crie uma conta no http://cloud.google.com
    • Crie uma conta de pagamento na Google Cloud
    • Crie um projeto na Google Cloud
      • Acessando http://console.cloud.google.com na parte superior esquerdo da tela existe o menu pra criar projeto.
      • Na tela de criação do projeto basta informar o nome do projeto e selecionar a conta de pagamento (é necessário para o kubernetes engine api).
    • Projeto criado, clique no menu hamburger (superior esquerdo) e clique em APIs e serviços.
      • No painel, busque por Kubernetes Engine Api, clique e ative essa api no projeto

Vamos falar de coisa boa, vamos falar de gitlab

  • Novamente no gitlab, vá no menu grupos e clique no grupo que você criou.
  • Você perceberá que existe um menu Kubernetes. 
    • Clique nesse menu e na pagina que abrir, você deve utilizar a opção de criar Cluster Kubernetes no Google Cloud (clique no botão para autenticar pelo google). 
    • Preencha um nome para o cluster (como é o cluster onde estamos liberando produção, pode chamar o cluster de produção).
    • Escolha o projeto que você criou lá no Google Cloud no combo abaixo. 
  • Feito isso, clique em criar Cluster.
  • Aguarde criar completamente o cluster no Google Cloud e todas as instancias estarem executando.
    • Você pode acompanhar a criação lá no Google Cloud, novamente pelo menu hamburger, clicando agora na opção Kubernetes Engine > Clusters.
  • Assim que concluir a criação do cluster, no gitlab, ainda dentro de grupos > (seu grupo) > Kubernetes.
    • Instale o Helm Tiller e aguarde concluir a instalação.
    • Em seguida instale o Ingress e aguarde concluir a instalação e principalmente aparecer o IP no campo do Ingress (isso é importante).
  • Copie o IP do Ingress e entre no projeto que você criou no gitlab (o repositório).
    • Vá em configurações > CI/CD > Auto DevOps
    • Se não estiver ativo, ative a opção para tornar padrão o Auto DevOps
    • E no campo Dominio, cole o IP e concatene com xip.io
      • Fica algo assim: 35.123.654.23.xip.io
  • Clique em salvar alterações
Você poderá acompanhar as execuções das pipelines do gitlab acessando o seu grupo > o repositório > clicando no menu CI/CD > pipelines.

E que bruxaria é essa ai? 

O teste que você incluiu no projeto vai rodar, a aplicação vai compilar passando pelo build, qualidade de código também executa no projeto. "Production" faz toda a comunicação com o kubernetes subindo seu container a partir do registry.gitlab.com (um registry do gitlab que guarda as suas imagens, melhor do que pagar pelo docker hub e ainda não precisa se preocupar com integração) e por última, assim que a aplicação já está disponível. Acontece um teste de performance, que pelo log parece ser um crawler usando selenium para testar a velocidade da aplicação.

Simples não? 

Sim, é! Porém, tem muito material desatualizado que acaba complicando chegar nesses passos. Algumas coisas chatas ocorrem se seguirmos passos em outra ordem. Por exemplo não incluir o Kubernetes Engine Api no projeto do Google Cloud e tentar integrar no gitlab. De problema, ai você tem que atualizar a pagina da integração do gitlab e reiniciar o preenchimento. Ou o fato do Wildcard DNS não estar tão claro que deve ser usado a partir do IP do Ingress (eu usei o xip.io, mas tem outros, como o nip.io, por exemplo).

Enfim, é isso. Espero que ajude. 
Caso esteja implementando e usando essas mesmas ferramentas e algo der errado, entre em contato ou posta no stackoverflow e coloca o link nos comentários.


Ah, quase esqueci! 

É bem simples integrar o Jira, dentro do repositório no gitlab, vá em configurações > integrações > jira. E sobre o café no titulo desse post. Acredite, foram muitos cafés até chegar nesse resultado.