README.md
<div>
<h1 align="center">
GCES 2020.02 - Trabalho Individual
</h1>
<p align="center">
<a href="https://codeclimate.com/github/WelisonR/Trabalho-Individual-2020-2/maintainability"><img src="https://api.codeclimate.com/v1/badges/87274c02de2f5728ed7b/maintainability" /></a>
<a href="https://codeclimate.com/github/WelisonR/Trabalho-Individual-2020-2/test_coverage"><img src="https://api.codeclimate.com/v1/badges/87274c02de2f5728ed7b/test_coverage" /></a>
<a href="https://codecov.io/gh/WelisonR/Trabalho-Individual-2020-2"><img src="https://codecov.io/gh/WelisonR/Trabalho-Individual-2020-2/branch/master/graph/badge.svg?token=A5JJKQIV5F"/></a>
<a href="https://github.com/WelisonR/Trabalho-Individual-2020-2" target="_blank" alt="Project Pull Requests"><img src="https://img.shields.io/github/issues-pr/WelisonR/Trabalho-Individual-2020-2?color=yellow&label=Pull%20Requests" />
<br/>
<a href="https://github.com/WelisonR/Trabalho-Individual-2020-2/actions/workflows/backend-ci.yml" target="_blank" alt="Back-end CI"><img src="https://github.com/WelisonR/Trabalho-Individual-2020-2/actions/workflows/backend-ci.yml/badge.svg" />
<a href="https://github.com/WelisonR/Trabalho-Individual-2020-2/actions/workflows/backend-cd.yml" target="_blank" alt="Back-end CD"><img src="https://github.com/WelisonR/Trabalho-Individual-2020-2/actions/workflows/backend-cd.yml/badge.svg" />
<a href="https://github.com/WelisonR/Trabalho-Individual-2020-2/actions/workflows/frontend-ci.yml" target="_blank" alt="Front-end CI"><img src="https://github.com/WelisonR/Trabalho-Individual-2020-2/actions/workflows/frontend-ci.yml/badge.svg" />
<a href="https://github.com/WelisonR/Trabalho-Individual-2020-2/actions/workflows/frontend-cd.yml" target="_blank" alt="Front-end CD"><img src="https://github.com/WelisonR/Trabalho-Individual-2020-2/actions/workflows/frontend-cd.yml/badge.svg" />
</p>
</div>
## <p align="left"><a href="https://agitated-goldwasser-21e397.netlify.app/">Utilize a aplicação em produção</a></p>
## Rode a Aplicação com Docker-compose
### Dependências
Inicialmente, instale localmente as seguintes dependências:
1. Instale o [Docker](https://docs.docker.com/install/linux/docker-ce/ubuntu/);
2. Instale o [Docker Compose](https://docs.docker.com/compose/install/).
### Arquivos de Configuração
1. Crie um arquivo `.env` na raiz do projeto;
2. Copie para o arquivo `.env` as configurações definidas no arquivo `.env-reference`.
### Inicialização do Projeto
1. Na pasta principal do projeto, construa e inicialize a aplicação com o comando:
```bash
sudo docker-compose up --build
```
2. Após inicializada a aplicação, os recursos do sistema estarão disponíveis nos links abaixo:
- Front-end: `http://localhost:8080/`;
- Back-end: `http://localhost:8000/task` (com postgres rodando na porta 5432).
**Observação**: se necessário remover o que foi criado com o _docker-compose_, utilize o comando `sudo docker-compose down -v` na raiz do projeto.
## Containerização
Realizou-se o provisonamento do ambiente com base em três serviços, orquetrados e definidos pelo arquivo [docker-compose](https://github.com/WelisonR/Trabalho-Individual-2020-2/blob/master/docker-compose.yml):
- Banco de dados: serviço do banco de dados postgreSQL, com mapeamento de volume da base de dados, definidos no arquivo [docker-compose](https://github.com/WelisonR/Trabalho-Individual-2020-2/blob/master/docker-compose.yml);
- Back-end: serviço que utiliza o _framework_ _django_ e funciona como `api` da aplicação. Definiu-se um arquivo [Dockerfile](https://github.com/WelisonR/Trabalho-Individual-2020-2/blob/master/api/Dockerfile) de configuração de ambiente, além de um [ponto de entrada do back-end](https://github.com/WelisonR/Trabalho-Individual-2020-2/blob/master/api/docker-entrypoint.sh);
- Front-end: serviço que utiliza o _framework_ _quasar_ e funciona como interface da aplicação. Definiu-se um arquivo [Dockerfile](https://github.com/WelisonR/Trabalho-Individual-2020-2/blob/master/client/Dockerfile) de configuração de ambiente.
![Containerização](assets/docker-environment.png)
## Integração Contínua
Utiliza-se diversos serviços para realizar a integração contínua do projeto. Nesse sentido, pode-se destacar os serviços abaixo.
### GitHub Actions
**Acesse as definições dos GitHub Actions no link**: [GitHub Actions](https://github.com/WelisonR/Trabalho-Individual-2020-2/tree/master/.github/workflows).
Utilizou-se o GitHub Actions para executar todas as etapas de integração contínua do projeto. Foram definidas duas ações de integração contínua:
- [Integração contínua do Front-end](https://github.com/WelisonR/Trabalho-Individual-2020-2/blob/master/.github/workflows/frontend-ci.yml):
- Constrói a imagem do ambiente;
- Verifica a folha de estilo com a ferramenta `eslint` com base nas definições dos [arquivos de definição do eslint](https://github.com/WelisonR/Trabalho-Individual-2020-2/tree/master/client);
- Roda os testes e gera relatórios com a ferramenta `jest`;
- Publica os relatórios de teste para o serviço `codecov`.
- [Integração contínua do Back-end](https://github.com/WelisonR/Trabalho-Individual-2020-2/blob/master/.github/workflows/backend-ci.yml):
- Constrói a imagem do ambiente;
- Verifica a folha de estilo com a ferramenta `flake8` com base nas definições do arquivo [setup.cfg](https://github.com/WelisonR/Trabalho-Individual-2020-2/blob/master/api/setup.cfg);
- Roda e gera relatórios dos testes com a ferramenta `coverage`;
- Publica os relatórios de teste para o serviço `code climate`.
Caso alguma etapa não tenha sido bem-sucedida, o pipeline é finalizado com erro.
[![GitHub Actions](assets/github-actions.png)](https://github.com/WelisonR/Trabalho-Individual-2020-2/actions)
### Code Climate
O serviço Code Climate foi configurado com a finalidade de realizar análise de qualidade de código de toda a aplicação, além de gerar análises com base nos resultados de testes do back-end.
- **Acesse os relatórios do Code Climate no link**: [Análise Code Climate](https://codeclimate.com/github/WelisonR/Trabalho-Individual-2020-2).
![Code Climate](assets/code-climate.png)
### Codecov
O serviço Codecov foi configurado para gerar análises com base nos resultados de testes do front-end.
- **Acesse os relatórios de teste do Codecov no link**: [Análise Codecov](https://app.codecov.io/gh/WelisonR/Trabalho-Individual-2020-2/).
![CodeCov](assets/codecov.png)
### Restrições de _Branchs_ e _Pull Requests_
Antes de integrar mudanças a _branch_ padrão, _master_, devem ser observados os seguintes pontos:
1. _Pull request_ deve ter ao menos uma revisão;
2. As etapas de integração contínua devem rodar adequadamente, com as seguintes observações:
1. A etapa de integração contínua do back-end do GitHub Actions deve finalizar com sucesso;
2. A etapa de integração contínua do front-end do GitHub Actions deve finalizar com sucesso;
3. Cobertura de testes do back-end deve estar superior a 90% (code climate);
4. Cobertura de testes do front-end não pode ter uma queda na porcentagem de cobertura (codecov);
5. Validação de qualidade de código do code climate apresenta resultados positivos.
Além disso, são gerados comentários automáticos do codecov e do code climate nos _pull requests_ em relação a qualidade de código e testes da aplicação.
![Pull Requests](assets/pull-requests.png)
### Deploy Contínuo
Para realizar o deploy contínuo da aplicação, utilizou-se ações do GitHub Actions.
### Front-end
Realizou-se o deploy contínuo do front-end com o uso do serviço [Netlify](https://www.netlify.com/).
**Link para acessar o ambiente de produção do front-end**: [front-end em produção](https://agitated-goldwasser-21e397.netlify.app/).
Ações do GitHub Actions:
- [Deploy contínuo do front-end](https://github.com/WelisonR/Trabalho-Individual-2020-2/blob/master/.github/workflows/frontend-cd.yml): disparado no momento em que uma nova mudança é integrada à _branch_ master. É realizada a construção e a entrega da aplicação no serviço Netlify.
### Back-end
Realizou-se o deploy contínuo do back-end com o uso do serviço [Heroku](heroku.com). O heroku realiza o provisionameto da infraestrutura tanto do back-end (django) como do banco de dados (postgreSQL).
**Link para acessar o ambiente de produção do back-end**: [back-end produção](https://glacial-harbor-86827.herokuapp.com/task/).
Ações do GitHub Actions:
- [Deploy contínuo do back-end](https://github.com/WelisonR/Trabalho-Individual-2020-2/blob/master/.github/workflows/backend-cd.yml): disparado no momento em que uma nova mudança é integrada à _branch_ master. É realizada entrega da aplicação no serviço Heroku.
## Autor
| Matrícula | Estudante |
| ---------- | --------------------------- |
| 17/0024121 | Welison Lucas Almeida Regis |