Continuous Integration

1 post

Implementando uma Esteira CI/CD com Docker, Jenkins e AWS EKS

Implementando uma Esteira CI/CD com Docker, Jenkins e AWS EKS

A adoção de práticas de Continuous Integration (CI) e Continuous Deployment (CD) tem se tornado essencial para equipes de desenvolvimento que buscam agilidade, qualidade e eficiência no processo de entrega de software. Neste artigo, vamos explorar como criar uma esteira CI/CD utilizando Docker, Jenkins e AWS Elastic Kubernetes Service (EKS). Vamos abordar cada componente em detalhes e fornecer exemplos práticos para ilustrar o processo.

Introdução ao CI/CD

O CI/CD é uma metodologia que visa automatizar o processo de integração e entrega de código. Ao integrar continuamente as mudanças no código-fonte e implantá-las automaticamente em um ambiente de produção, as equipes podem reduzir o tempo de ciclo de desenvolvimento, melhorar a qualidade do software e aumentar a confiança na entrega de novas funcionalidades.

Componentes da Esteira CI/CD

Para construir uma esteira CI/CD robusta, precisamos de alguns componentes-chave:

  • Docker: Um sistema de containerização que permite empacotar aplicações e suas dependências em imagens, facilitando a implantação em diferentes ambientes.
  • Jenkins: Uma ferramenta de automação de software de código aberto que permite orquestrar tarefas de construção, teste e implantação.
  • AWS EKS: Um serviço gerenciado da Amazon Web Services que facilita a execução de aplicações em contêineres usando o Kubernetes.

Configurando o Docker

O Docker é fundamental para criar ambientes consistentes e reproduzíveis para nossas aplicações. Vamos começar configurando um Dockerfile para nossa aplicação.

Criando um Dockerfile

Um Dockerfile é um script que contém instruções para construir uma imagem Docker. Aqui está um exemplo simples para uma aplicação Node.js:


      FROM node:14
      WORKDIR /app
      COPY package*.json ./
      RUN npm install
      COPY . .
      EXPOSE 3000
      CMD ["node", "app.js"]
    

Este Dockerfile inicia a partir da imagem oficial do Node.js, define o diretório de trabalho, copia os arquivos de configuração, instala as dependências, copia o código-fonte e expõe a porta 3000.

Construindo e Executando a Imagem Docker

Para construir a imagem Docker, use o seguinte comando:


      docker build -t minha-app .
    

E para executar o contêiner:


      docker run -p 3000:3000 minha-app
    

Configurando o Jenkins

O Jenkins é uma ferramenta poderosa para automatizar tarefas de CI/CD. Vamos configurá-lo para construir e testar nossa aplicação sempre que houver uma mudança no repositório.

Instalando o Jenkins

Você pode instalar o Jenkins em sua própria máquina ou usar um serviço gerenciado como o Jenkins X. Para este exemplo, vamos supor que você já tenha o Jenkins instalado e configurado.

Criando um Pipeline no Jenkins

Um pipeline no Jenkins é um conjunto de tarefas que são executadas em sequência. Vamos criar um pipeline para construir, testar e implantar nossa aplicação.


      pipeline {
          agent any
          stages {
              stage('Build') {
                  steps {
                      sh 'docker build -t minha-app .'
                  }
              }
              stage('Test') {
                  steps {
                      sh 'docker run minha-app npm test'
                  }
              }
              stage('Deploy') {
                  steps {
                      sh 'docker push minha-app:latest'
                      sh 'kubectl apply -f deployment.yaml'
                  }
              }
          }
      }
    

Este pipeline define três estágios: Build, Test e Deploy. No estágio Build, ele constrói a imagem Docker. No estágio Test, ele executa os testes dentro do contêiner. No estágio Deploy, ele envia a imagem para um registro Docker e aplica um manifesto Kubernetes para implantar a aplicação no EKS.

Configurando o AWS EKS

O AWS EKS é um serviço gerenciado que facilita a execução de aplicações em contêineres usando o Kubernetes. Vamos configurar um cluster EKS e implantar nossa aplicação nele.

Criando um Cluster EKS

Para criar um cluster EKS, você pode usar a AWS Management Console, a CLI da AWS ou o CloudFormation. Aqui está um exemplo usando a CLI da AWS:


      eksctl create cluster --name meu-cluster --region sa-east-1 --nodes 2
    

Este comando cria um cluster EKS chamado “meu-cluster” na região “sa-east-1” com 2 nós.

Configurando o kubectl

Para interagir com o cluster EKS, você precisa configurar o kubectl:


      aws eks --region sa-east-1 update-kubeconfig --name meu-cluster
    

Este comando atualiza o arquivo de configuração do kubectl para apontar para o cluster EKS.

Criando um Deployment no Kubernetes

Um deployment no Kubernetes é uma abstração que gerencia um conjunto de pods idênticos. Vamos criar um deployment para nossa aplicação:


      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: minha-app
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: minha-app
        template:
          metadata:
            labels:
              app: minha-app
          spec:
            containers:
            - name: minha-app
              image: 123456789012.dkr.ecr.sa-east-1.amazonaws.com/minha-app:latest
              ports:
              - containerPort: 3000
    

Este deployment cria 3 réplicas do contêiner “minha-app” usando a imagem armazenada no Amazon ECR.

Integrando Tudo

Agora que temos todos os componentes configurados, vamos integrar tudo para criar uma esteira CI/CD completa.

Fluxo de Trabalho Completo

  1. Um desenvolvedor faz uma mudança no código-fonte e envia uma pull request para o repositório.
  2. O Jenkins detecta a mudança e inicia um pipeline.
  3. O pipeline constrói a imagem Docker, executa os testes e, se tudo estiver correto, envia a imagem para o Amazon ECR.
  4. O pipeline aplica o deployment no Kubernetes, atualizando as réplicas do contêiner no cluster EKS.
  5. A aplicação é implantada e pronta para uso.

Conclusão

Neste artigo, exploramos como criar uma esteira CI/CD utilizando Docker, Jenkins e AWS EKS. Ao automatizar o processo de construção, teste e implantação, podemos entregar software de forma mais rápida, confiável e eficiente. Com as práticas de CI/CD, as equipes podem se concentrar em inovar e melhorar continuamente suas aplicações.

Palavras-chave

CI/CD, Continuous Integration, Continuous Deployment, Docker, Jenkins, AWS EKS, Kubernetes, DevOps, automação, pipeline, deployment, containerização, Amazon Web Services, ECR, kubectl, desenvolvimento ágil