diff --git a/backend/internal/releasearchive/archive_test.go b/backend/internal/releasearchive/archive_test.go index f10034f..0a72b88 100644 --- a/backend/internal/releasearchive/archive_test.go +++ b/backend/internal/releasearchive/archive_test.go @@ -17,7 +17,7 @@ func TestCreateTarGzPreservesReleaseModes(t *testing.T) { destination := filepath.Join(t.TempDir(), "Scert-test.tar.gz") if err := Create(Options{ Source: source, Destination: destination, Format: FormatTarGz, - Executables: []string{"install-linux.sh", "scert", "scert-admin", "scert-nginx", "ScertDesktop"}, + Executables: []string{"install-linux.sh", "scert", "scert-admin", "scert-nginx", "scert-storage"}, }); err != nil { t.Fatalf("创建 Linux 发布归档失败:%v", err) } @@ -48,13 +48,13 @@ func TestCreateTarGzPreservesReleaseModes(t *testing.T) { assertMode(t, modes, "scert", 0o755) assertMode(t, modes, "scert-admin", 0o755) assertMode(t, modes, "scert-nginx", 0o755) - assertMode(t, modes, "ScertDesktop", 0o755) + assertMode(t, modes, "scert-storage", 0o755) assertMode(t, modes, "web/index.html", 0o644) assertMode(t, modes, "web", 0o755) } func TestCreateZipContainsReleaseFiles(t *testing.T) { - source := createFixture(t) + source := createFixture(t, "install-windows.ps1", "scert.exe", "scert-admin.exe") destination := filepath.Join(t.TempDir(), "Scert-test.zip") if err := Create(Options{Source: source, Destination: destination, Format: FormatZip}); err != nil { t.Fatalf("创建 Windows 发布归档失败:%v", err) @@ -64,15 +64,23 @@ func TestCreateZipContainsReleaseFiles(t *testing.T) { t.Fatal(err) } defer reader.Close() - found := false - for _, item := range reader.File { - if item.Name == "web/index.html" { - found = true - break - } + expected := map[string]bool{ + "install-windows.ps1": true, + "scert.exe": true, + "scert-admin.exe": true, + "web/index.html": true, } - if !found { - t.Fatal("Windows 发布归档缺少 Web 入口") + for _, item := range reader.File { + if item.FileInfo().IsDir() { + continue + } + if !expected[item.Name] { + t.Fatalf("Windows 发布归档出现非预期文件:%s", item.Name) + } + delete(expected, item.Name) + } + if len(expected) != 0 { + t.Fatalf("Windows 发布归档缺少必要文件:%v", expected) } } @@ -119,13 +127,16 @@ func TestCreateRejectsSymlink(t *testing.T) { } } -func createFixture(t *testing.T) string { +func createFixture(t *testing.T, files ...string) string { t.Helper() source := t.TempDir() if err := os.MkdirAll(filepath.Join(source, "web"), 0o755); err != nil { t.Fatal(err) } - for _, name := range []string{"install-linux.sh", "scert", "scert-admin", "scert-nginx", "ScertDesktop"} { + if len(files) == 0 { + files = []string{"install-linux.sh", "scert", "scert-admin", "scert-nginx", "scert-storage"} + } + for _, name := range files { if err := os.WriteFile(filepath.Join(source, name), []byte(name), 0o644); err != nil { t.Fatal(err) } diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index abaf640..971bd37 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -33,7 +33,7 @@ | 编号 | 状态 | 任务 | 当前问题 | 下一步交付 | 验证证据 | |---|---:|---|---|---|---| -| P0-01 | [~] | 明确产品范围 | 双平台和独立克隆发布范围验证通过;CLI 业务入口已停用,最终可执行文件待核查 | 核查收敛后的 CLI 发布产物,完成范围复审 | 范围审查、发布包文件清单、CLI 回归测试 | +| P0-01 | [x] | 明确产品范围 | 正式发布仅含 Web/服务端,桌面源码保留;CLI 已收敛且实际 Windows 产物验证通过 | 等待最终复审;Windows/Linux 实机安装仍归对应验收项 | 双平台归档及 SHA256、独立克隆、命令树及实际退出码 | | P0-02 | [~] | 建立完整任务清单 | 已覆盖 44 项,逐项依赖、涉及文件和具体实机步骤仍需补充 | 持续维护状态、证据和复审结果 | 本文件提交记录 | | P0-03 | [~] | 整理源码、构建产物和部署产物 | 独立克隆无桌面二进制和 dist,正式构建通过;根级归档及通用临时文件忽略规则仍需补齐 | 补齐全仓库忽略边界、发布及证据目录说明,保留本地历史文件 | `git ls-files`、`git check-ignore`、独立克隆发布验证 | | P0-04 | [~] | 统一开发和构建版本 | 模块实际使用 Go `1.26.6`,不存在此前误报的版本阻塞;历史文档仍需统一 | 统一模块、构建说明、锁文件和验收机版本记录 | 版本矩阵、构建日志 | @@ -105,9 +105,9 @@ ## 八、下一轮优先顺序 -1. 统一 Go 版本声明、构建环境和发布文档口径。 -2. 确认 SQLite、MySQL、PostgreSQL 的正式支持级别,并补齐迁移/恢复验证矩阵。 -3. 完成 Web/服务端正式发布范围及独立克隆验证;桌面生成物已取消跟踪,源码和本地文件保留。 +1. 补齐 P0-02 中全部 44 项的依赖、涉及文件、验证命令、实机步骤和复审字段,不能只有汇总表。 +2. 完成 P0-03 全仓库忽略边界和发布/证据目录说明;正式范围和独立克隆构建已验证,桌面源码及本地文件保留。 +3. 继续 P0-04 版本/安装策略统一及 P0-05 三数据库迁移恢复的实际验证。 4. 继续定位 SSH 公钥自动部署实机失败阶段,完成密码回退和密钥登录双路径验收。 5. 将生产验收门禁与当前远程部署、DNS、HTTPS 和 ACME 证据逐项对应。 ### 2026-09-27:自动化基线验证 @@ -148,7 +148,7 @@ - 保留路径扫描、Go `-trimpath`、文件及归档 SHA256、拒绝覆盖旧输出、源码提交和脏状态记录。 - 已通过 PowerShell 语法解析、`go test -count=1 -timeout=3m ./internal/releasearchive ./cmd/scert-release`、`git diff --check`。 - 发布范围验证已完成,证据见下节;这仍是构建层验证,不代表 Windows/Linux 实机安装验收。 -- 历史业务 CLI 的执行入口已在后续批次停用,最终可执行文件仍待检查;P0-01 暂保持 `[~]`。 +- 历史业务 CLI 的执行入口及最终产物检查已由后续批次完成,见本节末尾的范围验收记录。 ### 2026-09-27:双平台和独立克隆发布验证 @@ -167,11 +167,27 @@ - 保留初始化、服务启动、状态、证书诊断、DNS 诊断、配置、日志、备份恢复及系统服务运维;服务端自动续期未更改。 - 新增命令树白名单和 11 类旧入口拒绝测试;用无效配置和模拟凭据证明拒绝先于配置读取,配置内容不变且没有新增运行数据。 - CLI 定向测试、后端全量 `go test -p 1 -count=1 -timeout=3m ./...` 和 `go vet -p=1 ./...` 已通过。使用测试临时目录,没有清空或连接生产数据库。 -- 下一步:从本批干净提交构建发布包,运行实际 Windows 可执行文件的帮助和旧入口退出码检查;Linux 安装及服务运行仍需独立实机验证。 +- 本批实际 Windows 可执行文件的帮助和旧入口退出码已在后续干净发布包中验证;Linux 安装及服务运行仍需独立实机验证。 ### 2026-09-27:CLI 实际产物复核修正 - `d90ddaa` 已推送并完成干净工作区双平台构建,产物位于 `build/release-scope-20260927-d90ddaa/`。 - 实际 Windows 可执行文件的默认帮助仅显示运维命令;旧 `domain add` 返回退出码 1,没有执行旧业务。 - 实测发现框架先输出英文 `Error:`,入口随后又输出中文错误,造成重复提示。已设置根命令 `SilenceErrors=true`,由 `Execute` 统一输出中文错误;新增无重复输出断言。 -- 修正后 CLI 和发布模块定向测试及静态检查通过;仍需以修正后的干净发布包完成最终范围复核,不能用之前的二进制代替。 +- 修正后 CLI 和发布模块定向测试及静态检查通过;最终复核使用修正后的 `885478a` 干净发布包,没有用之前的二进制代替。 + +### 2026-09-27:P0-01 范围验收记录 + +| 验收点 | 当前证据 | 结论 | +|---|---|---| +| 正式范围只有 Web 和服务端 | 根 README、构建/部署说明、当前执行清单和历史范围声明一致;无额外 CI 或发布入口调用 Wails | 本地复核通过 | +| 桌面历史源码保留 | 桌面目录及开发说明仍在;原本机桌面二进制和 dist 未物理删除 | 符合不删除要求 | +| 双平台实际发布包 | `build/release-scope-20260927-885478a/`;源码 `885478a7e0dfc3832cdd094ed388891c41062eb9`,`source_dirty=false` | 构建层通过 | +| 清单及归档一致 | 33 项长度和 SHA256 一致;Windows 解包 9 文件/8 校验项,Linux 22 文件/21 校验项,均无桌面产物 | 构建层通过 | +| Linux 可执行权限 | 归档内 `scert`、`scert-admin`、`scert-nginx`、`scert-storage` 和安装器均为 `0755` | 归档层通过,不代表 Linux 已运行 | +| 实际 CLI 帮助 | 从最终 Windows ZIP 解出的 `scert.exe help` 返回 0,仅公开运维入口 | 本机执行通过 | +| 实际旧 CLI 拒绝 | `domain`、`server`、`ssh-key`、`renew`、`deploy` 均返回 1;仅一条中文错误,无模拟凭据回显,无运行目录创建 | 本机执行通过 | +| 自动化回归 | 最终应用代码通过后端全量测试、全量 vet 和 `go mod verify`;前端独立克隆 150 项通过,源码未再修改 | 本地自动化通过 | +| 归档测试范围 | Linux 测试改用 `scert-storage`,不再要求桌面;Windows 测试逐项核查实际平台文件,不再仅判断 Web 入口存在 | 发布模块测试和 vet 通过 | + +P0-01 标记 `[x] 已完成,等待复审`,不标记生产放行。整体 44 项整改未完成:P0-02 执行规格、P0-03 全仓库边界、三数据库实机验证、项目权限、统一任务、备份页面及生产门禁等仍需继续。上述输出均在忽略目录内,没有提交二进制、运行数据或辅助测试脚本。