From be6e2059f4ce949f7e1b6c0dacb3ff0bdea9ea52 Mon Sep 17 00:00:00 2001 From: xuans Date: Thu, 1 Oct 2026 18:21:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90MySQL=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E5=8F=91=E8=A1=8C=E7=A8=8B=E5=BA=8F=E5=A4=87=E4=BB=BD=E6=81=A2?= =?UTF-8?q?=E5=A4=8D=E5=AE=9E=E6=9C=BA=E9=AA=8C=E6=94=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cli/mysql_commands_integration_test.go | 10 ++++ .../internal/cli/mysql_release_cli_test.go | 50 +++++++++++++++++++ doc/Linux生产流程测试记录.md | 10 ++++ doc/Scert整改任务执行清单.md | 10 ++++ doc/Scert整改合并优化清单.md | 10 ++++ doc/构建版本与数据库支持矩阵.md | 10 ++++ 6 files changed, 100 insertions(+) create mode 100644 backend/internal/cli/mysql_release_cli_test.go diff --git a/backend/internal/cli/mysql_commands_integration_test.go b/backend/internal/cli/mysql_commands_integration_test.go index a5b9a26..7538912 100644 --- a/backend/internal/cli/mysql_commands_integration_test.go +++ b/backend/internal/cli/mysql_commands_integration_test.go @@ -19,6 +19,10 @@ import ( // 在同一进程调用正式命令;测试 TLS 注册名不能用于独立发行二进制验收。 func TestMySQLRealBackupRestoreCommands(t *testing.T) { + testMySQLBackupRestoreCommands(t, "") +} + +func testMySQLBackupRestoreCommands(t *testing.T, binary string) { server := mysqltest.New(t) for _, scenario := range []string{"success", "sql_failure", "certificate_failure"} { t.Run(scenario, func(t *testing.T) { @@ -52,6 +56,9 @@ func TestMySQLRealBackupRestoreCommands(t *testing.T) { } username, password := parsed.User, parsed.Passwd parsed.User, parsed.Passwd = "", "" + if binary != "" { + parsed.TLSConfig = "true" + } cfg.Database = connection cfg.Database.DSN = parsed.FormatDSN() cfg.Database.CredentialRef = "secret://database/maintenance" @@ -90,6 +97,9 @@ func TestMySQLRealBackupRestoreCommands(t *testing.T) { t.Cleanup(func() { configPath = previous }) run := func(command *cobra.Command, args ...string) (string, error) { t.Helper() + if binary != "" { + return runMySQLReleaseCLI(t, binary, current, filepath.Join(server.Root(), "server.crt"), password, append([]string{command.Name()}, args...)...) + } var output bytes.Buffer command.SetArgs(args) command.SetContext(t.Context()) diff --git a/backend/internal/cli/mysql_release_cli_test.go b/backend/internal/cli/mysql_release_cli_test.go new file mode 100644 index 0000000..9b7ecbe --- /dev/null +++ b/backend/internal/cli/mysql_release_cli_test.go @@ -0,0 +1,50 @@ +package cli + +import ( + "context" + "errors" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" + "time" +) + +// 独立发行程序不依赖测试进程的 TLS 注册表;仅向子进程提供隔离实例的信任证书。 +func TestMySQLRealReleaseBackupRestoreCommands(t *testing.T) { + binary := os.Getenv("SCERT_MYSQL_TEST_CLI") + if binary == "" { + t.Skip("未启用 MySQL 独立发行程序验收") + } + if runtime.GOOS != "linux" { + t.Fatal("独立发行程序验收要求 Linux 系统证书加载语义") + } + info, err := os.Stat(binary) + if err != nil || !filepath.IsAbs(binary) || !info.Mode().IsRegular() || info.Mode().Perm()&0o111 == 0 { + t.Fatal("必须提供可执行的正式 Linux 发行程序绝对路径") + } + t.Logf("独立发行程序:%s;使用严格 TLS 和加密数据库凭据", binary) + testMySQLBackupRestoreCommands(t, binary) +} + +func runMySQLReleaseCLI(t *testing.T, binary, configuration, certificate, password string, args ...string) (string, error) { + t.Helper() + ctx, cancel := context.WithTimeout(t.Context(), time.Minute) + defer cancel() + command := exec.CommandContext(ctx, binary, append([]string{"--config", configuration}, args...)...) + command.Env = append(os.Environ(), "SSL_CERT_FILE="+certificate, "SSL_CERT_DIR="+filepath.Dir(certificate)) + command.WaitDelay = 2 * time.Second + output, err := command.CombinedOutput() + if strings.Contains(string(output), password) { + t.Fatal("独立发行程序输出不得泄漏数据库密码") + } + if err != nil { + if ctx.Err() != nil { + t.Fatalf("独立发行程序执行超时或取消:%v", ctx.Err()) + } + return string(output), errors.New(string(output)) + } + return string(output), nil +} diff --git a/doc/Linux生产流程测试记录.md b/doc/Linux生产流程测试记录.md index 0d00c76..13b1fa2 100644 --- a/doc/Linux生产流程测试记录.md +++ b/doc/Linux生产流程测试记录.md @@ -1373,3 +1373,13 @@ SQLite 新测试程序 SHA-256:4c81656fae63a2eebad999d58e6a79e63e6f441810e02ce - [~] 进行中:复用仓库现有 MySQL 隔离实库测试,增加独立正式发行程序调用;保留严格 TLS、凭据加密存储、成功恢复及 SQL/证书失败回退断言,不创建辅助验收脚本,不接触业务数据库。 - [ ] 未开始:将新增测试编译到 Linux,在第二台隔离数据库中验证当前正式发行程序,再记录实际通过或失败结果。 - [!] 暂缓或存在阻塞:MySQL 5.7、完整三库 Web 流程、Linux 原生构建、其余部署负向场景、历史事务核查、系统发信与最终清库首次部署等仍未闭环;整体生产验收未放行。 + +### MySQL 独立发行程序验收结果(2026-10-01 18:22,北京时间) + +- [x] 已完成,等待复审:新增仓库测试 `TestMySQLRealReleaseBackupRestoreCommands`,复用现有成功、SQL 失败、证书恢复失败场景;通过独立进程调用正式发行程序,不再依赖测试进程的 TLS 注册表。未创建辅助验收脚本。 +- [x] 已完成,等待复审:第二台 Linux 上单元 `scert-mysql-release-cli-20261001-1818` 真实结束,退出零;三个子场景全部通过,耗时 33.85 秒,日志为 `/var/tmp/scert-db-matrix-20261001-1720/mysql-release-cli.log`。 +- [x] 已完成,等待复审:验证对象为已部署候选同源的正式发行程序 `/var/tmp/scert-release-mysql-reentry-20261001/scert`,SHA-256 为 `39b70a1a11148982baeb699bae749f7e2988a2fba02b001c0da740ba8b86f36d`;测试程序 SHA-256 为 `88ff0fec3f2ab9a14f89dd52f384a677ecfb450f679b077ec47e83649644eb09`。 +- [x] 已完成,等待复审:隔离 MySQL 8.0.46 仅监听回环,使用严格 TLS;只在子进程中信任隔离证书,数据库密码通过加密凭据引用读取,未更改系统信任库。断言覆盖业务数据、审计数据、配置、主密钥、加密凭据、证书及失败后恢复前快照。 +- [x] 已完成,等待复审:本地后端全量测试、全量静态检查、CLI 竞态测试和差异检查通过。本地条件跳过不计实库通过;本批只修改测试,没有更换线上程序。 +- [~] 进行中:准备在隔离目录使用固定工具链执行 Linux 原生正式构建,避免将 Windows 交叉编译包冒充 Linux 原生证据;不新增公网监听,不更改生产工具链或业务配置。 +- [!] 暂缓或存在阻塞:上述三个独立 CLI 场景不代表全部数据库、Web 或生产流程验收通过;既有 SMTP 配置缺失、历史事务核查及其他未完成门禁继续保留。 diff --git a/doc/Scert整改任务执行清单.md b/doc/Scert整改任务执行清单.md index a96606f..7635afd 100644 --- a/doc/Scert整改任务执行清单.md +++ b/doc/Scert整改任务执行清单.md @@ -1617,3 +1617,13 @@ P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全 - [~] 进行中:复用仓库现有 MySQL 隔离实库测试,增加独立正式发行程序调用;保留严格 TLS、凭据加密存储、成功恢复及 SQL/证书失败回退断言,不创建辅助验收脚本,不接触业务数据库。 - [ ] 未开始:将新增测试编译到 Linux,在第二台隔离数据库中验证当前正式发行程序,再记录实际通过或失败结果。 - [!] 暂缓或存在阻塞:MySQL 5.7、完整三库 Web 流程、Linux 原生构建、其余部署负向场景、历史事务核查、系统发信与最终清库首次部署等仍未闭环;整体生产验收未放行。 + +### MySQL 独立发行程序验收结果(2026-10-01 18:22,北京时间) + +- [x] 已完成,等待复审:新增仓库测试 `TestMySQLRealReleaseBackupRestoreCommands`,复用现有成功、SQL 失败、证书恢复失败场景;通过独立进程调用正式发行程序,不再依赖测试进程的 TLS 注册表。未创建辅助验收脚本。 +- [x] 已完成,等待复审:第二台 Linux 上单元 `scert-mysql-release-cli-20261001-1818` 真实结束,退出零;三个子场景全部通过,耗时 33.85 秒,日志为 `/var/tmp/scert-db-matrix-20261001-1720/mysql-release-cli.log`。 +- [x] 已完成,等待复审:验证对象为已部署候选同源的正式发行程序 `/var/tmp/scert-release-mysql-reentry-20261001/scert`,SHA-256 为 `39b70a1a11148982baeb699bae749f7e2988a2fba02b001c0da740ba8b86f36d`;测试程序 SHA-256 为 `88ff0fec3f2ab9a14f89dd52f384a677ecfb450f679b077ec47e83649644eb09`。 +- [x] 已完成,等待复审:隔离 MySQL 8.0.46 仅监听回环,使用严格 TLS;只在子进程中信任隔离证书,数据库密码通过加密凭据引用读取,未更改系统信任库。断言覆盖业务数据、审计数据、配置、主密钥、加密凭据、证书及失败后恢复前快照。 +- [x] 已完成,等待复审:本地后端全量测试、全量静态检查、CLI 竞态测试和差异检查通过。本地条件跳过不计实库通过;本批只修改测试,没有更换线上程序。 +- [~] 进行中:准备在隔离目录使用固定工具链执行 Linux 原生正式构建,避免将 Windows 交叉编译包冒充 Linux 原生证据;不新增公网监听,不更改生产工具链或业务配置。 +- [!] 暂缓或存在阻塞:上述三个独立 CLI 场景不代表全部数据库、Web 或生产流程验收通过;既有 SMTP 配置缺失、历史事务核查及其他未完成门禁继续保留。 diff --git a/doc/Scert整改合并优化清单.md b/doc/Scert整改合并优化清单.md index 2720398..60f91b1 100644 --- a/doc/Scert整改合并优化清单.md +++ b/doc/Scert整改合并优化清单.md @@ -2246,3 +2246,13 @@ P0-11 生产验收门禁 - [~] 进行中:复用仓库现有 MySQL 隔离实库测试,增加独立正式发行程序调用;保留严格 TLS、凭据加密存储、成功恢复及 SQL/证书失败回退断言,不创建辅助验收脚本,不接触业务数据库。 - [ ] 未开始:将新增测试编译到 Linux,在第二台隔离数据库中验证当前正式发行程序,再记录实际通过或失败结果。 - [!] 暂缓或存在阻塞:MySQL 5.7、完整三库 Web 流程、Linux 原生构建、其余部署负向场景、历史事务核查、系统发信与最终清库首次部署等仍未闭环;整体生产验收未放行。 + +### MySQL 独立发行程序验收结果(2026-10-01 18:22,北京时间) + +- [x] 已完成,等待复审:新增仓库测试 `TestMySQLRealReleaseBackupRestoreCommands`,复用现有成功、SQL 失败、证书恢复失败场景;通过独立进程调用正式发行程序,不再依赖测试进程的 TLS 注册表。未创建辅助验收脚本。 +- [x] 已完成,等待复审:第二台 Linux 上单元 `scert-mysql-release-cli-20261001-1818` 真实结束,退出零;三个子场景全部通过,耗时 33.85 秒,日志为 `/var/tmp/scert-db-matrix-20261001-1720/mysql-release-cli.log`。 +- [x] 已完成,等待复审:验证对象为已部署候选同源的正式发行程序 `/var/tmp/scert-release-mysql-reentry-20261001/scert`,SHA-256 为 `39b70a1a11148982baeb699bae749f7e2988a2fba02b001c0da740ba8b86f36d`;测试程序 SHA-256 为 `88ff0fec3f2ab9a14f89dd52f384a677ecfb450f679b077ec47e83649644eb09`。 +- [x] 已完成,等待复审:隔离 MySQL 8.0.46 仅监听回环,使用严格 TLS;只在子进程中信任隔离证书,数据库密码通过加密凭据引用读取,未更改系统信任库。断言覆盖业务数据、审计数据、配置、主密钥、加密凭据、证书及失败后恢复前快照。 +- [x] 已完成,等待复审:本地后端全量测试、全量静态检查、CLI 竞态测试和差异检查通过。本地条件跳过不计实库通过;本批只修改测试,没有更换线上程序。 +- [~] 进行中:准备在隔离目录使用固定工具链执行 Linux 原生正式构建,避免将 Windows 交叉编译包冒充 Linux 原生证据;不新增公网监听,不更改生产工具链或业务配置。 +- [!] 暂缓或存在阻塞:上述三个独立 CLI 场景不代表全部数据库、Web 或生产流程验收通过;既有 SMTP 配置缺失、历史事务核查及其他未完成门禁继续保留。 diff --git a/doc/构建版本与数据库支持矩阵.md b/doc/构建版本与数据库支持矩阵.md index 122896e..bdb1a03 100644 --- a/doc/构建版本与数据库支持矩阵.md +++ b/doc/构建版本与数据库支持矩阵.md @@ -1381,3 +1381,13 @@ go test -p 1 -count=1 -json -timeout=6m ./internal/bootstrap - [~] 进行中:复用仓库现有 MySQL 隔离实库测试,增加独立正式发行程序调用;保留严格 TLS、凭据加密存储、成功恢复及 SQL/证书失败回退断言,不创建辅助验收脚本,不接触业务数据库。 - [ ] 未开始:将新增测试编译到 Linux,在第二台隔离数据库中验证当前正式发行程序,再记录实际通过或失败结果。 - [!] 暂缓或存在阻塞:MySQL 5.7、完整三库 Web 流程、Linux 原生构建、其余部署负向场景、历史事务核查、系统发信与最终清库首次部署等仍未闭环;整体生产验收未放行。 + +### MySQL 独立发行程序验收结果(2026-10-01 18:22,北京时间) + +- [x] 已完成,等待复审:新增仓库测试 `TestMySQLRealReleaseBackupRestoreCommands`,复用现有成功、SQL 失败、证书恢复失败场景;通过独立进程调用正式发行程序,不再依赖测试进程的 TLS 注册表。未创建辅助验收脚本。 +- [x] 已完成,等待复审:第二台 Linux 上单元 `scert-mysql-release-cli-20261001-1818` 真实结束,退出零;三个子场景全部通过,耗时 33.85 秒,日志为 `/var/tmp/scert-db-matrix-20261001-1720/mysql-release-cli.log`。 +- [x] 已完成,等待复审:验证对象为已部署候选同源的正式发行程序 `/var/tmp/scert-release-mysql-reentry-20261001/scert`,SHA-256 为 `39b70a1a11148982baeb699bae749f7e2988a2fba02b001c0da740ba8b86f36d`;测试程序 SHA-256 为 `88ff0fec3f2ab9a14f89dd52f384a677ecfb450f679b077ec47e83649644eb09`。 +- [x] 已完成,等待复审:隔离 MySQL 8.0.46 仅监听回环,使用严格 TLS;只在子进程中信任隔离证书,数据库密码通过加密凭据引用读取,未更改系统信任库。断言覆盖业务数据、审计数据、配置、主密钥、加密凭据、证书及失败后恢复前快照。 +- [x] 已完成,等待复审:本地后端全量测试、全量静态检查、CLI 竞态测试和差异检查通过。本地条件跳过不计实库通过;本批只修改测试,没有更换线上程序。 +- [~] 进行中:准备在隔离目录使用固定工具链执行 Linux 原生正式构建,避免将 Windows 交叉编译包冒充 Linux 原生证据;不新增公网监听,不更改生产工具链或业务配置。 +- [!] 暂缓或存在阻塞:上述三个独立 CLI 场景不代表全部数据库、Web 或生产流程验收通过;既有 SMTP 配置缺失、历史事务核查及其他未完成门禁继续保留。