Aplicação de exemplo dos cursos de CI/CD da 4Linux: um pequeno catálogo de cursos escrito em Python 3 e Flask, com banco de dados MariaDB.
Ela existe para ser levada por um pipeline, e por isso possui:
- Testes unitários (pytest)
- Testes funcionais (Selenium)
- Imagem de container
- Endpoints de saúde para o Kubernetes
| Rota | Descrição |
|---|---|
/ |
Login |
/register |
Cadastro de usuário |
/courses |
Lista de cursos (exige login) |
/logout |
Encerra a sessão |
/health |
A aplicação está no ar. Não consulta o banco |
/ready |
A aplicação consegue atender, ou seja, o banco responde |
Toda a configuração é feita por variáveis de ambiente:
| Variável | Padrão | Descrição |
|---|---|---|
DB_HOST |
mariadb |
Endereço do banco de dados |
DB_PORT |
3306 |
Porta do banco de dados |
DB_USER |
root |
Usuário do banco de dados |
DB_PASSWORD |
qwe123qwe |
Senha do banco de dados |
DB_NAME |
simplePythonFlask |
Nome do banco de dados |
DATABASE_URL |
URL completa do SQLAlchemy. Quando definida, substitui as variáveis DB_* |
|
SECRET_KEY |
valor de desenvolvimento | Chave de assinatura da sessão |
APP_VERSION |
dev |
Versão exibida no rodapé e em /health |
É necessário somente Docker com o plugin Compose.
docker compose up -d --buildSão criados três containers: o banco mariadb, o web_initiate_db, que cria o banco, as tabelas e a carga inicial de cursos e em seguida termina, e o web com a aplicação.
docker compose ps
curl localhost:5000/health
curl localhost:5000/readyO /health deve responder {"status":"ok","version":"compose"} e o /ready {"database":"up","status":"ok"}.
Abra http://localhost:5000, clique em here para se registrar (usuário com no mínimo 6 caracteres) e em seguida faça o login. A lista de cursos deve ser apresentada.
docker build --target test -t course_catalog:test .
docker run --rm course_catalog:testPara obter os relatórios (junit.xml e coverage.xml) fora do container:
docker run --name unit course_catalog:test
docker cp unit:/courseCatalog/reports .
docker rm unitCom a aplicação no ar (passo 1):
docker compose --profile test up -d selenium
docker compose --profile test run --rm functionalO navegador controlado pelo Selenium pode ser acompanhado em http://localhost:7900 (senha secret).
Para testar uma aplicação em outro endereço, por exemplo um ambiente de homologação:
docker run --rm \
-e APP_URL=http://<ENDERECO_DA_APLICACAO> \
-e SELENIUM_URL=http://<ENDERECO_DO_SELENIUM>:4444/wd/hub \
course_catalog:test python3 tests/functional/test_functional.pydocker compose --profile test down # mantém os dados do banco
docker compose --profile test down -v # remove também os dadosO Dockerfile possui dois alvos:
| Alvo | Conteúdo | Uso |
|---|---|---|
runtime (padrão) |
Aplicação e dependências de execução, rodando com gunicorn e usuário sem privilégios | Imagem enviada ao registry |
test |
O mesmo código, mais pytest, Selenium e os testes | Etapas de teste do pipeline |
docker build -t course_catalog:0.1 --build-arg APP_VERSION=0.1 ..
├── app.py # ponto de entrada (gunicorn app:app)
├── create_db.py # cria banco, tabelas e carga inicial
├── project/ # aplicação Flask
│ ├── courses/ # lista de cursos
│ ├── health/ # /health e /ready
│ ├── users/ # login e cadastro
│ ├── static/ templates/
│ ├── _config.py # configuração por variáveis de ambiente
│ └── models.py
├── tests/
│ ├── unit/
│ └── functional/
├── manifest/ # manifests Kubernetes da versão regular do curso
├── Dockerfile
└── docker-compose.yml
Existem dois conjuntos de manifests Kubernetes, um para cada versão do curso:
| Versão do curso | Manifests |
|---|---|
| Regular (Jenkins) | Pasta manifest/ deste repositório |
| Argo CD (GitOps) | Repositório course-catalog-deploy, com Kustomize |
A pasta manifest/ é mantida como está para o curso regular. Novas alterações de deploy devem ser feitas no repositório course-catalog-deploy.
O código mantém, de propósito, alguns problemas de qualidade para serem encontrados pelas ferramentas de análise durante o curso. Eles estão listados em docs/problemas-intencionais.md. Não os corrija sem alinhar com o material do curso.
