Skip to content

ci(docker): publish releases to Docker Hub#97122

Merged
vincentkoc merged 2 commits into
mainfrom
chore/docker-hub-release-publish-v2
Jun 28, 2026
Merged

ci(docker): publish releases to Docker Hub#97122
vincentkoc merged 2 commits into
mainfrom
chore/docker-hub-release-publish-v2

Conversation

@vincentkoc

@vincentkoc vincentkoc commented Jun 26, 2026

Copy link
Copy Markdown
Member

What Problem This Solves

OpenClaw's official Docker release workflow only published images to GHCR, while Docker Hub had no official openclaw/openclaw release image. That left users who search or deploy from Docker Hub pointed at community mirrors instead of a release surface controlled by the project.

Why This Change Was Made

This keeps GHCR as the primary registry and adds Docker Hub as an official mirror for the same stable and beta release tags, architecture-specific tags, manifests, and attestation verification path. The workflow now fails fast if DOCKERHUB_USERNAME or DOCKERHUB_TOKEN are missing, so release operators do not get a partial publish by accident.

Beta releases publish immutable versioned tags, including browser/slim/arch variants, but do not advance latest or main. Manual backfills keep the same version-only behavior.

The docs continue to recommend GHCR first, but now show openclaw/openclaw as the official Docker Hub mirror and warn against unofficial community mirrors.

User Impact

Users can pull official OpenClaw images from either:

docker pull ghcr.io/openclaw/openclaw:latest
docker pull openclaw/openclaw:latest

Beta users can also pull explicit beta tags without affecting stable aliases:

docker pull ghcr.io/openclaw/openclaw:2026.6.9-beta.1
docker pull openclaw/openclaw:2026.6.9-beta.1

Release operators keep GHCR as the primary source while publishing the Docker Hub mirror from the same workflow and verification steps.

Evidence

  • Docker Hub repository exists and is public: openclaw/openclaw.
  • GitHub release secrets are present: DOCKERHUB_USERNAME, DOCKERHUB_TOKEN.
  • node -e "const fs=require('fs'); const YAML=require('yaml'); YAML.parse(fs.readFileSync('.github/workflows/docker-release.yml','utf8')); console.log('docker-release yaml ok')"
  • git diff --check origin/main..HEAD
  • pnpm_config_verify_deps_before_run=false pnpm test:serial src/dockerfile.test.ts test/scripts/ci-workflow-guards.test.ts - 56 tests passed.
  • pnpm_config_verify_deps_before_run=false pnpm docs:check-mdx
  • pnpm_config_verify_deps_before_run=false pnpm format:docs:check
  • OPENCLAW_TESTBOX=1 pnpm_config_verify_deps_before_run=false pnpm check:changed - passed in Testbox tbx_01kw35vsyj4ef9h02v9vxzj7mv, Actions run https://github.com/openclaw/openclaw/actions/runs/28271904813.

@vincentkoc vincentkoc self-assigned this Jun 26, 2026
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation docker Docker and sandbox tooling size: M maintainer Maintainer-authored PR labels Jun 26, 2026
@clawsweeper

clawsweeper Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Codex review: found issues before merge. Reviewed June 28, 2026, 2:10 PM ET / 18:10 UTC.

Summary
The PR adds Docker Hub publishing to the Docker release workflow, updates Docker install docs to advertise the mirror, and adds Docker workflow string guards.

PR surface: Tests +33, Docs +13, Config +139. Total +185 across 4 files.

Reproducibility: yes. for the PR finding: the live Docker Hub tag API returns count: 0, while the PR docs advertise openclaw/openclaw:latest. This is an after-patch documentation/runtime mismatch, not a current-main bug.

Review metrics: 3 noteworthy metrics.

  • Required release secrets: 2 added. DOCKERHUB_USERNAME and DOCKERHUB_TOKEN now gate Docker release jobs before GHCR images publish.
  • Live Docker Hub tags: 0 published. The PR docs advertise openclaw/openclaw:latest, but Docker Hub currently has no tags for that repository.
  • Release registry mirror: 1 added. Release artifacts, manifests, and attestation checks must now stay aligned across GHCR and Docker Hub.

Stored data model
Persistent data-model change detected: migration/backfill/repair: .github/workflows/docker-release.yml, serialized state: src/dockerfile.test.ts. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🌊 off-meta tidepool
Patch quality: 🦐 gold shrimp
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Publish or backfill the initial Docker Hub tags before docs go live, or qualify the Docker Hub docs as pending.
  • Confirm Docker Hub secrets work for tag push, manual backfill, manifest creation, and attestation verification jobs.

Risk before merge

  • [P1] Docker Hub credentials and registry availability now gate Docker release jobs before GHCR images publish, so missing or rotated Docker Hub credentials can fail a release path that previously only needed GHCR.
  • [P1] The docs can publish before a first Docker Hub backfill or release creates openclaw/openclaw:latest; the live Docker Hub tag API currently reports zero tags.
  • [P1] Namespace ownership, secret scope, first publish/backfill, and Docker Hub attestation verification are operational release-owner concerns that string-level tests do not prove.

Maintainer options:

  1. Publish or qualify Docker Hub before merge (recommended)
    Either run a successful first backfill/release so openclaw/openclaw:latest exists, or change the docs to say the Docker Hub mirror becomes available after the first successful publish.
  2. Accept the fail-closed release cutover
    Release owners can intentionally merge as-is if Docker Hub credentials and registry availability should block Docker release publishing.
  3. Split docs from workflow
    Merge the release workflow first and publish the Docker Hub install docs only after a successful mirror publish exists.

Next step before merge

  • [P1] Release-owner judgment is needed because automation cannot choose between publishing/backfilling Docker Hub first, qualifying docs, or accepting fail-closed Docker Hub release gating.

Security
Cleared: No concrete supply-chain regression was found; the new Docker Hub login uses the existing pinned Docker login action and workflow permissions remain narrow, while release-secret readiness is tracked as merge risk.

Review findings

  • [P2] Gate Docker Hub docs on the first publish — docs/install/docker.md:50
Review details

Best possible solution:

Land this only after release owners either complete a first Docker Hub publish/backfill or qualify the docs as pending, and explicitly accept or adjust the fail-closed Docker Hub release gating.

Do we have a high-confidence way to reproduce the issue?

Yes for the PR finding: the live Docker Hub tag API returns count: 0, while the PR docs advertise openclaw/openclaw:latest. This is an after-patch documentation/runtime mismatch, not a current-main bug.

Is this the best way to solve the issue?

No, not as-is. The workflow belongs in the release surface, but the docs should wait for or qualify the first Docker Hub publish, and release owners should explicitly accept the fail-closed Docker Hub secret and availability policy.

Full review comments:

  • [P2] Gate Docker Hub docs on the first publish — docs/install/docker.md:50
    The new install docs tell users to pull openclaw/openclaw:latest, but the live Docker Hub repository currently has zero tags. Since docs can publish as soon as this merges, users can hit a broken pull path unless a first backfill/release has populated Docker Hub or the docs are worded as pending until that proof exists.
    Confidence: 0.92

Overall correctness: patch is incorrect
Overall confidence: 0.86

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 55d7b5b36ca1.

Label changes

Label justifications:

  • P2: This is a normal-priority release automation and install documentation change with operator impact but no current production outage.
  • merge-risk: 🚨 automation: The diff changes release automation so Docker Hub secrets and registry availability can block Docker release publishing.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🌊 off-meta tidepool and patch quality is 🦐 gold shrimp.
  • status: ⏳ waiting on author: ClawSweeper has contributor-facing work open and is waiting for author action. Not applicable: This is a maintainer-labeled member PR, so the external-contributor real behavior proof gate does not apply; operational Docker Hub publish proof is still needed for release-owner confidence.
Evidence reviewed

PR surface:

Tests +33, Docs +13, Config +139. Total +185 across 4 files.

View PR surface stats
Area Files Added Removed Net
Source 0 0 0 0
Tests 1 36 3 +33
Docs 2 16 3 +13
Config 1 180 41 +139
Generated 0 0 0 0
Other 0 0 0 0
Total 4 232 47 +185

What I checked:

  • Current main is GHCR-only: Current main defines only REGISTRY: ghcr.io and IMAGE_NAME: ${{ github.repository }} for the Docker release workflow, with no Docker Hub target. (.github/workflows/docker-release.yml:27, 55d7b5b36ca1)
  • PR adds Docker Hub secret gating: The PR head adds DOCKERHUB_REGISTRY, DOCKERHUB_IMAGE_NAME, and a validate_publish_config job that fails when DOCKERHUB_USERNAME or DOCKERHUB_TOKEN is absent; build and manifest jobs depend on that validation. (.github/workflows/docker-release.yml:72, 3d9f9e710542)
  • PR extends manifest and attestation publication: The PR creates Docker Hub manifests from the architecture tags and adds Docker Hub refs to attestation verification, which is the right surface but needs operational proof on the new registry. (.github/workflows/docker-release.yml:626, 3d9f9e710542)
  • Docs advertise Docker Hub latest: The PR docs tell users to set OPENCLAW_IMAGE="openclaw/openclaw:latest" before a live Docker Hub tag exists. Public docs: docs/install/docker.md. (docs/install/docker.md:50, 3d9f9e710542)
  • Live Docker Hub repository has no tags: Docker Hub metadata is public for openclaw/openclaw, but the tag listing returned count: 0, so the documented latest pull target is not available yet.
  • Tests are workflow text guards: The added tests assert Docker Hub registry strings, login text, tag outputs, and beta alias wording, but they do not prove Docker Hub credentials, first publish, or registry attestation behavior. (src/dockerfile.test.ts:352, 3d9f9e710542)

Likely related people:

  • vincentkoc: Recent history shows release-control hardening, Docker BuildKit retry handling, alpha image publish disabling, and this Docker Hub release PR in the same workflow area. (role: recent release workflow contributor; confidence: high; commits: abb6f04e0cac, ff5fac143973, b7450f83a16e; files: .github/workflows/docker-release.yml, docs/install/docker.md, src/dockerfile.test.ts)
  • obviyus: Recent merged PRs added browser release images and main/latest alias behavior that this PR extends to Docker Hub. (role: recent Docker release workflow contributor; confidence: medium; commits: dc31f73b394a, 3cb7ae535036; files: .github/workflows/docker-release.yml, src/dockerfile.test.ts)
  • steipete: History shows Docker attestation setup, attestation verification, and runtime-template Docker packaging in the same release surface. (role: adjacent Docker release and attestation contributor; confidence: medium; commits: 824c3e2b71a1, b61954919c2c, 659b5dce79ee; files: .github/workflows/docker-release.yml, scripts/verify-docker-attestations.mjs, src/dockerfile.test.ts)
  • onutc: Merged history added manual Docker release backfills and the rule that backfills keep latest aliases unchanged, which this PR updates for beta and Docker Hub paths. (role: manual backfill behavior contributor; confidence: medium; commits: 9fbcb81a8375, df0c06b98bac, 41bbea91bfcc; files: .github/workflows/docker-release.yml)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 automation 🚨 May affect CI, automerge, proof capture, label sync, or maintainer automation. labels Jun 26, 2026
@vincentkoc
vincentkoc force-pushed the chore/docker-hub-release-publish-v2 branch from 3a1adb3 to 92a7ae3 Compare June 27, 2026 00:05
@clawsweeper clawsweeper Bot added status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains. and removed status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 27, 2026
@vincentkoc
vincentkoc marked this pull request as ready for review June 28, 2026 17:41
@clawsweeper clawsweeper Bot added status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains. labels Jun 28, 2026
@vincentkoc vincentkoc closed this Jun 28, 2026
@vincentkoc vincentkoc reopened this Jun 28, 2026
@vincentkoc
vincentkoc requested a review from a team as a code owner June 28, 2026 18:05
@openclaw-barnacle openclaw-barnacle Bot added channel: discord Channel integration: discord channel: googlechat Channel integration: googlechat channel: mattermost Channel integration: mattermost channel: msteams Channel integration: msteams channel: nextcloud-talk Channel integration: nextcloud-talk channel: nostr Channel integration: nostr channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: voice-call Channel integration: voice-call labels Jun 28, 2026
@vincentkoc
vincentkoc force-pushed the chore/docker-hub-release-publish-v2 branch from a57ff0b to 3d9f9e7 Compare June 28, 2026 18:06
@openclaw-barnacle openclaw-barnacle Bot removed channel: discord Channel integration: discord channel: googlechat Channel integration: googlechat channel: mattermost Channel integration: mattermost channel: msteams Channel integration: msteams channel: nextcloud-talk Channel integration: nextcloud-talk channel: nostr Channel integration: nostr channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: voice-call Channel integration: voice-call channel: whatsapp-web Channel integration: whatsapp-web channel: zalo Channel integration: zalo app: macos App: macos app: web-ui App: web-ui labels Jun 28, 2026
@vincentkoc

Copy link
Copy Markdown
Member Author

Merged via squash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docker Docker and sandbox tooling docs Improvements or additions to documentation maintainer Maintainer-authored PR merge-risk: 🚨 automation 🚨 May affect CI, automerge, proof capture, label sync, or maintainer automation. P2 Normal backlog priority with limited blast radius. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. size: M status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant