Skip to content

Commit 3d9f9e7

Browse files
committed
ci(docker): clarify beta image tags
1 parent f8c6354 commit 3d9f9e7

3 files changed

Lines changed: 20 additions & 3 deletions

File tree

.github/workflows/docker-release.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ on:
1414
workflow_dispatch:
1515
inputs:
1616
tag:
17-
description: Existing release tag to backfill (for example v2026.3.22)
17+
description: Existing stable or beta release tag to backfill (for example v2026.3.22 or v2026.3.22-beta.1)
1818
required: true
1919
type: string
2020

@@ -591,7 +591,8 @@ jobs:
591591
browser_tags+=("${GHCR_IMAGE}:${version}-browser")
592592
dockerhub_browser_tags+=("${DOCKERHUB_IMAGE}:${version}-browser")
593593
fi
594-
# Manual backfills should only republish the requested version tags.
594+
# Beta releases and manual backfills publish only immutable version tags;
595+
# do not advance latest/main aliases from those flows.
595596
if [[ "${IS_MANUAL_BACKFILL}" != "1" && "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?$ ]]; then
596597
tags+=("${GHCR_IMAGE}:latest" "${GHCR_IMAGE}:main")
597598
slim_tags+=("${GHCR_IMAGE}:slim" "${GHCR_IMAGE}:main-slim")
@@ -776,6 +777,8 @@ jobs:
776777
arm64_refs+=("${GHCR_IMAGE}:${version}-browser-arm64")
777778
dockerhub_arm64_refs+=("${DOCKERHUB_IMAGE}:${version}-browser-arm64")
778779
fi
780+
# Beta releases and manual backfills publish only immutable version tags;
781+
# do not advance latest/main aliases from those flows.
779782
if [[ "${IS_MANUAL_BACKFILL}" != "1" && "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9]+)?$ ]]; then
780783
multi_refs+=("${GHCR_IMAGE}:latest" "${GHCR_IMAGE}:main")
781784
slim_multi_refs+=("${GHCR_IMAGE}:slim" "${GHCR_IMAGE}:main-slim")

docs/install/docker.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ Docker is **optional**. Use it only if you want a containerized gateway or to va
5454
Use `ghcr.io/openclaw/openclaw` or `openclaw/openclaw`. Avoid community
5555
Docker Hub mirrors because OpenClaw does not control their release timing,
5656
rebuilds, or retention policy. Common official tags: `main`, `latest`,
57-
`<version>` (e.g. `2026.2.26`).
57+
`<version>` (e.g. `2026.2.26`), and beta versions such as
58+
`2026.2.26-beta.1`. Beta tags do not move `latest` or `main`.
5859

5960
</Step>
6061

src/dockerfile.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,19 @@ describe("Dockerfile", () => {
366366
expect(workflow).toContain("DOCKERHUB_MULTI_REFS: ${{ steps.refs.outputs.dockerhub_multi }}");
367367
});
368368

369+
it("publishes beta Docker tags without advancing latest aliases", async () => {
370+
const workflow = await readFile(dockerReleaseWorkflowPath, "utf8");
371+
372+
expect(workflow).toContain("Existing stable or beta release tag to backfill");
373+
expect(workflow).toContain('! "${RELEASE_TAG}" =~ ^v[0-9]{4}');
374+
expect(workflow).toContain("(-beta\\.[1-9][0-9]*)?");
375+
expect(workflow).toContain("${DOCKERHUB_IMAGE}:${version}");
376+
expect(workflow).toContain("${DOCKERHUB_IMAGE}:${version}-slim");
377+
expect(workflow).toContain("${DOCKERHUB_IMAGE}:${version}-browser");
378+
expect(workflow.split("do not advance latest/main aliases from those flows")).toHaveLength(3);
379+
expect(workflow.split('"$version" =~ ^[0-9]+\\.[0-9]+\\.[0-9]+(-[0-9]+)?$')).toHaveLength(3);
380+
});
381+
369382
it("smokes runtime workspace templates before Docker release manifests publish", async () => {
370383
const workflow = await readFile(dockerReleaseWorkflowPath, "utf8");
371384

0 commit comments

Comments
 (0)