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:
- 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. - Rust (
proxy-rs):make proxy-rs-test(Workspace ohne Tauri-Bundle). Die Toolchain kommt perrustup(kein externesrust-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.