Pular para conteúdo

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.

make
# ou
make dev-full

O comando dev-full inicializa três processos paralelos:

  1. [BACK]: Servidor Go na porta :8080.
  2. [FRONT]: Servidor de desenvolvimento Vite na porta :5173.
  3. [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)

make release

O comando release automatiza o fluxo completo de Continuous Delivery:

  1. Executa o build de produção do React (npm run build).
  2. Gera e injeta o ícone da aplicação (rsrc).
  3. Realiza a compilação cruzada para Windows (amd64) e Linux (amd64).
  4. 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 via docker compose.
  • make benchmark: Sobe um container isolado focado no teste de performance, processando o arquivo large_dataset.csv.

Profiling (Pprof)

make profile-heap

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:

Makefile
# ==========================================
# 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.