4 Development
Forgeagent edited this page 2026-07-20 10:35:26 +02:00

Entwicklung, Tests, Fuzzing und CI

Voraussetzungen und Arbeitsablauf

Die Go-Version steht verbindlich in go.mod (aktuell 1.26.5). Änderungen bleiben klein und enthalten Tests für Verhalten und Sicherheitsgrenzen.

go mod download
make check
make acceptance
make test-race
make reproducible-build
make release-verify

Vor Abschluss eines Implementierungs-Issues muss im selben Branch die zugehörige Wiki-Seite aktualisiert werden. Änderungen an MCP SDK/Spec oder Tunnelprotokoll aktualisieren zusätzlich ADR und Kompatibilitätsmatrix; CLI-/Config-Änderungen aktualisieren CLI, Konfiguration und config.example.yaml.

Lokale Prüfungen

Ziel Inhalt
make fmt-check alle getrackten Go-Dateien sind gofmt-formatiert
make vet go vet ./...
make test Unit-, Integrations-, Golden- und Prozess-E2E-Tests
make acceptance fokussierter MVP-Gate für E2E, Auth, Reconnect, Limits und Konfigurationspriorität
make test-race vollständige Tests mit Go Race Detector
make vuln govulncheck in gepinnter Version v1.1.4
make build statisches gemeinsames Binary
make reproducible-build zwei Builds bytegleich; beide Modi per Help geprüft
make release Cross-Compile-Archive und SHA-256-Prüfsummen unter dist/
make release-verify vollständige Zielmatrix bauen und Archive/Prüfsummen prüfen
make container-mcp lokales MCP-Server-Image
make container-proxy lokales Private-Proxy-Image
make proxy-rs-test Cargo-Workspace-Tests unter proxy-rs/ (ohne Tauri-Bundle)
make proxy-rs-build headless Rust-Binary private-proxy-rs bauen
make desktop-dev Tauri-Debug-UI starten

Bei Änderungen an Concurrency, Sessionzustand, Connection-Takeover, Cancel oder Shutdown ist make test-race verpflichtend. Tunneländerungen benötigen Golden-Vektoren in docs/protocol/testdata/tunnel-v1.json und müssen Go- sowie Rust-Tunneltests grün halten.

Fuzzing

Begrenzte lokale Läufe:

go test ./internal/tunnel -run '^$' -fuzz '^FuzzReadFrame$' -fuzztime=30s
go test ./internal/httpexec -run '^$' -fuzz '^FuzzURLNormalization$' -fuzztime=30s
go test ./internal/httpexec -run '^$' -fuzz '^FuzzHeaderNormalization$' -fuzztime=30s
go test ./internal/httpexec -run '^$' -fuzz '^FuzzPolicyInputs$' -fuzztime=30s

Ein reproduzierbarer Fund wird als minimierter Seed im passenden testdata/fuzz/<Target> abgelegt. Secrets, echte Hostnamen und interne Adressen gehören nicht in Seeds. Ein Crash-Fix enthält zusätzlich einen deterministischen Regressionstest, wenn dies die Ursache klarer abbildet.

CI

CI

.forgejo/workflows/ci.yml läuft auf Push und Pull Request in zwei Jobs:

  1. Go: Formatprüfung, Vet, Tests, MVP-Abnahme-Gate, Race Detector, Vulnerability Scan, reproduzierbarer Build und Cross-Compile-Verifikation mit der gepinnten Go-Version aus go.mod.
  2. Rust (proxy-rs): make proxy-rs-test (Workspace ohne Tauri-Bundle). Die Toolchain kommt per rustup (kein externes rust-toolchain-Action), weil floating GitHub-Action-Tags auf dem Forgejo-Runner nicht zuverlässig auflösbar sind. Checkout bleibt SHA-gepinnt.

Lokal müssen dieselben Make-Ziele erfolgreich sein.

Der reproduzierbare Build verwendet CGO_ENABLED=0, -trimpath, deaktivierte VCS-Einbettung und eine leere Build-ID. Er baut zweimal, vergleicht mit cmp und prüft mcp-server --help sowie private-proxy --help am Ergebnis build/private-proxy-mcp.

.forgejo/workflows/release.yml läuft bei Tags nach dem Muster v*. Sie erzeugt Linux-amd64, Linux-arm64, macOS-arm64 und Windows-amd64, lädt Archive und checksums.txt in ein Forgejo-Release und veröffentlicht zwei Multi-Arch-OCI-Images. Der Runner benötigt dafür Docker/BuildKit-Zugriff; der kurzlebige GITHUB_TOKEN wird nur für das aktuelle Repository und dessen Package Registry verwendet.