Getting started¶
Requirements¶
The recommended way to run this project is the pinned Docker image, which provides every tool at a known version:
- Docker
To run it directly on your machine instead:
- Delve (the Docker image pins v1.27.2)
- Make
- Helm (compiled with debug symbols, see below)
- Git
- Go (the Docker image pins the Go toolchain version)
The debugger sets breakpoints in the Go standard library's
text/template/exec.go. Those line numbers depend on the Go toolchain that
compiled helm. Rather than hard-coding them, the debugger resolves them at
runtime from GOROOT (see internal/breakpoints/resolve.go).
When running the Docker image, the Go toolchain that built helm and the Go
toolchain inside the image are the same, so this is automatic.
Compiling Helm¶
Helm often discards their debug symbols, which the debugger needs in order to
hit breakpoints within Delve. That is why there are options for specifying a
custom helm binary path (--helm-path).
To build against a helm clone with debug symbols:
make clone_helm
make compile_helm
make
The local flow must be compiled with the same Go toolchain that built helm, or
you can point at the right source tree with -goroot. The Makefile includes
examples on how to work with the arguments.
Determinism with Docker¶
make docker-build builds an image from Dockerfile whose toolchain is pinned
in toolchain.env —
the same file CI and the release workflow read, so builds and release metadata
cannot drift:
| Component | Default | Build arg |
|---|---|---|
| Go toolchain | 1.26.7 |
GO_VERSION |
| Helm | v4.3.0 (built with debug symbols) |
HELM_VERSION |
| Delve | v1.27.2 |
DELVE_VERSION |
Override them at build time, for example:
make docker-build GO_VERSION=1.26.7 HELM_VERSION=v4.3.0 DELVE_VERSION=v1.27.2
Running with Docker¶
Prebuilt images are published to GitHub Container Registry as
ghcr.io/jessesimpson36/helm-debugger (primary) and mirrored to Docker Hub as
jessesimpson/helm-debugger. Each release publishes the version tags
(vX.Y.Z, X.Y.Z, X.Y, X, latest) plus an immutable toolchain tag
describing exactly what is inside (for example
go1.26.7-helm4.3.0-delve1.27.2); pin a version tag or the digest if you need
strict reproducibility. The image bundles a debug-enabled helm and the pinned
toolchain, so there is nothing else to install:
# Use the published image. Docker pulls it on first run.
docker run --rm --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
-v "$PWD:/workspace" -w /workspace \
ghcr.io/jessesimpson36/helm-debugger:latest --mode model --helm-path helm --chart test \
--values image.tag --extra-command-args '--show-only templates/deployment.yaml'
Or build and use it locally:
make docker-build
# Run the bundled model-mode smoke test against the test chart.
make docker-test
# Run the CLI interactively.
make docker-run
# Start the MCP server over stdio.
make docker-mcp
To publish a build, push both the moving latest tag and the immutable
toolchain tag:
make docker-push
Mount your own chart repository at /workspace and pass chart paths relative to
it, e.g.:
docker run --rm --cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
-v /path/to/your/repo:/workspace -w /workspace \
ghcr.io/jessesimpson36/helm-debugger:latest --mode model --helm-path helm --chart mychart \
--values image.tag --extra-command-args '--show-only templates/deployment.yaml'
Delve needs ptrace, which is why the examples add --cap-add=SYS_PTRACE and
disable the default seccomp profile.
Running locally¶
To build the debugger against a helm clone with debug symbols:
make clone_helm
make compile_helm
make
The Makefile targets test_values_query, test_helpers_query,
test_template_query, test_rendered_query, and test_all_queries show the
arguments in action. See the CLI reference for what each flag does.
Apple Silicon
The linux/arm64 image runs natively on M-series Macs. This matters: the
debugger drives Delve, which uses ptrace, and ptrace does not work under
amd64-on-arm64 emulation (QEMU does not implement it, and Rosetta fails on
register reads). Docker Desktop picks the arm64 image automatically, so no
config change is needed on an Apple Silicon Mac.