Ctrl K
ComunidadGuías…

CONTRIBUTING.pt-BR.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Contributing to Argus

Obrigado por contribuir. Este repositório é a biblioteca pública de observabilidade Argus.

[English](CONTRIBUTING.md)

## Antes de abrir PR

1. Abra uma issue pelo template (bug, feature, docs ou task). Issues em branco estão desligadas. Vulnerabilidade: [SECURITY.md](SECURITY.md), não issue pública.
2. Fork + branch a partir de `main`.
3. Mantenha o diff focado — evite refactors não relacionados.
4. Não inclua secrets, tokens ou referências a infra privada (hosts, stacks internas, domínios de produção).

## Desenvolvimento

```bash
cp .env.example .env
docker compose up -d --build   # stack completa
go vet ./...
go test ./...                  # backend (Go 1.27+)
cd web && npm ci && npm run lint && npm test -- --run && npm run build   # painel (Node 24 LTS)
bash .github/scripts/check-no-vps-leak.sh   # opcional, local
```

## CI e branch protection

O workflow [`.github/workflows/ci.yml`](.github/workflows/ci.yml) roda em todo PR e push para `main`. Os jobs rodam em paralelo; um PR novo cancela a execução anterior do mesmo PR.

| Job | O que valida |
|---|---|
| `changes` | Quais componentes mudaram no diff ([`ci-changes.sh`](.github/scripts/ci-changes.sh)) |
| `anti-leak` | Padrões de infra privada no diff |
| `gitleaks` | Secrets commitados: intervalo do PR, ou histórico completo no agendamento semanal |
| `vuln-go` | `govulncheck ./...` (só CVE Go alcançável) |
| `vuln-web` | `npm audit --omit=dev --audit-level=high` em `web/` |
| `go` | `go vet`, `go test`, `go build ./cmd/...` — só se hub ou agent mudou |
| `web` | `npm ci`, `npm run lint`, `npm test -- --run`, `npm run build` — só se web mudou |
| `docker (hub/agent/web)` | Build do Dockerfile do componente que mudou (`load: true`), Trivy `CRITICAL,HIGH` (ignora unfixed), SARIF em Security |
| `smoke` | Compose com essas imagens e um sidecar de log JSON; checklist pós-deploy |
| `test` | Agregador: passa se nenhum job falhou (jobs pulados contam como ok) |

Componentes por path:

| Componente | Paths |
|---|---|
| hub | `cmd/hub/`, `internal/` (exceto `internal/agent/`), `go.mod`, `go.sum`, `Dockerfile.hub` |
| agent | `cmd/agent/`, `internal/agent/`, `internal/model/`, `go.mod`, `go.sum`, `Dockerfile.agent` |
| web | `web/` |

Mudança em `ci.yml`, `ci-changes.sh` ou nos arquivos de smoke, tag, `workflow_dispatch`, schedule ou branch nova sem base roda tudo.

O mesmo workflow também roda **semanalmente** (segunda) para CVE sem mudança de código falhar no Actions. O [CodeQL](.github/workflows/codeql.yml) (`go` e `javascript-typescript`) roda em todo PR e no agendamento semanal; alertas vão para **Security → Code scanning**.

O workflow Pages [`.github/workflows/pages.yml`](.github/workflows/pages.yml) roda o check **build site** em todo PR (`mkdocs build --strict`). Push em `main` só faz deploy quando paths de docs mudam.

**Branch protection em `main`:** exigir pull request, os checks **test** e **build site**, branch atualizada, e bloquear force-push. Sem essas regras, merges podem ignorar o CI.

**PRs empilhados:** se `main` andou, ou o PR foi aberto contra uma feature, redirecione a base para `main` e faça rebase em `main` antes do merge. Não faça merge de PR cuja base é outra feature.

O Dependabot ([`.github/dependabot.yml`](.github/dependabot.yml)) abre PRs agrupados semanais para GitHub Actions, módulos Go, npm (`web/`) e a imagem web. O CI roda nesses PRs como nos demais.

### Alertas de dependência e imagem

Quando `vuln-go`, `vuln-web` ou Trivy falha:

1. Atualize para uma versão com patch (`go get`, `npm update` ou imagem base mais nova) e rode o CI de novo.
2. Se não houver patch, abra uma issue com o CVE, por que o risco é aceito e quando revisitar. Não ignore em silêncio sem issue.
3. No npm, use `overrides` só num PR que cite essa issue. O `govulncheck` já ignora achados inalcançáveis; não desligue o job para esconder um alcançável.

## Release (maintainers)

### Escolher a versão

Siga [semver](https://semver.org/). Enquanto a versão for `0.x`, mudanças incompatíveis sobem o **minor**.

| Mudança | Bump | Exemplo |
|---|---|---|
| Correção sem alterar contrato | patch | `0.1.0` → `0.1.1` |
| Funcionalidade nova, rota ou env opcional | minor | `0.1.1` → `0.2.0` |
| Rota removida/renomeada, payload incompatível, env obrigatória nova, schema de banco incompatível | major (minor em `0.x`) | `1.4.2` → `2.0.0` |

Mudanças incompatíveis entram no CHANGELOG sob `### Breaking`, com o passo de migração para quem atualiza.

### Publicar

1. Atualize `CHANGELOG.md` (seção `[Unreleased]` → `[X.Y.Z] - data`) e o link da versão no rodapé
2. Commit e push em `main`
3. Tag semver e push:

```bash
git tag v0.1.1
git push origin v0.1.1
```

O workflow [`.github/workflows/release.yml`](.github/workflows/release.yml) roda em etapas:

1. `verify tag` — tag semver, commit presente em `main` e seção `[X.Y.Z]` no CHANGELOG. Falha aqui não publica nada.
2. `ci` — o mesmo CI de PR, reutilizado (incluindo smoke).
3. `image (hub/agent/web)` — Trivy numa imagem amd64 (`CRITICAL,HIGH`, ignora unfixed); depois build multi-arch (`linux/amd64`, `linux/arm64`) e push em paralelo para GHCR e Docker Hub, com SBOM e provenance. CVE crítica/alta corrigível bloqueia o push. Tags `X.Y.Z`, `X.Y`, `X` (a partir de `1.0`), `vX.Y.Z` e `latest`.
4. `docker hub description` — sincroniza README e descrição curta de cada repositório a partir de `.github/dockerhub/`.
5. `github release` — notas extraídas do CHANGELOG.

Tags com sufixo (`v0.2.0-rc.1`) viram pre-release e não movem `latest`.

O Docker Hub usa os secrets `DOCKERHUB_USERNAME` e `DOCKERHUB_TOKEN` (token com permissão Read, Write, Delete) e a variável de repositório `DOCKERHUB_NAMESPACE`. Sem a variável (por exemplo, em forks), o release publica só no GHCR.

Smoke test pós-release:

```bash
docker compose -f examples/compose-minimal/docker-compose.published.yml pull
docker compose -f examples/compose-minimal/docker-compose.published.yml up -d
curl -s http://localhost:8080/health
```

### Checklist

- [ ] CI verde em `main` no commit da tag
- [ ] Seção `[X.Y.Z]` no CHANGELOG com data e itens de `[Unreleased]` movidos
- [ ] `### Breaking` preenchido quando houver mudança incompatível
- [ ] Novas variáveis em `.env.example` e `docs/api/configuration.md`
- [ ] Workflow Release concluído e as três imagens com a tag `X.Y.Z` no GHCR e no Docker Hub
- [ ] Smoke test acima com `ARGUS_VERSION=X.Y.Z`

Atualizar uma instância existente: [docs/deploy.md](docs/deploy.md).

## Site de documentação

O site em [harryraddatz.github.io/argus-observability](https://harryraddatz.github.io/argus-observability/) é gerado pelo workflow [`.github/workflows/pages.yml`](.github/workflows/pages.yml) com MkDocs a partir de `docs/` (início em `docs/index.md`), `CHANGELOG.md` e `CONTRIBUTING.md`. Inglês é o idioma padrão; português usa o sufixo `*.pt.md`.

- PR que toca esses arquivos roda `mkdocs build --strict`: link ou página quebrada falha o check.
- Merge em `main` e cada release concluída publicam o site.
- Página nova em `docs/` precisa entrar no `nav` do `mkdocs.yml`.

Preview local:

```bash
pip install -r .github/pages/requirements.txt
mkdocs serve
```

## Commits

Use mensagens convencionais curtas **em inglês** (`feat:`, `fix:`, `docs:`). O mesmo vale para título e corpo de PR e para entradas novas do CHANGELOG. Referencie issues no corpo quando aplicável (`Closes #123`). Docs canônicos e identificadores de API são em inglês; os arquivos em português são só tradução.

## Pull requests

O GitHub preenche [`.github/pull_request_template.md`](.github/pull_request_template.md) (Why, What changes, How to validate, checklist). Vincule a issue (`Closes #123`). CI deve passar. Se alterar rotas API, contratos ou UI, atualize `docs/api/` e `docs/map.md`.

## Código

- Go: siga o estilo existente no pacote tocado.
- Web: React + shadcn/ui em `web/` — componentes reutilizáveis em `web/src/components/`.
- Testes: adicione ou ajuste `_test.go` para lógica de domínio alterada.

## Conduta

Participantes seguem o [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).