gitstafette
Git Webhook Relay demo app
Environment Variables
Open Telemetry
- OTEL_ENABLED: Enable Open Telemetry, default is
false
- OTEL_HOSTNAME: Hostname of the Open Telemetry Collector, default is
localhost
- OTEL_PROTOCOL: Protocol of the Open Telemetry Collector, default is
grpc
- OTEL_PORT: Port of the Open Telemetry Collector, default is
4317
- OTEL_SERVICE_NAME: Service Name of the component, default is
Gitstafette
- OTEL_TRACE_SAMPLING_RATE: Sampling Rate of the Traces, default is
1
TODO
- Should we ignore
X-GitHub-Event: create
?
- set Kubernetes security
- CI/CD In Kubernetes
- Build with Tekton / CloudNative BuildPacks
- generate SBOM/SPDX
- deploy via Crossplane
- Add Sentry support for client
- Expose State with GraphQL
- with authentication
- Gitstafette Explorer?
- track relay status per client
- alternative setup with CIVO cloud
- CI/CD In Kubernetes
- Scan with Snyk?
- Testcontainers?
- combine steps with Cartographer?
- Kubernetes Controller + CR for generating clients
- Clients in multiple languages?
- GRPC Optimizations
- Multiplexing
- Multiple Servers with a LB (Client, separate server?)
- Compression
- Deadlines + Cancellation + Timeouts
- Metadata (Authentication, tracing, ...)
- Tracing via Interceptors?
- Business Metrics via Interceptors
- Do OAUTH 2 via Interceptors/per RPC
- JWT or Oauth2 via a server (Keycloak, Vault?)
- Gateway for the Webhook listening
HMAC Support
Testing Kubernetes
HTTP
kubectl port-forward -n gitstafette svc/gitstafette-config 7777:1323
http :7777
GRPC
kubectl port-forward -n gitstafette svc/gitstafette-config 7777:50051
grpc-health-probe -addr=localhost:7777
Resources
GRPC
Test GRPC
- running server without TLS
grpcurl \
-plaintext \
-proto api/v1/gitstafette.proto \
-d '{"client_id": "me", "repository_id": "537845873", "last_received_event_id": 1}' \
localhost:50051 \
gitstafette.v1.Gitstafette.FetchWebhookEvents
grpcurl \ ─╯
-proto api/v1/gitstafette.proto \
-d '{"client_id": "me", "repository_id": "537845873", "last_received_event_id": 1}' \
localhost:50051 \
gitstafette.v1.Gitstafette.FetchWebhookEvents
grpcurl \
-proto api/v1/gitstafette.proto \
-d '{"client_id": "me", "repository_id": "537845873", "last_received_event_id": 1}' \
-cacert /mnt/d/Projects/homelab-rpi/certs/ca.pem \
-cert /mnt/d/Projects/homelab-rpi/certs/gitstafette/client-local.pem \
-key /mnt/d/Projects/homelab-rpi/certs/gitstafette/client-local-key.pem \
localhost:50051 \
gitstafette.v1.Gitstafette.FetchWebhookEvents
GRPC HealthCheck
Testing Webhooks Locally
http POST http://localhost:1323/v1/github/ \
X-Github-Delivery:d4049330-377e-11ed-9c2e-1ae286aab35f \
X-Github-Hook-Installation-Target-Id:537845873 \
X-Github-Hook-Installation-Target-Type:repository \
X-GitHub-Event:push \
Test=True
http POST http://localhost:1323/v1/github/ \
X-Github-Delivery:d4049330-377e-11ed-9c2e-1ae286aab35f \
X-Github-Hook-Installation-Target-Id:478599060 \
X-Github-Hook-Installation-Target-Type:repository \
X-GitHub-Event:push \
Test=True
GCR
http POST https://gitstafette-server-http-qad46fd4qq-ez.a.run.app/v1/github/ \
X-Github-Delivery:d4049330-377e-11ed-9c2e-1ae286aab35f \
X-Github-Hook-Installation-Target-Id:537845873 \
X-Github-Hook-Installation-Target-Type:repository \
X-GitHub-Event:push \
Test=True
Invalid HMAC
http POST http://localhost:1323/v1/github/ \
X-Github-Delivery:d4049330-377e-11ed-9c2e-1ae286aab35f \
X-Github-Hook-Installation-Target-Id:537845873 \
X-Github-Hook-Installation-Target-Type:repository \
X-GitHub-Event:push \
x-hub-signature-256:sha256=b101fdde955cb8809872eaa41d56838c9fbaa7aace134743cfd1fea7b87dc74e \
Test=True
Google Cloud Run
Envoy Setup
We can only use one port with Cloud Run.
But, we can use an Envoy proxy to route between the http and grpc servers.
Netshoot
kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot
Carvel Package
Carvel Repository
apiVersion: packaging.carvel.dev/v1alpha1
kind: PackageRepository
metadata:
annotations:
kctrl.carvel.dev/repository-version: 0.0.0-08ddea6
creationTimestamp: "2022-12-11T19:31:21Z"
name: carvel.kearos.net
spec:
fetch:
imgpkgBundle:
image: index.docker.io/caladreas/carvel-repo@sha256:328ce1a61054c6fb1aa8f291b3d32ca1b92407ad159cb1e266556d931d1cc771
Server Package
apiVersion: packaging.carvel.dev/v1alpha1
kind: PackageInstall
metadata:
name: gitstafette-config
namespace: gitstafette
spec:
serviceAccountName: default
packageRef:
refName: config.gitstafette.kearos.net
versionSelection:
constraints: 0.0.0-08ddea6
Docker Compose
Test Connection Via Envoy HTTPS
http POST https://localhost/v1/github/ \
Host:events.gitstafette.joostvdg.net \
X-Github-Delivery:d4049330-377e-11ed-9c2e-1ae286aab35f \
X-Github-Hook-Installation-Target-Id:537845873 \
X-Github-Hook-Installation-Target-Type:repository \
X-GitHub-Event:push \
Test=True --verify=false
GRPC Debugging
export GRPC_TRACE=all
export GRPC_VERBOSITY=INFO
export GRPC_GO_LOG_VERBOSITY_LEVEL=1
export GRPC_GO_LOG_SEVERITY_LEVEL=info
Running On AWS
Testing
OTEL Tracing
GUAR
- single span containing both Server and Client
- client tag
internal.span.format proto
net.peer.name localhost
net.peer.port 50051
otel_util.library.name go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc
otel_util.library.version semver:0.41.1
rpc.grpc.status_code 0
rpc.method searchOrders
rpc.service ecommerce.OrderManagement
rpc.system grpc
span.kind client
internal.span.format proto
net.sock.peer.addr 127.0.0.1
net.sock.peer.port 38842
otel_util.library.name go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc
otel_util.library.version semver:0.41.1
rpc.grpc.status_code 0
rpc.method searchOrders
rpc.service ecommerce.OrderManagement
rpc.system grpc
span.kind server
Gitstafette
internal.span.format proto
otel_util.library.name Gitstafette-Client
span.kind internal
internal.span.format proto
otel_util.library.name Server
span.kind internal
GRPC & Otel
Grafana Agent
docker run \
-e AGENT_MODE=flow \
-v /home/joostvdg/projects/gitstafette/config.river:/etc/agent/config.river \
-p 12345:12345 \
grafana/agent:latest \
run --server.http.listen-addr=0.0.0.0:12345 /etc/agent/config.river
"transport: Error while dialing: dial tcp: address http://localhost:12345: too many colons in address"
export OTEL_SERVICE_NAME=GSF-Server-1; export OTEL_PORT=12345; go \
run cmd/server/main.go --repositories 537845873 \
--port 1323 --grpcPort 50051 --grpcHealthPort 50051
export OTEL_SERVICE_NAME=GSF-Client-1; export OTEL_PORT=12345; go \
run cmd/client/main.go --repo 537845873 --server "localhost" \
--port 50051 --insecure=true \
--streamWindow 15
Otel Collector
export OTEL_SERVICE_NAME=GSF-Server-1; export OTEL_PORT=4317; export OTEL_ENABLED=true; export OTEL_TRACE_SAMPLING_RATE="0.2"; go \
run cmd/server/main.go --repositories 537845873 \
--port 1323 --grpcPort 50051 --grpcHealthPort 50051
export OTEL_SERVICE_NAME=GSF-Client-1; export OTEL_PORT=4317; export OTEL_ENABLED=true; export OTEL_TRACE_SAMPLING_RATE="0.2"; go \
run cmd/client/main.go --repo 537845873 --server "localhost" \
--port 50051 --insecure=true \
--streamWindow 15
Handling Contexts