diff --git a/src/server/shared/updateCenterReminder.ts b/src/server/shared/updateCenterReminder.ts index 1eb384d..1387b49 100644 --- a/src/server/shared/updateCenterReminder.ts +++ b/src/server/shared/updateCenterReminder.ts @@ -34,10 +34,18 @@ function normalizeStableTag(value?: string | null): string { return normalizeStableVersion(value); } -function hasSameStableTag(left?: string | null, right?: string | null): boolean { - const normalizedLeft = normalizeStableTag(left); - const normalizedRight = normalizeStableTag(right); - return !!normalizedLeft && normalizedLeft === normalizedRight; +function hasSameImageTag(left?: string | null, right?: string | null): boolean { + const rawLeft = normalizeString(left); + const rawRight = normalizeString(right); + if (!rawLeft || !rawRight) return false; + + const stableLeft = normalizeStableTag(left); + const stableRight = normalizeStableTag(right); + if (stableLeft && stableRight) { + return stableLeft === stableRight; + } + + return rawLeft === rawRight; } export function normalizeStableVersion(value?: string | null): string { @@ -76,7 +84,7 @@ export function isSameImageTarget( return currentDigest === targetDigest; } - return hasSameStableTag(current?.imageTag, target.tag); + return hasSameImageTag(current?.imageTag, target.tag); } export function buildUpdateReminderCandidateKey( @@ -138,7 +146,7 @@ export function resolveUpdateReminderCandidate(input: { } const helperDigest = normalizeDigest(input.helper?.imageDigest); - if (dockerDigest && helperDigest && hasSameStableTag(input.helper?.imageTag, dockerTag) && helperDigest !== dockerDigest) { + if (dockerDigest && helperDigest && hasSameImageTag(input.helper?.imageTag, dockerTag) && helperDigest !== dockerDigest) { return { source: 'docker-hub-tag', kind: 'new-digest', diff --git a/src/shared/updateCenterReminder.test.ts b/src/shared/updateCenterReminder.test.ts index db19aa5..fc2bdbb 100644 --- a/src/shared/updateCenterReminder.test.ts +++ b/src/shared/updateCenterReminder.test.ts @@ -73,6 +73,27 @@ describe('updateCenterReminder shared logic', () => { })); }); + it('treats alias tags like latest as digest-tracked targets when the digest changes', () => { + expect(resolveUpdateReminderCandidate({ + currentVersion: '1.2.3', + helper: { + imageTag: 'latest', + imageDigest: 'sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + }, + githubRelease: null, + dockerHubTag: { + normalizedVersion: 'latest', + displayVersion: 'latest @ sha256:bbbbbbbbbbbb', + tagName: 'latest', + digest: 'sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', + }, + })).toEqual(expect.objectContaining({ + source: 'docker-hub-tag', + kind: 'new-digest', + candidateKey: 'docker-hub-tag:latest@sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', + })); + }); + it('does not return an older GitHub candidate when the helper is already ahead of it', () => { expect(resolveUpdateReminderCandidate({ currentVersion: '1.2.3', diff --git a/src/web/pages/helpers/updateCenterPresentation.test.ts b/src/web/pages/helpers/updateCenterPresentation.test.ts index 7eb41a5..e517543 100644 --- a/src/web/pages/helpers/updateCenterPresentation.test.ts +++ b/src/web/pages/helpers/updateCenterPresentation.test.ts @@ -61,6 +61,27 @@ describe('updateCenterPresentation', () => { expect(state.canDeploy).toBe(true); }); + it('treats alias tags like latest as a new digest deploy target when the digest changes', () => { + const state = describeDockerDeployState({ + enabled: true, + helperHealthy: true, + currentVersion: '1.2.3', + helper: { + imageTag: 'latest', + imageDigest: 'sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', + }, + candidate: { + normalizedVersion: 'latest', + tagName: 'latest', + digest: 'sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', + }, + }); + + expect(state.kind).toBe('new-digest'); + expect(state.canDeploy).toBe(true); + expect(state.badgeLabel).toBe('发现新 digest'); + }); + it('does not advertise an older GitHub reminder when the helper is already ahead', () => { expect(buildUpdateReminder({ currentVersion: '1.2.3',