Ir para o conteúdo

✔️ Integração contínua

Integração contínua

Conceito

O desenvolvedor integra o código alterado e/ou desenvolvido ao projeto principal na mesma frequência com que as funcionalidades são desenvolvidas, sendo feito muitas vezes.

Todo o nosso projeto será construído utilizando testes automatizados, e sempre rodaremos os testes localmente.

Mas como garantir que minha alteração não impacta com o restante do projeto, ter isto de forma simples e automatizada? Como garantir que a qualidade do código foi mantida?

Utilizaremos o serviço Github Actions para checar que nosso código não quebra a "build", ou seja, quando integrado o novo código ao sistema, todo o sistema continua funcional.

Basicamente, a grande vantagem da integração contínua está no feedback instantâneo. Isso funciona da seguinte forma: a cada commit no repositório, o build é feito automaticamente, com todos os testes sendo executados de forma automática e falhas sendo detectadas. Se algum commit não compilar ou quebrar qualquer um dos testes, a equipe toma conhecimento instantâneamente (através de email, por exemplo, indicando as falhas e o commit causador das mesmas). A equipe pode então corrigir o problema o mais rápido possível, o que é fundamental para não introduzir erros ao criar novas funcionalidades, refatorar, etc. Integração contínua é mais uma forma de trazer segurança em relação a mudanças: você pode fazer modificações sem medo, pois será avisado caso algo saia do esperado.

Ferramentas

Vamos instalar algumas ferramentas para nos ajudarem a terem um código bem organizado e testado.

🔠 isort

O que é?

isort é uma ferramenta que ordena de forma alfabética as importações, separando as bilbiotecas que são padrões da linguagem, as externas ao sistema e as nativas do próprio sistema.

Para que serve?

O isort irá modificar o seu código ordenando as importações alfabéticamente. Dessa forma, o bloco de importações fica organizado e padronizado no projeto.

Como instalar

Execute o comando abaixo:

poetry add isort --dev

Info

Utilizamos a opção --dev pois é um pacote necessário somente durante o desenvolvimento e não durante a execução do software.

Configuração

Precisamos adicionar no arquivo pyproject.toml a seguinte configuração

[tool.isort]
profile = "black"
line_length = 79

Como executar

poetry run isort .

Assim evitamos um conflito com a ferramenta black e flake8.

✨ Black

O que é?

Black é o formatador de código Python intransigente. Ao usá-lo, você concorda em ceder o controle sobre as minúcias da formatação manual. Em troca, o black dá a você velocidade, determinismo e liberdade do irritante pycodestyle sobre formatação. Você economizará tempo e energia mental para assuntos mais importantes.

Para que serve?

O black é um formatador automático de código, ele irá modificar o seu código seguindo o guia de estilo do Python. Iremos configurá-lo junto ao nosso editor para que a formatação seja feita através de um atalho do teclado como shift + ctrl + i.

Como instalar

Execute o comando abaixo:

poetry add black --dev

Info

Utilizamos a opção --dev pois é um pacote necessário somente durante o desenvolvimento e não durante a execução do software.

Configuração

Precisamos adicionar no arquivo pyproject.toml a seguinte configuração

[tool.black]
line-length = 79

Como executar

poetry run black .

Assim evitamos um conflito com a ferramenta flake8.

🎨 Flake8

O que é?

Flake8 é um programa de linha de comando que verifica seu código e busca por erros ou formatações que não seguem o guia de estilo padrão do python, conhecido como PEP-8 . Além disso também verifica a complexidade ciclomática do seu código.

Para que serve?

É muito comum cometermos alguns erros de sintaxe, principalmente quando ainda estamos nos familiarizando com uma linguagem nova. Assim como durante o nosso dia a dia podemos esquecer algum código não utilizado. Esta ferramenta vai analisar o seu código e procurar possíveis erros, evitando assim que só ocorram no momento em que o código for executado. Esta ferramenta também aponta possíveis linhas que não estão seguindo o estilo de código definido para a linguagem python. Outra coisa bem comum quando estamos escrevendo código é que uma parte dele começa a se tornar tão complexa que há n caminhos por onde seu algoritmo pode seguir. Normalmente isto indica que devemos modificar o código para torná-lo mais simples e legível. O Flake8 irá apontar qual parte do seu código está complexa e que deve ser modificada. Esta ferramenta será integrada ao editor, dessa maneira, ao salvar o arquivo, teremos os erros encontrados apontados diretamente no mesmo.

Como instalar

Execute o comando abaixo:

poetry add flake8 --dev

Info

Utilizamos a opção --dev pois é um pacote necessário somente durante o desenvolvimento e não durante a execução do software.

Como executar

poetry run flake8 .

Info

Pode ser necessário a intervenções manuais para que o código seja corrigido.

🕵️ pre-commit (Menção honrosa 🏅)

Existem ferramentas que podem executar algum comando antes de um commit, com o objetivo de identificar possíveis problemas no seu programa antes do envio do código para o repositório remoto. Os comandos listados acima são bons exemplos de execuções que podem ocorrer neste momento. Uma das ferramentas que provê essa funcionalidade é o pre-commit. Para saber mais, clique aqui.

🐱 Configurando o Github Actions

  • Crie a pasta .github/workflows dentro do seu repositório. Essa é a pasta padrão para as configurações do Github Actions.

  • Dentro da pasta crie um arquivo chamado main.yml. Esse arquivo será utilizado para determinar quais passos serão executados na integração. O arquivo deve possuir o seguinte conteúdo:

name: main

on: [push, pull_request]

jobs:
  linter-and-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.9
      - name: Set up poetry
        uses: abatilo/actions-poetry@v2.1.0
        with:
          poetry-version: 1.1.5

      - name: Configure poetry
        shell: bash
        run: python -m poetry config virtualenvs.in-project true

      - name: Set up cache
        uses: actions/cache@v2
        id: cache
        with:
          path: .venv
          key: venv-${{ hashFiles('**/poetry.lock') }}

      - name: Ensure cache is healthy
        if: steps.cache.outputs.cache-hit == 'true'
        shell: bash
        run: timeout 10s python -m poetry run pip --version || rm -rf .venv

      - name: Install dependencies
        shell: bash
        run: python -m poetry install

      - name: Run isort
        shell: bash
        run: python -m poetry run python -m isort --check .

      - name: Run black
        shell: bash
        run: python -m poetry run python -m black --check .

      - name: Run flake8
        shell: bash
        run: python -m poetry run python -m flake8 . --exclude=.venv

      - name: Run tests
        shell: bash
        run: python -m poetry run python -m pytest .

Através do arquivo de configuração, nós definimos que alguns passos serão executados toda vez que houver um push ou a abertura de um pull request no repositório. Os passos executados serão os seguintes:

1 - Instalar todas as dependências necessárias.

2 - Executar o isort.

3 - Executar o black.

4 - Executar o flake8.

4 - Executar os testes.

🎉 Pronto, a partir de agora, o Github Actions irá rodar todos as validações e testes do seu projeto de forma automatizada e indicará se a construção do mesmo está com problemas.

💾 Salvando a versão atual do código

Primeiro passo é checar o que foi feito até agora:

$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
      pyproject.toml
      poetry.lock

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .github/

nothing added to commit but untracked files present (use "git add" to track)

Vemos uma pasta não rastreada, precisamos avisar ao controle de versão que monitore a pasta e seu conteúdo.

git add .github/

Vamos adicionar também as novas dependências instaladas.

git add pyproject.toml poetry.lock

Warning

Adicione também os arquivos que possivelmente foram modificados por nossas ferramentas de qualidade.

💾 Agora vamos marcar esta versão como consolidada.

git commit -m "Adiciona integração contínua"

🐱 Por fim, envie ao github a versão atualizada do projeto.

git push

✅ Pronto, agora o seu projeto está integrado com o Github Actions. 🎉

Cumprimos mais um requisito:

  • O sistema deve estar preparado para receber novas funcionalidades, garantindo qualidade a cada entrega;

Confira na aba actions do seu repositório.

Github actions em ação

🐂

Uma api robusta possui evolução contínua garantindo qualidade a cada versão.