校正双平台归档测试并记录正式范围验收结果

This commit is contained in:
xuans 2026-09-27 17:38:31 +08:00
parent 885478a7e0
commit 96883b37a8
2 changed files with 47 additions and 20 deletions

View File

@ -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)
}

View File

@ -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 全仓库边界、三数据库实机验证、项目权限、统一任务、备份页面及生产门禁等仍需继续。上述输出均在忽略目录内,没有提交二进制、运行数据或辅助测试脚本。