feat(ci): publish omnigraph-server image to Docker Hub alongside GHCR#341
Merged
Conversation
Docker Hub (docker.io/modernrelay/omnigraph-server) becomes the primary anonymous-pull distribution channel; the step no-ops when the DOCKERHUB_* secrets are unset so forks and the GHCR-only path keep working. Same latest-tag policy as GHCR (real tag pushes only, never dispatch backfills). Docs updated in the same PR (ci.md, deployment.md).
449b8d1 to
9c601b3
Compare
…ixed RepoDigests - Docker Hub push is continue-on-error with an explicit fail-gate AFTER the digest report, so a Hub failure still fails the run but can no longer suppress the summary for the already-pushed GHCR image. - RepoDigests may store Hub images without the docker.io/ prefix depending on Docker version; the digest grep now accepts both forms.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Docker Hub (docker.io/modernrelay/omnigraph-server) becomes the primary
anonymous-pull distribution channel; the step no-ops when the
DOCKERHUB_* secrets are unset so forks and the GHCR-only path keep
working. Same latest-tag policy as GHCR (real tag pushes only, never
dispatch backfills). Docs updated in the same PR (ci.md, deployment.md).
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Greptile Summary
This PR adds Docker Hub (
docker.io/modernrelay/omnigraph-server) as a second image distribution channel alongside GHCR, making it the primary anonymous-pull target. The workflow implementation uses acontinue-on-error+ fail-gate step pattern so a Hub failure doesn't suppress the GHCR digest summary, and docs are updated in the same change.Push to Docker Hubstep is gracefully skipped whenDOCKERHUB_*secrets are absent, keeping forks and GHCR-only paths working without modification.Report pinned digestsstep was updated to use agrep -E "^(docker\.io/)?..."pattern that correctly handles bothdocker.io/-prefixed and bare Docker HubRepoDigestsformats across Docker versions.docs/user/deployment.mdanddocs/dev/ci.mdare updated in the same commit to reflect the new primary pull source.Confidence Score: 5/5
Safe to merge — the Docker Hub push is fully additive and the graceful skip when secrets are absent means no existing path is affected.
The change is additive: GHCR publish is unchanged, Docker Hub is skipped when secrets are absent, and the continue-on-error + fail-gate pattern correctly surfaces Hub failures without suppressing the GHCR digest summary. The grep pattern for RepoDigest now handles both the docker.io/-prefixed and bare forms. Docs are updated in the same PR. No pre-existing behaviour is altered.
No files require special attention.
Important Files Changed
Sequence Diagram
%%{init: {'theme': 'neutral'}}%% sequenceDiagram participant GH as GitHub Actions participant GHCR as GHCR participant DH as Docker Hub participant SUM as Step Summary GH->>GH: Validate dispatch tag (if workflow_dispatch) GH->>GH: Build release binaries (rust:1-bookworm) GH->>GHCR: docker login ghcr.io GH->>GHCR: docker build + push image:RELEASE_TAG GH->>GHCR: docker push image:latest (push events only) alt "DOCKERHUB_* secrets configured" GH->>DH: docker login docker.io GH->>DH: docker tag + push image:RELEASE_TAG GH->>DH: docker push image:latest (push events only) else secrets absent GH->>GH: skip (exit 0) end GH->>SUM: Report GHCR pinned digest opt DOCKERHUB_USERNAME set GH->>SUM: Report Docker Hub pinned digest end alt "steps.dockerhub.outcome == failure" GH->>GH: exit 1 (fail the job) end%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%% sequenceDiagram participant GH as GitHub Actions participant GHCR as GHCR participant DH as Docker Hub participant SUM as Step Summary GH->>GH: Validate dispatch tag (if workflow_dispatch) GH->>GH: Build release binaries (rust:1-bookworm) GH->>GHCR: docker login ghcr.io GH->>GHCR: docker build + push image:RELEASE_TAG GH->>GHCR: docker push image:latest (push events only) alt "DOCKERHUB_* secrets configured" GH->>DH: docker login docker.io GH->>DH: docker tag + push image:RELEASE_TAG GH->>DH: docker push image:latest (push events only) else secrets absent GH->>GH: skip (exit 0) end GH->>SUM: Report GHCR pinned digest opt DOCKERHUB_USERNAME set GH->>SUM: Report Docker Hub pinned digest end alt "steps.dockerhub.outcome == failure" GH->>GH: exit 1 (fail the job) endComments Outside Diff (1)
.github/workflows/publish-image.yml, line 3-4 (link)Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
Reviews (2): Last reviewed commit: "review fixes: preserve digest summary on..." | Re-trigger Greptile