diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml index 09ec700..231eaad 100644 --- a/.github/workflows/release-artifacts.yml +++ b/.github/workflows/release-artifacts.yml @@ -126,6 +126,32 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max + + - name: Verify GHCR latest tag points to current release + run: | + set -euo pipefail + IMAGE="ghcr.io/${{ github.repository }}" + TAG_REF="${IMAGE}:${RELEASE_TAG}" + LATEST_REF="${IMAGE}:latest" + + # GHCR tag updates can be eventually consistent right after multi-arch push. + # Retry for a short window to avoid false negatives caused by propagation delay. + for i in {1..12}; do + TAG_DIGEST="$(docker buildx imagetools inspect --format '{{json .Manifest.Digest}}' "${TAG_REF}" 2>/dev/null | tr -d '"' || true)" + LATEST_DIGEST="$(docker buildx imagetools inspect --format '{{json .Manifest.Digest}}' "${LATEST_REF}" 2>/dev/null | tr -d '"' || true)" + + if [ -n "${TAG_DIGEST}" ] && [ -n "${LATEST_DIGEST}" ] && [ "${TAG_DIGEST}" = "${LATEST_DIGEST}" ]; then + echo "Verified ${LATEST_REF} -> ${RELEASE_TAG} (${TAG_DIGEST})." + exit 0 + fi + + echo "Waiting for GHCR tag propagation (${i}/12): ${TAG_REF}=${TAG_DIGEST:-} ${LATEST_REF}=${LATEST_DIGEST:-}" >&2 + sleep 10 + done + + echo "Digest mismatch after retries: ${TAG_REF}=${TAG_DIGEST:-}, ${LATEST_REF}=${LATEST_DIGEST:-}" >&2 + exit 1 + - name: Export Docker image archives for release assets run: | set -euo pipefail diff --git a/webui/src/layout/DashboardShell.jsx b/webui/src/layout/DashboardShell.jsx index a5c5f14..126bd3e 100644 --- a/webui/src/layout/DashboardShell.jsx +++ b/webui/src/layout/DashboardShell.jsx @@ -201,6 +201,12 @@ export default function DashboardShell({ token, onLogout, config, fetchConfig, s
{t('sidebar.version')}
{versionInfo?.current_tag || '-'}
+ {versionInfo?.source && ( +
source: {versionInfo.source}
+ )} + {versionInfo?.latest_tag && ( +
latest release: {versionInfo.latest_tag}
+ )} {versionInfo?.has_update && (