Continuous Delivery, Integration and Deployment

Softwares modernos, além de serem desenvolvidas com qualidade, precisam ter processos repetitivos automatizados.

Luís Gustavo | Dez. 19, 2022, 6 a.m. | DevOps

{post.titulo_post}}

Seguindo no desenvolvimento do projeto open-source (caso você desconheça este projeto, recomendo a leitura deste artigo, onde explico em detalhes: https://iadevlab.com/post/6), hoje serão apresentados alguns conceitos extremamente relevantes para qualquer aplicação moderna, atividades que muitas vezes são realizadas de forma manual pela equipe de desenvolvimento, mas que atualmente podem ser automatizadas. Etapas de realizar testes, verificar se o seu algoritmo está de acordo com os padrões da linguagem, no caso do Python de acordo com a PEP8 e o processo de deploy, são processos repetitivos que podem ser facilmente automatizados, e muitas vezes de forma gratuita.


Mas antes de apresentar a pipeline que está sendo utilizada por este projeto, é necessário conceituar alguns termos técnicos que são utilizados nesta etapa do desenvolvimento de software.


Continuous Delivery


Esta etapa, envolve todo o processo, desde quando um dev envia um commit para um repositório remoto, e uma pipeline realiza as etapas pré-definidas e repetitivas que sempre são executadas. Neste exemplo, se um teste falha, toda a equipe é notificada e podem juntos resolver este problema. Outra característica relevante é a de pequenas entregas, imagine uma feature que um dev precisa criar e que demore 3 dias para terminar, ele não deve esperar três dias para enviar o seu código para a pipeline, e sim enviar as suas pequenas alterações diariamente, para que eventuais problemas que surgirem sejam corrigidos de forma imediata.


Quando me refiro a pipeline, isso significa de forma mais simplificada em etapas  que precisam ser realizadas em uma determinada ordem, a fim de realizar o processo de Continuous Delivery. No caso deste projeto em específico, as etapas que são realizadas estão apresentadas nesta imagem:


Pipeline

Continuous Integration


Este conceito se refere a necessidade de o código de toda a equipe de desenvolvimento, seja ela de 1, 100 ou mais desenvolvedores, sempre estarem integrados, ou seja, juntos em uma mesma branch. Desta forma, se eventuais problemas ocorrerem, podem imediatamente ser corrigidos.


Continuous Deployment 


E para finalizar, Continuous Deployment é a capacidade de realizar o processo de deploy do seu projeto de maneira automatizada. Imagine que você realizou o processo de continuous Integration, e seu código está de acordo com as normas que foram informadas nesta etapa, agora é somente enviar o código para produção, sendo todo este processo automatizado.


Recomendo a leitura deste texto para mais informações sobre Continuous Delivery: https://continuousdelivery.com/.


Além deste vídeo: https://www.youtube.com/watch?v=j0DNdPXTBi0&ab_channel=WaldemarNeto-DevLab.


PIPELINE


Neste projeto em específico será utilizado o github actions para realizar estas etapas do processo de continuous Delivery. É uma ferramenta simples de ser configurada e que faz parte do ecossistema do github, além disso, possui um free tier excelente, que é mais do que o suficiente para este projeto.


Documentação do Github Actions: https://docs.github.com/pt/actions 


Vídeo que recomendo sobre utilizar github actions em projetos python: https://www.youtube.com/watch?v=L1f6N6NcgPw&t=5932s.


Para que o github entenda que você está utilizando o github actions, é necessário que seja criado uma estrutura de arquivos no projeto, da seguinte forma:


.github/workflows/checks.yml 


O diretório .github, deve ser adicionado na raiz do projeto, desta forma, o github compreende que se trata de um arquivo que será utilizado pelo github actions. 


Agora basta preencher o arquivo checks.yml, com a pipeline.


---

name: Checks

 

on: [push, pull_request_review]

 

jobs:

 test-lint:

   name: Test and Lint

   runs-on: ubuntu-20.04

   steps:

     - name: Checkout

       uses: actions/checkout@v2

 

     - name: Test

       env:

         SECRET_KEY: ${{ secrets.SECRET_KEY }}

         ALLOWED_HOSTS: ${{ secrets.ALLOWED_HOSTS }}

         DEBUG: ${{ secrets.DEBUG }}

         DB_NAME: ${{ secrets.DB_NAME }}

         DB_USER: ${{ secrets.DB_USER }}

         DB_PASS: ${{ secrets.DB_PASS }}

       run: docker-compose run --rm app sh -c "python manage.py wait_for_db && python manage.py test"

 

     - name: Pylint

       run: docker-compose run --rm app sh -c "pylint *"

 

     - name: Flake8

       run: docker-compose run --rm app sh -c "flake8"


Este arquivo pode ser acessado através do github do projeto: https://github.com/luisgs7/cashwallet-api/blob/main/.github/workflows/checks.yml


A única configuração a mais que deve ser realizada, é a de variáveis de ambiente, mais informações sobre esta etapa, na documentação: https://docs.github.com/pt/actions/learn-github-actions/environment-variables


As variáveis de ambiente que devem ser configuradas são: DB_NAME, DB_USER, DB_PASS, mais detalhes sobre o que cada variável referencia, basta acessar este arquivo: https://github.com/luisgs7/cashwallet-api/blob/main/.env.example.


Esta pipeline, executa o mesmo processo que foi informado na imagem no tópico sobre continuous Delivery, somente a etapa de deploy não está sendo realizada neste momento do projeto. Primeiro são executados os testes, em seguida são executados o Pylint e o Flake8 para verificar se o código está de acordo com a PEP8


Espero que este artigo tenha contribuído no seu processo de Continuous Delivery, qualquer dúvida, deixe um comentário abaixo, muito obrigado.

Deixe um comentário