diff --git a/Makefile b/Makefile index 4c50c98..bf792ed 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ ROOT_DIR = $(CURDIR) DEPLOY_NAME = "team-api" DOCKER_NAME = "team-api" -VERSION ?= $(shell git describe --tags --long 2>/dev/null | sed -E 's/-0-g[0-9a-f]+$$//; s/-([0-9]+)-g[0-9a-f]+$$/_\1/' || cat VERSION 2>/dev/null || echo "dev") +VERSION ?= $(shell git describe --tags --long 2>/dev/null | sed -E 's/-0-g[0-9a-f]+$$//; s/-([0-9]+)-g[0-9a-f]+$$/+\1/' || cat VERSION 2>/dev/null || echo "dev") LDFLAGS = -X github.com/qianfree/team-api/internal/consts.Version=$(VERSION) # Mirror acceleration (override for non-China regions) diff --git a/internal/logic/update/checker.go b/internal/logic/update/checker.go index c851088..7474781 100644 --- a/internal/logic/update/checker.go +++ b/internal/logic/update/checker.go @@ -62,15 +62,17 @@ func CheckForUpdate(ctx context.Context, force bool) (*CheckResult, error) { // Dev builds: always report an update if a remote release exists hasUpdate = true } else { - currentVer, err := semver.NewVersion(strings.TrimPrefix(consts.Version, "v")) + currentVer, err := semver.NewVersion(normalizeSemver(consts.Version)) if err != nil { - return nil, fmt.Errorf("invalid current version %q: %w", consts.Version, err) + // 版本仍无法解析,按开发构建处理:有远端发行版即提示更新,避免阻断检查接口 + hasUpdate = true + } else { + latestVer, err := semver.NewVersion(latestStr) + if err != nil { + return nil, fmt.Errorf("invalid latest version %q: %w", release.TagName, err) + } + hasUpdate = latestVer.GreaterThan(currentVer) } - latestVer, err := semver.NewVersion(latestStr) - if err != nil { - return nil, fmt.Errorf("invalid latest version %q: %w", release.TagName, err) - } - hasUpdate = latestVer.GreaterThan(currentVer) } // Find matching asset for current platform @@ -186,3 +188,15 @@ func setCheckCache(ctx context.Context, result *CheckResult) { // TODO: read from config update_check_interval_hours g.Redis().Do(ctx, "SETEX", redisCacheKey, ttl, string(data)) } + +// normalizeSemver 将构建期注入的版本字符串规整为合法 semver。 +// Makefile 通过 git describe 生成的版本形如 "0.2.0_39"(v0.2.0 之后 39 个提交), +// 其中的下划线在 semver 中非法,此处转为构建元数据 "+"("0.2.0+39"), +// 比较时与基础版本等价,不会误报更新。 +func normalizeSemver(v string) string { + v = strings.TrimPrefix(v, "v") + if i := strings.IndexByte(v, '_'); i > 0 { + v = v[:i] + "+" + v[i+1:] + } + return v +}