Aplicação de demonstração usada como prova de conceito (PoC) do TCC "GitOps: Automação e Gestão de Infraestrutura utilizando Repositórios Git".
Este repositório contém o código-fonte da aplicação e o pipeline de Integração Contínua (CI). Ele faz parte de uma arquitetura de dois repositórios:
| Repositório | Responsabilidade |
|---|---|
tcc-app (este) |
Código da aplicação, Dockerfile e workflow de CI que constrói/publica a imagem |
tcc-ops |
Repositório GitOps: manifestos declarativos do Kubernetes monitorados pelo ArgoCD |
A separação entre código e configuração de infraestrutura é proposital — segue o princípio GitOps de manter o repositório Git como única fonte de verdade (single source of truth).
API HTTP escrita em Python + FastAPI, servida por Uvicorn na porta 8080.
Combina endpoints de diagnóstico (úteis para observar o comportamento em Kubernetes)
com alguns endpoints que consomem APIs públicas.
Diagnóstico / observabilidade
| Método | Rota | Descrição |
|---|---|---|
GET |
/ |
Mensagem de boas-vindas + versão, instância, pod e uptime |
GET |
/version |
Versão da aplicação e ID da instância |
GET |
/whoami |
Identificação do pod/nó que respondeu |
GET |
/health/live |
Liveness probe |
GET |
/health/ready |
Readiness probe |
GET |
/config |
Variáveis de ambiente carregadas |
GET |
/environment |
Indica se está rodando localmente ou em GKE |
GET |
/feature/experimental |
Endpoint usado para evidenciar mudanças entre versões |
Consumo de APIs externas
| Método | Rota | Fonte |
|---|---|---|
GET |
/users/random |
randomuser.me |
GET |
/users/nationality/{nat} |
randomuser.me (ex.: br, us) |
GET |
/predict/age/{name} |
agify.io |
GET |
/pokemon/{name} |
pokeapi.co |
GET |
/crypto/bitcoin |
coingecko.com |
As variáveis POD_NAME, PROJECT_ID e ENV são lidas em runtime e injetadas pelo
Kubernetes em produção; localmente ficam ausentes, e por isso /environment reporta
environment: local.
- Python 3.12+
pip
# criar e ativar o ambiente virtual
python -m venv .venv
source .venv/bin/activate # Windows (PowerShell): .venv\Scripts\Activate.ps1
# instalar dependências
pip install -r requirements.txt
# subir a aplicação (--reload recarrega ao salvar arquivos)
uvicorn main:app --host 0.0.0.0 --port 8080 --reloadA API fica disponível em http://localhost:8080.
# construir a imagem
docker build -t tcc-app:local .
# executar o contêiner
docker run --rm -p 8080:8080 tcc-app:localDocumentação interativa (Swagger UI) gerada automaticamente pelo FastAPI:
http://localhost:8080/docs
Ou via curl:
curl http://localhost:8080/
curl http://localhost:8080/environment
curl http://localhost:8080/pokemon/pikachu
curl http://localhost:8080/users/nationality/brO workflow .github/workflows/deploy.yml é disparado
ao publicar uma tag v* (ou manualmente via workflow dispatch) e executa:
- Checkout do código-fonte
- Build da imagem Docker
- Autenticação no GitHub Container Registry (GHCR)
- Push da imagem
ghcr.io/<owner>/tcc-app:<tag> - Atualização automática da tag da imagem no
deployment.ymldo repositóriotcc-ops(branchdeploy/app)
A partir daí o ArgoCD detecta a mudança no repositório GitOps e reconcilia o estado do cluster — completando o fluxo CI/CD baseado em GitOps.
git tag v0.2.5
git push origin v0.2.5O campo
APP_VERSIONemmain.pydeve ser atualizado junto da tag para que a aplicação reporte a versão correta nos endpoints de diagnóstico.
| Secret | Uso |
|---|---|
GHC_PAT |
Login no GHCR para publicar a imagem |
PAT |
Token com permissão de escrita no repositório tcc-ops |