fix(deploy): 系统更新 - 非正式镜像标签可在线更新到正式版

sha-* 等非正式标签不再被字典序判成比 vX.Y.Z 更新;健康检查对非正式目标版本只确认服务就绪;管理后台更新页并排展示当前运行与最新发布版本并标注非正式版本
This commit is contained in:
ddCat committed 2026-09-18 08:50:18 +08:00
1 parent 8d99e0adbb
commit 7d3f4ffc50
8 files changed
+99 -11

No files matched your search

+7 -1
View File
@@ -156,7 +156,11 @@ func (m *Manager) Check(ctx context.Context) (Status, error) {
}
if CompareVersions(current, release.Version) < 0 {
m.state.Operation.Phase = PhaseReady
m.appendLogLocked(PhaseReady, fmt.Sprintf("发现新版本 %s", release.Version))
if IsReleaseVersion(current) {
m.appendLogLocked(PhaseReady, fmt.Sprintf("发现新版本 %s", release.Version))
} else {
m.appendLogLocked(PhaseReady, fmt.Sprintf("当前部署为 %s,可更新到正式版 %s", current, release.Version))
}
} else {
m.state.Operation.Phase = PhaseNoUpdate
m.appendLogLocked(PhaseNoUpdate, "当前已是最新版本")
@@ -430,6 +434,8 @@ func (m *Manager) checks(current string, currentErr error) []Check {
if currentErr != nil {
items[1].Status = "failed"
items[1].Detail = currentErr.Error()
} else if current != "" && !IsReleaseVersion(current) {
items[1].Detail = current + " · 非正式镜像标签,可切换到正式 Release"
}
if m.state.LastBackup != nil {
items[2].Status = "passed"
+1 -1
View File
@@ -518,7 +518,7 @@ func (m *Manager) checkHealthOnce(healthURL, targetVersion string) error {
if payload.Code != 0 {
return errors.New("健康接口业务状态异常")
}
if payload.Data.Build.Version != "" && CompareVersions(payload.Data.Build.Version, targetVersion) != 0 {
if IsReleaseVersion(targetVersion) && payload.Data.Build.Version != "" && CompareVersions(payload.Data.Build.Version, targetVersion) != 0 {
return fmt.Errorf("运行版本仍为 %s,期望 %s", payload.Data.Build.Version, targetVersion)
}
return nil
+18 -2
View File
@@ -10,12 +10,28 @@ type versionPart struct {
pre []string
}
func IsReleaseVersion(raw string) bool {
_, ok := parseVersion(raw)
return ok
}
func CompareVersions(left, right string) int {
a, aok := parseVersion(left)
b, bok := parseVersion(right)
if !aok || !bok {
return strings.Compare(strings.TrimSpace(left), strings.TrimSpace(right))
if aok && bok {
return compareParsedVersions(a, b)
}
// sha-5509b17、latest 等非正式标签不能按字典序和 v1.5.0 比,否则会被当成更新而不让升级。
if !aok && bok {
return -1
}
if aok && !bok {
return 1
}
return strings.Compare(strings.TrimSpace(left), strings.TrimSpace(right))
}
func compareParsedVersions(a, b versionPart) int {
for _, pair := range [][2]int{{a.major, b.major}, {a.minor, b.minor}, {a.patch, b.patch}} {
if pair[0] < pair[1] {
return -1
@@ -12,6 +12,10 @@ func TestCompareVersions(t *testing.T) {
{"v1.2.0-preview.3", "v1.2.0", -1},
{"v1.2.1", "v1.2.0", 1},
{"v1.2.0", "v1.2.0", 0},
{"vsha-5509b17", "v1.5.0", -1},
{"sha-5509b17", "v1.5.0", -1},
{"v1.5.0", "vsha-5509b17", 1},
{"v1.2.9", "v1.5.0", -1},
}
for _, test := range tests {
got := CompareVersions(test.left, test.right)