1
0
forked from boos/BoosAPI

fix: detect latest digest updates in update center (#344)

This commit is contained in:
Cita
2026-03-31 15:02:24 +08:00
committed by GitHub
parent e8921e63ce
commit 3ce5179fed
3 changed files with 56 additions and 6 deletions
+14 -6
View File
@@ -34,10 +34,18 @@ function normalizeStableTag(value?: string | null): string {
return normalizeStableVersion(value); return normalizeStableVersion(value);
} }
function hasSameStableTag(left?: string | null, right?: string | null): boolean { function hasSameImageTag(left?: string | null, right?: string | null): boolean {
const normalizedLeft = normalizeStableTag(left); const rawLeft = normalizeString(left);
const normalizedRight = normalizeStableTag(right); const rawRight = normalizeString(right);
return !!normalizedLeft && normalizedLeft === normalizedRight; 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 { export function normalizeStableVersion(value?: string | null): string {
@@ -76,7 +84,7 @@ export function isSameImageTarget(
return currentDigest === targetDigest; return currentDigest === targetDigest;
} }
return hasSameStableTag(current?.imageTag, target.tag); return hasSameImageTag(current?.imageTag, target.tag);
} }
export function buildUpdateReminderCandidateKey( export function buildUpdateReminderCandidateKey(
@@ -138,7 +146,7 @@ export function resolveUpdateReminderCandidate(input: {
} }
const helperDigest = normalizeDigest(input.helper?.imageDigest); 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 { return {
source: 'docker-hub-tag', source: 'docker-hub-tag',
kind: 'new-digest', kind: 'new-digest',
+21
View File
@@ -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', () => { it('does not return an older GitHub candidate when the helper is already ahead of it', () => {
expect(resolveUpdateReminderCandidate({ expect(resolveUpdateReminderCandidate({
currentVersion: '1.2.3', currentVersion: '1.2.3',
@@ -61,6 +61,27 @@ describe('updateCenterPresentation', () => {
expect(state.canDeploy).toBe(true); 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', () => { it('does not advertise an older GitHub reminder when the helper is already ahead', () => {
expect(buildUpdateReminder({ expect(buildUpdateReminder({
currentVersion: '1.2.3', currentVersion: '1.2.3',