forked from boos/BoosAPI
fix: detect latest digest updates in update center (#344)
This commit is contained in:
@@ -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',
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
Reference in New Issue
Block a user