-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Summary
The OpenClaw Helm chart references ghcr.io/obolnetwork/openclaw:<tag> but we don't publish this image yet. Currently, local development requires manually building from the upstream OpenClaw source and importing into k3d:
docker build -t ghcr.io/obolnetwork/openclaw:v2026.2.3 /path/to/openclaw/
k3d image import ghcr.io/obolnetwork/openclaw:v2026.2.3 -c <cluster>We need a CI pipeline to build and publish the image so obol openclaw up works out of the box without manual image builds.
Proposed Approach
Model the workflow on charon-dkg-sidecar/.github/workflows/docker-publish.yml, which is our existing pattern for shipping container images.
Simplest implementation
Add a docker-publish-openclaw.yml workflow in this repo (obol-stack) that:
- Triggers on push to
main(wheninternal/openclaw/**changes) and onv*tags - Clones upstream OpenClaw at a pinned commit/tag (specified in
internal/openclaw/OPENCLAW_VERSION) - Builds the image using the upstream
Dockerfile(Node.js 22 + pnpm, already non-root hardened) - Publishes to
ghcr.io/obolnetwork/openclawwith semver tags - Scans with Trivy for vulnerabilities (same as charon-dkg-sidecar)
Renovate Integration
The version file uses Renovate's inline hint convention for automatic upstream tracking:
internal/openclaw/OPENCLAW_VERSION:
# renovate: datasource=github-releases depName=openclaw/openclaw
v2026.2.3
Automated flow:
- Upstream
openclaw/openclawcuts a new GitHub release (e.g.v2026.3.0) - Renovate detects it, opens a PR bumping
OPENCLAW_VERSIONfromv2026.2.3→v2026.3.0 - PR merge triggers the
docker-publish-openclaw.ymlworkflow (path filter matchesinternal/openclaw/**) - New image published to
ghcr.io/obolnetwork/openclaw:v2026.3.0
No custom regex manager config needed — the # renovate: comment is Renovate's standard inline datasource hint.
Key differences from charon-dkg-sidecar
| Aspect | charon-dkg-sidecar | openclaw |
|---|---|---|
| Source | Same repo | Upstream openclaw/openclaw (pinned version) |
| Runtime | Node.js (TypeScript) | Node.js (TypeScript) |
| Platforms | amd64 + arm64 | amd64 + arm64 |
| Registries | GHCR + Docker Hub | GHCR only (initially) |
| Build args | BUILDTIME, GITCOMMIT, VERSION |
OPENCLAW_DOCKER_APT_PACKAGES (optional) |
Tag strategy
tags:
type=semver,pattern={{version}} # v2026.2.3
type=semver,pattern={{major}}.{{minor}} # v2026.2
type=sha,prefix= # abc1234
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}The chart values.yaml references a specific tag (currently v2026.2.3), so users get a deterministic deployment.
Acceptance Criteria
- GitHub Actions workflow builds OpenClaw image from pinned upstream source
- Image published to
ghcr.io/obolnetwork/openclaw:<tag> - Multi-platform support (amd64 + arm64)
- Trivy security scan on main branch pushes
- Version pinning file (
OPENCLAW_VERSION) with Renovate inline hint for automatic bumps - Renovate auto-opens PRs when upstream
openclaw/openclawcuts a new release -
obol openclaw upworks without manualdocker build/k3d image import - Chart
values.yamltag matches published image tag
References
- Existing pattern: charon-dkg-sidecar/docker-publish.yml
- Upstream Dockerfile:
openclaw/openclawrepo (Node 22 + pnpm + Bun build, non-rootUSER node) - Chart values:
internal/openclaw/chart/values.yaml(image.tag: "v2026.2.3")