From b2a1bcc8d94a82f69f872621bc29eefa08125232 Mon Sep 17 00:00:00 2001 From: ddCat <2695092045@qq.com> Date: Tue, 22 Sep 2026 09:23:18 +0800 Subject: [PATCH] =?UTF-8?q?chore(release):=20=E7=89=88=E6=9C=AC=E5=8F=91?= =?UTF-8?q?=E5=B8=83=20-=20=E5=87=86=E5=A4=87=20v1.5.7.1=20=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/scripts/promote-image.sh | 2 +- .github/workflows/publish-images.yml | 2 +- CHANGELOG.md | 5 +++ VERSION | 2 +- backend/internal/hostupdate/version.go | 33 ++++++++++++------- backend/internal/hostupdate/version_test.go | 2 ++ docs/content/docs/backend/system-update.mdx | 2 +- .../pages/admin/components/admin-shell.tsx | 6 +++- .../admin/components/analytics-panel.tsx | 33 ++++++++++--------- 9 files changed, 55 insertions(+), 32 deletions(-) diff --git a/.github/scripts/promote-image.sh b/.github/scripts/promote-image.sh index c5efbb9ff..1eab26f99 100644 --- a/.github/scripts/promote-image.sh +++ b/.github/scripts/promote-image.sh @@ -15,7 +15,7 @@ done tags=(--tag "$IMAGE:sha-$GITHUB_SHA" --tag "$IMAGE:sha-${GITHUB_SHA:0:7}") if [[ "$GITHUB_REF" == refs/tags/v* ]]; then - [[ "${VERSION_TAG:?}" =~ ^[0-9]+\.[0-9]+\.[0-9]+([.-][0-9A-Za-z.-]+)?$ ]] || { echo "Invalid version image tag" >&2; exit 1; } + [[ "${VERSION_TAG:?}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?([.-][0-9A-Za-z.-]+)?$ ]] || { echo "Invalid version image tag" >&2; exit 1; } tags+=(--tag "$IMAGE:$VERSION_TAG") elif [[ "$GITHUB_REF" == refs/heads/main ]]; then current_sha=$(gh api "repos/${GITHUB_REPOSITORY:?}/git/ref/heads/main" --jq '.object.sha') diff --git a/.github/workflows/publish-images.yml b/.github/workflows/publish-images.yml index b9bb79710..8139c30fb 100644 --- a/.github/workflows/publish-images.yml +++ b/.github/workflows/publish-images.yml @@ -204,7 +204,7 @@ jobs: shell: bash run: | prerelease_args=() - if [[ "$GITHUB_REF_NAME" == *-* || "$GITHUB_REF_NAME" == *.rc* ]]; then + if [[ "$GITHUB_REF_NAME" == *-* || "$GITHUB_REF_NAME" == *.rc* || "$GITHUB_REF_NAME" =~ ^v[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then prerelease_args+=(--prerelease) fi gh release create "$GITHUB_REF_NAME" \ diff --git a/CHANGELOG.md b/CHANGELOG.md index abca50c78..12f659458 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +## v1.5.7.1 + +- 预览版:包含 v1.5.7 之后主分支已合入的画布批量生成一致性、素材批量删除、Live2D 配置导入、模型选择、Agent 运行稳定性、声明式文本流和后台运维界面改进。 +- 修复在线更新版本比较,使四段版本号 `v1.5.7.1` 可以被 Host Updater 识别并高于 `v1.5.7`;该版本标记为 GitHub 预发布,不覆盖正式版 `latest`。 + ## v1.5.7 - 合并 PR #549(原作者 @15657306288):新增图片 / 视频列表分析、动态多维表格、视频分镜转换与关键帧绑定,以及批量生成设置;参考图上限前后端统一为 10。 diff --git a/VERSION b/VERSION index 22708fe08..61c0f9bff 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v1.5.7 +v1.5.7.1 diff --git a/backend/internal/hostupdate/version.go b/backend/internal/hostupdate/version.go index 46e0685a8..dd2680697 100644 --- a/backend/internal/hostupdate/version.go +++ b/backend/internal/hostupdate/version.go @@ -6,8 +6,8 @@ import ( ) type versionPart struct { - major, minor, patch int - pre []string + core []int + pre []string } func IsReleaseVersion(raw string) bool { @@ -32,11 +32,18 @@ func CompareVersions(left, right string) int { } 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] { + for index := 0; index < len(a.core) || index < len(b.core); index++ { + left, right := 0, 0 + if index < len(a.core) { + left = a.core[index] + } + if index < len(b.core) { + right = b.core[index] + } + if left < right { return -1 } - if pair[0] > pair[1] { + if left > right { return 1 } } @@ -78,16 +85,18 @@ func parseVersion(raw string) (versionPart, bool) { value = strings.SplitN(value, "+", 2)[0] parts := strings.SplitN(value, "-", 2) core := strings.Split(parts[0], ".") - if len(core) != 3 { + if len(core) < 3 { return versionPart{}, false } - major, err1 := strconv.Atoi(core[0]) - minor, err2 := strconv.Atoi(core[1]) - patch, err3 := strconv.Atoi(core[2]) - if err1 != nil || err2 != nil || err3 != nil { - return versionPart{}, false + coreNumbers := make([]int, len(core)) + for index, value := range core { + number, err := strconv.Atoi(value) + if err != nil { + return versionPart{}, false + } + coreNumbers[index] = number } - parsed := versionPart{major: major, minor: minor, patch: patch} + parsed := versionPart{core: coreNumbers} if len(parts) == 2 && parts[1] != "" { parsed.pre = strings.FieldsFunc(parts[1], func(r rune) bool { return r == '.' || r == '-' }) } diff --git a/backend/internal/hostupdate/version_test.go b/backend/internal/hostupdate/version_test.go index e175b4728..486af57c8 100644 --- a/backend/internal/hostupdate/version_test.go +++ b/backend/internal/hostupdate/version_test.go @@ -11,6 +11,8 @@ func TestCompareVersions(t *testing.T) { {"v1.2.0-preview.10", "v1.2.0-preview.3", 1}, {"v1.2.0-preview.3", "v1.2.0", -1}, {"v1.2.1", "v1.2.0", 1}, + {"v1.5.7.1", "v1.5.7", 1}, + {"v1.5.7.1", "v1.5.7.2", -1}, {"v1.2.0", "v1.2.0", 0}, {"vsha-5509b17", "v1.5.0", -1}, {"sha-5509b17", "v1.5.0", -1}, diff --git a/docs/content/docs/backend/system-update.mdx b/docs/content/docs/backend/system-update.mdx index 9924c6c34..a6d3906d8 100644 --- a/docs/content/docs/backend/system-update.mdx +++ b/docs/content/docs/backend/system-update.mdx @@ -14,7 +14,7 @@ description: Host Updater、Release 检查、数据库备份迁移、健康验 ## 安全更新顺序 1. 从 GitHub Releases 读取包含预览版在内的最高语义版本,并与 `.env` 中固定的 `CANVAS_IMAGE_TAG` 比较。`sha-*` 这类非正式镜像标签一律视为低于正式 Release,避免把 `vsha-5509b17` 字典序比较成比 `v1.5.0` 更新。 -2. 下载目标版本的 `docker-compose.deploy.yml`,执行 `docker compose config --quiet`,检查部署文件、磁盘空间和当前版本。当前标签不是 `vX.Y.Z` 时,健康检查只确认服务就绪,不要求构建号和镜像标签逐字相同。 +2. 下载目标版本的 `docker-compose.deploy.yml`,执行 `docker compose config --quiet`,检查部署文件、磁盘空间和当前版本。当前标签不是 `vX.Y.Z` 或 `vX.Y.Z.N` 时,健康检查只确认服务就绪,不要求构建号和镜像标签逐字相同。 3. 创建 `backup-YYYYMMDD-HHMMSS.zip.partial`,其中包含 PostgreSQL custom-format dump、后端数据目录 tar 和元数据;写入完成后 `fsync`、原子改名,并复核 ZIP 结构和 SHA-256。 4. 拉取目标 backend/web 镜像并要求存在仓库 `sha256` 摘要。任何失败都在停服前中止。 5. 停止 web/backend,等待 Backend 的 SIGTERM drain 完成;PostgreSQL 和 Redis 保持运行。 diff --git a/web/src/pages/admin/components/admin-shell.tsx b/web/src/pages/admin/components/admin-shell.tsx index be642595f..46e207296 100644 --- a/web/src/pages/admin/components/admin-shell.tsx +++ b/web/src/pages/admin/components/admin-shell.tsx @@ -124,7 +124,11 @@ function adminPopupContainer(node?: HTMLElement) { export function AdminShell() { const userId = useUserStore((state) => state.user?.id); - return ; + return ( + + + + ); } function AdminShellLayout() { diff --git a/web/src/pages/admin/components/analytics-panel.tsx b/web/src/pages/admin/components/analytics-panel.tsx index 15f83e7fd..8019b1ba6 100644 --- a/web/src/pages/admin/components/analytics-panel.tsx +++ b/web/src/pages/admin/components/analytics-panel.tsx @@ -91,7 +91,9 @@ export default function AnalyticsPanel({ users, channels }: Props) { else next.delete("rangePreset"); setSearchParams(next, { replace: true }); void reload(); - return () => { requestSequence.current += 1; }; + return () => { + requestSequence.current += 1; + }; }, [filters, rangePreset]); useEffect(() => { @@ -275,7 +277,19 @@ export default function AnalyticsPanel({ users, channels }: Props) { {financeUnavailable && } - {loadError && void reload()}>重试} />} + {loadError && ( + void reload()}> + 重试 + + } + /> + )}
- } - label="P95 请求耗时" - value={data && data.kpi.upstreamRequests > 0 ? formatDuration(data.kpi.p95DurationMs) : "--"} - detail="筛选范围内的上游请求" - /> - } - label="当前排队" - value={data ? formatNumber(data.kpi.currentQueuedTasks) : "--"} - detail="实时快照 · 非历史累计" - tone={data?.kpi.currentQueuedTasks ? "warning" : "neutral"} - /> + } label="P95 请求耗时" value={data && data.kpi.upstreamRequests > 0 ? formatDuration(data.kpi.p95DurationMs) : "--"} detail="筛选范围内的上游请求" /> + } label="当前排队" value={data ? formatNumber(data.kpi.currentQueuedTasks) : "--"} detail="实时快照 · 非历史累计" tone={data?.kpi.currentQueuedTasks ? "warning" : "neutral"} /> } label="费用统计(积分)"