补齐MySQL独立发行程序备份恢复实机验收

This commit is contained in:
xuans 2026-10-01 18:21:34 +08:00
parent 7da903494f
commit be6e2059f4
6 changed files with 100 additions and 0 deletions

View File

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

View File

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

View File

@ -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 配置缺失、历史事务核查及其他未完成门禁继续保留。

View File

@ -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 配置缺失、历史事务核查及其他未完成门禁继续保留。

View File

@ -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 配置缺失、历史事务核查及其他未完成门禁继续保留。

View File

@ -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 配置缺失、历史事务核查及其他未完成门禁继续保留。