Fluxo de Trabalho e Automação¶
O Data Profiler utiliza a ferramenta make para padronizar e automatizar tarefas repetitivas, garantindo consistência entre os ambientes de desenvolvimento, teste e produção.
A arquitetura do projeto exige a execução de múltiplos processos simultâneos (Servidor Go, Bundler do Vite e Servidor MkDocs). O Makefile centraliza a orquestração desses serviços.
Requisito de Ambiente
Os comandos listados abaixo foram projetados para terminais Unix-like.
Se estiver operando em ambiente Windows, é obrigatório o uso de terminais compatíveis com Bash, como o Git Bash ou WSL (Windows Subsystem for Linux). Terminais nativos (CMD ou PowerShell) não suportam a sintaxe POSIX utilizada nas chamadas de sistema (como rm, mkdir -p ou exportação de variáveis).
1. Setup Inicial¶
Antes da primeira execução, é necessário preparar o ambiente e instalar as dependências de todas as camadas (Go, Node.js e Python).
| Comando | Descrição |
|---|---|
make setup | Instala ferramentas base (rsrc), baixa dependências do Frontend (npm install), da Documentação (pip install) e executa go mod tidy. |
2. Workflow Diário (Desenvolvimento)¶
Comandos utilizados durante a fase de desenvolvimento ativo. O projeto utiliza o pacote concurrently para rodar múltiplos processos no mesmo terminal com logs coloridos e prefixados.
2.1. Execução Completa¶
O comando padrão levanta todo o ecossistema simultaneamente.
O comando dev-full inicializa três processos paralelos:
- [BACK]: Servidor Go na porta
:8080. - [FRONT]: Servidor de desenvolvimento Vite na porta
:5173. - [DOCS]: Servidor de Hot Reload do MkDocs na porta
:8000.
Otimização de Processo no Windows
Nos comandos de desenvolvimento (dev e dev-full), o Makefile executa o Vite diretamente via binário node, ignorando o npm.
Isso evita o bloqueio de sinal comum no Windows ("Deseja finalizar o arquivo em lotes?"), permitindo que o ambiente seja encerrado limpamente com um único Ctrl+C
2.2. Execução Isolada¶
Caso seja necessário trabalhar em uma camada específica, utilize os comandos direcionados:
| Comando | Função |
|---|---|
make dev | Executa Backend e Frontend simultaneamente (sem subir a documentação). |
make back | Inicia exclusivamente o compilador Go (go run). |
make front | Inicia exclusivamente o servidor Vite. |
make docs | Inicia exclusivamente o servidor MkDocs. |
3. Qualidade e Testes¶
A validação de concorrência e o fuzzing são vitais para a estabilidade do motor de processamento.
| Comando | Função | Detalhes Técnicos |
|---|---|---|
make test | Executa a suíte padrão. | Cobre todos os pacotes via go test ./.... |
make test-race | Detector de Race Conditions. | Requer compilador C (GCC/MinGW). Define CGO_ENABLED=1. |
make test-fuzz | Testes de carga na inferência. | Foca no pacote profiler, gerando inputs aleatórios por 10s. |
make fmt | Formatação e limpeza. | Executa go fmt e go mod tidy. |
4. Build e Distribuição¶
Comandos responsáveis por compilar o Single Binary, embutindo o Frontend dentro do executável Go.
Release (Cross-Compile)¶
O comando release automatiza o fluxo completo de Continuous Delivery:
- Executa o build de produção do React (
npm run build). - Gera e injeta o ícone da aplicação (
rsrc). - Realiza a compilação cruzada para Windows (amd64) e Linux (amd64).
- Aplica as flags
-s -w(remoção de tabelas de debug) para reduzir o tamanho final do binário.
Outras opções de Build¶
| Comando | Função |
|---|---|
make build-windows | Gera um .exe para Windows ocultando o terminal (-H=windowsgui). |
make build | Build simples e rápido para a plataforma atual, sem otimizações extremas. |
5. Docker e Infraestrutura¶
Ferramentas avançadas para análise de gargalos e execução containerizada.
Docker¶
make docker-build: Constrói a imagem Docker base do projeto.make docker-run: Inicializa o container da aplicação principal viadocker compose.make benchmark: Sobe um container isolado focado no teste de performance, processando o arquivolarge_dataset.csv.
Profiling (Pprof)¶
Realiza o download do perfil de alocação de memória (Heap) e inicia o servidor HTTP nativo da toolchain do Go (go tool pprof) na porta :8081. Este comando é essencial para depurar vazamentos de memória (OOM).
6. Manutenção¶
Comandos utilitários para limpeza e publicação.
| Comando | Função |
|---|---|
make docs-deploy | Publica o build estático do MkDocs no GitHub Pages. |
make docs-build | Gera os arquivos HTML/CSS estáticos na pasta /site. |
make clean | Remove binários, caches, profiles (.out) e desliga containers Docker órfãos. |
Lista dos Comandos¶
Para ver a lista completa de comandos disponíveis e o que cada um faz, você pode sempre consultar o próprio arquivo:
# ==========================================
# Configurações do Projeto
# ==========================================
BINARY_NAME=dataprofiler.exe
DOCKER_IMAGE=dataprofiler:latest
FRONTEND_DIR=frontend
CMD_DIR=cmd/api
# O primeiro comando é o padrão. Digitou 'make', roda o 'dev-full'.
all: dev-full
# .PHONY diz ao Make que esses não são arquivos reais
.PHONY: setup install-tools dev dev-full docs back front build build-all build-windows test test-race test-fuzz fmt \
frontend-install frontend-build docker-build docker-run benchmark clean profile-heap \
docs-install docs-serve docs-build release docs-clean docs-deploy check-cgo
# ==========================================
# 🚀 Workflow Diário (Daily Driver)
# ==========================================
# Roda o Backend
back:
@echo [BACK] Iniciando Backend...
go run $(CMD_DIR)/main.go
# Roda o Frontend
front:
@echo [FRONT] Iniciando Frontend...
cd $(FRONTEND_DIR) && npm run dev
# Roda tudo com logs identificados e coloridos
dev:
-FORCE_COLOR=1 npx concurrently \
--colors \
--names "BACK,FRONT" \
--prefix-colors "magenta,cyan" \
--kill-others \
--handle-input \
"go run $(CMD_DIR)/main.go" \
"cd $(FRONTEND_DIR) && node node_modules/vite/bin/vite.js"
# Roda Backend + Frontend + Documentação
dev-full:
-FORCE_COLOR=1 npx concurrently \
--colors \
--names "BACK,FRONT,DOCS" \
--prefix-colors "magenta,cyan,yellow" \
--kill-others \
--handle-input \
"go run $(CMD_DIR)/main.go" \
"cd $(FRONTEND_DIR) && node node_modules/vite/bin/vite.js" \
"python -m mkdocs serve"
# Roda o servidor local de documentação (Hot Reload)
docs:
@echo [DOCS] Iniciando servidor em http://127.0.0.1:8000
python -m mkdocs serve
# ==========================================
# 📚 Documentação (MkDocs)
# ==========================================
# Instala o MkDocs e o tema Material via Python
docs-install:
@echo [SETUP] Instalando dependencias de documentacao...
pip install -r requirements.txt
# Gera o site estático na pasta /site (para deploy)
docs-build:
@echo [BUILD] Compilando site estatico...
python -m mkdocs build
@echo [DONE] Documentacao gerada na pasta 'site/'
# Limpa a pasta de build
docs-clean:
@echo [CLEAN] Limpando arquivos antigos...
rm -rf site/
@echo [DONE] Limpeza concluida.
# Publica no GitHub Pages
docs-deploy:
@echo [DEPLOY] Publicando documentacao no GitHub Pages...
python -m mkdocs gh-deploy --force
@echo [DONE] Documentacao publicada! Acesse em: https://jgustavocn.github.io/dataprofiler/
# ==========================================
# 🏗️ Build & Distribuição
# ==========================================
# Build simples (Linux/Mac ou dev rápido)
build:
go build -o $(BINARY_NAME) ./$(CMD_DIR)
# Build Completo (Front + Back)
build-all: frontend-build build
# Build Profissional Windows (Com Ícone e Otimizado)
build-windows: frontend-install frontend-build
@echo [RSRC] Gerando icone...
rsrc -ico app.ico -o $(CMD_DIR)/rsrc.syso
@echo [BUILD] Compilando binário Windows...
go build -ldflags "-s -w -H=windowsgui" -o $(BINARY_NAME) ./$(CMD_DIR)
@echo [DONE] Build concluído: ./$(BINARY_NAME)
# ==========================================
# 🧪 Qualidade & Testes
# ==========================================
test:
go test ./...
# Detecta Race Conditions (Essencial para Go Routines)
# Adaptação Bash: Variável definida na frente do comando, sem 'set' e sem '&&'
test-race: check-cgo
CGO_ENABLED=1 go test -race ./...
# Teste de Estresse (Fuzzing)
test-fuzz:
go test ./internal/profiler -fuzz=FuzzInferType -fuzztime=10s
fmt:
go fmt ./...
go mod tidy
# ==========================================
# 🛠️ Ferramentas & Setup
# ==========================================
# Prepara a máquina
setup: install-tools frontend-install docs-install
go mod tidy
# Verifica se o GCC existe (Adaptação Bash: usa 'which' ou 'command -v')
check-cgo:
@command -v gcc >/dev/null 2>&1 || (echo [ERRO] GCC nao encontrado. Instale o MinGW/TDM-GCC para usar -race. && exit 1)
install-tools:
@echo [SETUP] Instalando ferramenta de ícone (rsrc)...
go install github.com/akavel/rsrc@latest
frontend-install:
cd $(FRONTEND_DIR) && npm install
frontend-build:
cd $(FRONTEND_DIR) && npm run build
# ==========================================
# 🐳 Docker
# ==========================================
docker-build:
docker build -t $(DOCKER_IMAGE) .
docker-run:
docker compose up app
benchmark:
@echo [BENCH] Iniciando Benchmark (Necessário arquivo large_dataset.csv)...
docker compose --profile test up benchmark
# ==========================================
# 🔍 Profiling
# ==========================================
profile-heap:
@echo [PPROF] Capturando Heap Profile...
curl -o heap.out http://localhost:6060/debug/pprof/heap
go tool pprof -http=:8081 heap.out
# ==========================================
# 📦 Release
# ==========================================
release: frontend-install frontend-build
@echo [RELEASE] Preparando release...
mkdir -p bin
@echo [RSRC] Gerando icone...
rsrc -ico app.ico -o $(CMD_DIR)/rsrc.syso
@echo [BUILD] Compilando para Windows (amd64)...
go build -ldflags="-s -w" -o bin/dataprofiler.exe ./$(CMD_DIR)
@echo [BUILD] Compilando para Linux (amd64)...
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o bin/dataprofiler-linux ./$(CMD_DIR)
@echo [DONE] Binarios criados na pasta bin/!
# ==========================================
# 🧹 Limpeza (Versão Git Bash / Linux)
# ==========================================
clean:
go clean
rm -f $(BINARY_NAME)
rm -rf bin site .cache
rm -f $(CMD_DIR)/rsrc.syso
rm -f *.out
@docker compose down --remove-orphans 2>/dev/null || echo "Docker não estava rodando."
@echo [DONE] Limpeza concluida.