Como Criar um Pipeline CI/CD para Imagens Docker no CircleCI

Se você está procurando uma maneira de testar e implantar suas imagens Docker do CircleCI, criar um pipeline CI/CD pode ajudar a melhorar a entrega de software.

Neste tutorial, você aprenderá como desenvolver um pipeline CI/CD para sua imagem Docker usando o CircleCI.

Continue lendo e implante suas imagens Docker apenas se elas passarem no teste!

Pré-requisitos

Este tutorial será uma demonstração prática. Se você quiser acompanhar, certifique-se de ter o seguinte:

Criando uma imagem Docker de uma aplicação baseada em Python

Antes de começar a criar um pipeline CI/CD, você primeiro criará uma imagem Docker com base em uma aplicação Python que exibe textos em um navegador da web. Você passará rapidamente pela construção da aplicação, escreverá casos de teste para a aplicação e, em seguida, criará o contêiner da aplicação.

1. Abra o seu terminal e execute o seguinte comando para instalar o Flask e o Pytest. O Flask é um framework usado para construir aplicações web em Python enquanto o Pytest é usado para escrever testes de código Python.

pip install flask pytest

2. Em seguida, crie um diretório de projeto com o nome de sua preferência, mas o diretório do projeto é chamado de flask-circleci neste exemplo. Este diretório é onde você irá armazenar seus recursos para este tutorial.

mkdir flask-circleci

3. Crie um arquivo chamado flask-circleci/main.py e preencha com o seguinte código.

O código abaixo exibe o texto “Bem-vindo à minha Aplicação Flask” em uma página inicial no navegador.

from flask import Flask

app = Flask(__name__) #criar uma instância da classe Flask que você acabou de importar

@app.route('/')
def main():
    #exibir uma string na página inicial
    return "Welcome to my Flask App"

4. Agora, crie outro arquivo chamado flask-circleci/test_main.py e copie/cole o seguinte código.

O código abaixo cria um cliente de teste para sua aplicação.

O Pytest requer que o nome do seu arquivo de teste comece com test_ como demonstrado abaixo.

from main import app

def test_main():
		# Cria um cliente de teste para esta aplicação.
    response = app.test_client().get('/') 

		# assert o código de status da página ('/') é 200
    assert response.status_code == 200 
		# assert o retorno para a página
    assert response.data == b'Welcome to my Flask App' 

5. Execute os seguintes comandos para navegar até o diretório do seu projeto (flask-circleci), execute o teste para o seu projeto.

cd flask-circleci
pytest

Se o teste for bem-sucedido, você obterá 100% de progresso, como mostrado abaixo.

Running Test for the Project

6. Em seguida, crie um arquivo de texto (requirements.txt) para documentar suas dependências no diretório raiz e preencha o texto abaixo. Este arquivo é essencial ao construir sua imagem Docker para que ela funcione corretamente.

Flask==2.0.3
pytest==6.2.5

7. Por último, crie um novo arquivo (flask-circleci/Dockerfile) e escreva as instruções abaixo para o Dockerfile para construir sua imagem Docker.

As instruções no Dockerfile realizam o seguinte:

  • Cria um arquivo em sua imagem.
  • Copia todos os arquivos no diretório atual (flask-circleci).
  • Execute seu código
# defina a Imagem Base sobre a qual a sua imagem será construída
FROM python:3.8 
# crie um diretório chamado flask-circleci na raiz.
# Este diretório conterá o código que atualmente reside em
RUN mkdir /flask-circleci

# torne /flask-circleci o diretório de trabalho
WORKDIR /flask-circleci

# copie o seu arquivo de requisitos para o diretório que acabou de criar
COPY requirements.txt /flask-circleci 

RUN pip install -r requirements.txt

# copie o diretório atual em sua máquina local para /flask-circleci em sua imagem
ADD . /flask-circleci

EXPOSE 5000

CMD python main.py

Criando um Pipeline CI/CD CircleCI

Agora que você tem sua imagem Docker pronta, você criará um pipeline CI/CD para testar seu código, e se todos os testes passarem, a imagem Docker será enviada para o Docker Hub. O Docker Hub é um serviço semelhante ao GitHub, mas para imagens Docker, que ajuda você a encontrar e compartilhar imagens de contêiner com sua equipe ou outros desenvolvedores.

Para criar o pipeline CI/CD, siga as etapas abaixo:

1. Abra seu navegador da web favorito e faça login na sua conta Docker Hub.

2. Na página inicial do Docker Hub, clique na opção Criar Repositório para criar um repositório no Docker Hub.

Creating a Repository

3. Defina um nome único para o seu repositório. Este tutorial usa um repositório chamado circleci-tutorial, conforme mostrado abaixo.

Naming and Creating the Docker Hub Repository

4. Crie um novo arquivo (flask-circleci/config.yml) na raiz do seu projeto e copie/cole o código abaixo para o arquivo config.yml.

O código abaixo obtém uma imagem Python pronta e a utiliza para instalar as dependências e executar os testes unitários para construir e enviar a sua imagem Docker para o seu repositório Docker Hub.

Geralmente, para um projeto em produção, você gostaria de colocar seu nome de usuário e senha protegidos dentro do CircleCI ou talvez em um arquivo .env.

version: 2  # Versão do CircleCI
jobs:
  build:
    docker:
      - image: python:3.8
    steps:
      - checkout

      - run:
        # cria um ambiente virtual para o seu projeto,
				# instala dependências nele e executa testes
          name: Run unit tests
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -r requirements.txt
            pytest
			# Cria um ambiente Docker remoto configurado para executar comandos Docker.
      - setup_remote_docker 
       
      - run:
        # instala um cliente Docker que será usado para executar os comandos docker
          name: Install Docker client
          command: |
            set -x
            VER="17.03.0-ce"
            curl -L -o /tmp/docker-$VER.tgz https://get.docker.com/builds/Linux/x86_64/docker-$VER.tgz
            tar -xz -C /tmp -f /tmp/docker-$VER.tgz
            mv /tmp/docker/* /usr/bin
      - run:
         # Constrói uma imagem docker para enviar para o Docker Hub
				 # O padrão de tag (-t) é o seguinte, onde o CircleCI
				 # para obter o Dockerfile do diretório atual.
         # <docker_hub_username/docker-hub-password:version>.
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v1 .

      - run:
        # Envia a imagem Docker que você criou para o Docker Hub.
        # Substitua khabdrick/circleci-tutorial:v1 pelo
				# <docker_hub_username/docker-hub-password:version> que você usou para construir a imagem acima
          name: Push to Docker Hub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v1

5. Por fim, execute os seguintes comandos na raiz do seu projeto para commit e push o código (flask-circleci/config.yml) para o seu repositório no GitHub.

git add . # adiciona as alterações à área de preparação
git commit -m "update" # faz commit das suas alterações
git push # Faz o push para o GitHub

Ativando o Pipeline CI/CD do CircleCI

Você acabou de criar o seu Pipeline CI/CD do CircleCI, mas no momento ele está apenas parado e não fazendo nada. Você precisará ativá-lo configurando um projeto na sua conta do CircleCI.

1. Faça login na sua conta do CircleCI com a sua conta do GitHub no seu navegador da web.

2. Em seguida, clique na guia Projetos no painel esquerdo e clique no botão Configurar Projeto no lado direito do seu projeto para ativar o pipeline do CircleCI no projeto.

Como você fez login no CircleCI com sua conta do GitHub, seus projetos são sincronizados com o CircleCI, como na imagem abaixo.

Setting up a Project

3. Volte para a guia Painel e você verá o status de Sucesso. O status de Sucesso indica que tudo foi executado conforme o esperado e a imagem foi enviada para o seu repositório do Docker Hub.

Clique em “build” para ver todos os passos executados no pipeline.

Viewing Project Status

Abaixo, você pode ver a lista de passos que o CircleCI executou para rodar o pipeline.

Viewing Steps that Ran the Pipeline

4. Por fim, volte para o seu repositório do Docker Hub e você verá a imagem que você enviou para o Docker Hub através do pipeline do CircleCI.

Viewing Pushed circleci docker images in Docker Hub Repository

Enviando alterações para o GitHub para acionar o pipeline do CircleCI.

Neste momento, você já possui um pipeline funcional no CircleCI. No entanto, talvez você tenha feito alterações em seu projeto. Se sim, como você saberia se o pipeline ainda está funcionando? Você pode acionar o CircleCI ao enviar alterações para o repositório GitHub e verificar se o teste será bem-sucedido.

1. Em sua máquina local, substitua o código que você tem em test_main.py pelo código abaixo. O código abaixo tem a intenção de fazer o teste falhar, pois o código de status mudou de 200 para 400.

from main import app

def test_main():
		# Cria um cliente de teste para esta aplicação.
    response = app.test_client().get('/') 

		# assegura que o código de status da página('/') é 400 quando não é,
		# causando a falha do teste.
    assert response.status_code == 400 
		# assegura o retorno na página
    assert response.data == b'Flask App' 

2. Em seguida, substitua as steps no config.yml que constroem a imagem Docker e a enviam para o Docker Hub com o código abaixo.

No código abaixo, você está apenas alterando a versão para garantir que apenas novas alterações sejam enviadas para o seu repositório GitHub.

      - run:
          name: Build Docker image
          command: docker build -t khabdrick/circleci-tutorial:v2 .

      - run:
          name: Push to DockerHub
          command: |
            docker login -u username -p password
            docker push khabdrick/circleci-tutorial:v2

3. Execute os seguintes comandos na raiz do seu projeto para commit e push o código para o seu repositório GitHub.

git add . # adiciona alterações à área de preparação
git commit -m "v2" # faz commit das suas alterações
git push # Envie para o GitHub

4. Agora, vá para o painel do CircleCI e você verá que a construção Failed, como mostrado abaixo.

Clique em construir para ver os passos tomados para enviar as alterações e confirmar o que causou a falha na compilação.

Viewing Project Status (Failed)
Showing Failed Tests

5. Por último, vá para o repositório Docker Hub e confirme que as alterações não foram enviadas.

Como você pode ver na imagem abaixo, a versão 2 não foi carregada porque o teste falhou.

Viewing Repository in Docker Hub

Conclusão

Ao longo deste tutorial, você aprendeu como escrever testes e Dockerizar sua aplicação Python. Você criou um pipeline CI/CD com o CircleCI que executa o teste para sua aplicação e envia sua imagem Docker para o Docker Hub.

Neste ponto, você já possui um conhecimento fundamental para desenvolver um pipeline CI/CD com o CircleCI. Agora, como pretende usar esse conhecimento recém-adquirido? Talvez criando um pipeline CI/CD que implante sua imagem Docker no Heroku?

Source:
https://adamtheautomator.com/circleci-docker-images/