Files
go-sip/docs/evidence/all-changes-main-debug-deployment-20261010.md
T

65 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 全部改动合入 main 后的 Debug 部署
## 范围与来源
使用者确认“所有变更”包括尚未合入 main 的业务提交 `09e273b`,不只日志修改。
最终合并提交:`a2cafd419b56a2ddf60322b813b4e22f2d62a6b9`,已快进到 main、推送并核对远端一致。合并保留 main 上已经审查通过的完整日志防泄漏修复,同时包含业务分支的结构错误拒绝反馈、幂等和 SIP 来源快照等改动。根工作区中旧日志改动以最新主线实现为准,不用旧版本覆盖新修复;根工作区文件和并行内容未清理或覆盖。
共享合同在合并前执行 `make contracts-update` 成功,固定提交 `8e6c332bb9d5b3d331cef3e5cbc35a1b8b4b7c86`。本项目指针、实现、测试和文档随合并一起更新。SaaS 对可识别错误消息的拒绝反馈仍须确认实际接收,MQ publisher confirm 不代表 SaaS 已处理。
权威构建工作区:`.local/logging-isolated` 的干净 main。没有从根工作区未提交的旧日志代码构建发布。
## 合并与验证
两处合并冲突实际解决:
- Dispatcher 保留日志身份上下文和新拒绝身份幂等分支,重放已拒绝身份不执行,记录 `idempotent_rejection`。
- MQ 保留实际收件与 ACK/NACK/Reject 观察,同时使用新拒绝处理链路,移除旧的提前丢弃分支。处理完成记录 `rejected_handled`,随后才 ACK。
`TestMergedRejectionKeepsReceiveLogsWireBytesAndDurableAck` 两模式先红后绿,验证原始收件字节不变、无效输入不进入业务执行、处理先于 ACK、实际接收/处理/确认各阶段和已有身份保留、原 schema 原因可见、密钥隐藏及普通/Debug 正文差异。既有失败重入队、身份不可复活及全部日志隐私测试保持。
最终验证全部通过:
- `make check`:格式、当前合同和 Proto、vet、全包 race、构建、实际隔离 RabbitMQ/HTTPS/mTLS 及现有验收对照。
- 部署 Python 测试 21 项。
- `make coverage`:业务覆盖率 **72.6%**,高于 65%。
- `make release-check-local`;固定提交后再次通过,`source_dirty=false`,`production_approval=false`。
- 暂存及工作区 `git diff --check`。
隔离工作区私密验证日志:`.local/all-main-{final-check,deployment-tests,coverage,release-check,fixed-release-check}.log`,覆盖率文件 `.local/all-main-{all,business}-coverage.out`。
## 实际部署与现场
现场摘要时间:`2026-10-09T23:40:15.653991+00:00`(2026-10-10 07:40 CST)。登记主机 `server.sip`,原固定服务、目录和 `nonprod-real` 配置。
部署前严格核对登记 SSH 主机指纹和 ARI 文件归属/0600,确认零通道,关闭 Dispatcher 新准入,再只读排除未知执行及 Agent 恢复阻断。无阻断才从固定提交部署。
| 项目 | 实际结果 |
| --- | --- |
| 安装源码 | `a2cafd419b56a2ddf60322b813b4e22f2d62a6b9` |
| Agent | PID `2904634`,enabled+active/running,0 重启 |
| Dispatcher | PID `2904645`,enabled+active/running,0 重启 |
| 两服务实际参数 | Debug 开启,Capture 关闭 |
| 两进程实际 SHA-256 | `bf81d096a46ddecede59329afa0fbae12aadd74bb919fc6ae9fc4d139a7d1a1e` |
| Asterisk | PID `777461` 不变,enabled+active/running,未重启 |
| 活动通道/tcpdump | 均为 0 |
| 实际 HTTP | 14 次请求及响应,状态 200 |
| 实际 Debug RPC 正文 | Agent、Dispatcher 各 8 条 |
| 日志格式/错误 | 仅 Logrus JSON;0 error、redaction_error |
| 已观察正文的敏感字段/签名 URL/音频 data URI 泄漏 | 0,13 个隐藏标记;URL 检查忽略 scheme 大小写 |
安装器报告 `artifact_hashes_match=true`。另在同一干净固定提交使用部署器相同命令 `CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath` 独立重建,SHA-256 与两个实际运行进程一致,构建信息明确 `vcs.revision=a2cafd4…`、`vcs.modified=false`。
发布门禁制品 SHA-256 `cf43288862338087ef757e28bae81fd36eecfcd70594119379207f61b415b221` 不是上述部署制品:`scripts/build-release.sh` 明确使用 `-buildvcs=false`,部署器保留干净 Git 提交信息。初次现场检查错误地比较了两种构建的 hash,断言失败;定位构建参数差异后用相同部署构建独立复现并核对,不放宽为任意 hash。
## 验证边界
本次没有清数据、迁移旧库、重启 Asterisk、启动抓包、独立试拨、主动生成外呼/MQ 消息或额外调用 AI/OSS。
现场未发生无效 MQ 业务消息、拒绝反馈接收、内嵌音频、非 JSON/form 正文、真实通话或真实恢复故障;相应新分支仅声明本地实际隔离测试通过,不以正常启动、零泄漏计数或 MQ confirm 代签 SaaS 应用接收、真实 AI/OSS 通话或生产。
部署器仍返回 `dependency_state=saas_pending`、`business_ready=false`、`real_reboot_verified=false`,保留原事实;不能据此伪称生产验收,也不把该独立 probe 标签当作两个实际服务未启动。
私密本机摘要(目录0700、文件0600):`.local/logging-deployment/all-main-{preflight,deploy,field-summary}.json`。不提交原始正文、凭据、录音或 SIP。