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

Se você está procurando uma maneira de testar e implantar suas imagens Docker no CircleCI, a criação de um pipeline CI/CD pode levá-lo longe na melhoria da entrega de software.

Neste tutorial, você aprenderá como potencialmente desenvolver um pipeline CI/CD para sua imagem Docker usando 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 deseja acompanhar, certifique-se de ter o seguinte:

Criando uma Imagem Docker de uma Aplicação Baseada em Python

Antes de avançar para a criação de 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á brevemente por como a aplicação é construída, escreverá os casos de teste para a aplicação e, em seguida, containerizará a aplicação.

1. Abra o seu terminal e execute o seguinte comando para instalar Flask e Pytest. 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 de projeto é chamado de flask-circleci nesta demonstração. Este diretório é onde você vai 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 fim, crie um novo arquivo (flask-circleci/Dockerfile) e escreva as instruções abaixo no 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 a partir da qual 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

# faça /flask-circleci o diretório de trabalho
WORKDIR /flask-circleci

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

RUN pip install -r requirements.txt

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

EXPOSE 5000

CMD python main.py

Criando um Pipeline CI/CD do 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 como o 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 os passos abaixo:

1. Abra seu navegador da web favorito e faça login em sua conta do 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, como 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 sua imagem Docker para seu repositório no 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 ao Docker Hub
				 # O padrão de marcação (-t) está abaixo, onde o CircleCI
				 # para obter o Dockerfile do diretório atual.
         # <docker_hub_username/docker-hub-password:versão>.
          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:versão> 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. Finalmente, execute os seguintes comandos na raiz do seu projeto para commitar e pushar o código (flask-circleci/config.yml) para o seu repositório GitHub.

git add . # adiciona alterações à área de staging
git commit -m "update" # commita suas alterações
git push # Faz o push para o GitHub

Ativando o Pipeline CircleCI CI/CD

Você acabou de criar seu Pipeline CircleCI CI/CD, mas por enquanto, ele está apenas lá parado e não fazendo muito. Você precisará ativar seu pipeline configurando um projeto em sua conta CircleCI.

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

2. Em seguida, clique na aba Projetos no painel esquerdo e clique no botão Configurar Projeto do lado direito do seu projeto para ativar o pipeline 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. Navegue de volta para a aba 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 Docker Hub.

Clique em construir para ver todos os passos que foram executados no pipeline.

Viewing Project Status

Abaixo, você pode ver a lista de etapas que o CircleCI realizou para executar o pipeline.

Viewing Steps that Ran the Pipeline

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

Viewing Pushed circleci docker images in Docker Hub Repository

Enviando Alterações para o GitHub para Acionar o Pipeline CircleCI

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

1. Em sua máquina local, substitua o código que você possui em test_main.py com o código abaixo. O código abaixo tem o propósito de garantir que o teste falhe, 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('/') 

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

2. Em seguida, substitua as etapas 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 as novas alterações sejam enviadas para o seu repositório no 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 confirmar e enviar o código para o seu repositório no GitHub.

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

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

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

Viewing Project Status (Failed)
Showing Failed Tests

5. Por último, vá para o repositório do 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 implementa sua imagem Docker no Heroku?

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