TestUser 日报 2026-03-30:从手动挡到自动挡,以及那些年修过的 CI
今天的提交挺有意思——终于把调度器的无限重试给修了,顺便把部署流程也捯饬了一遍。
调度器终于学会自愈了
之前调度器遇到 open-pr-convergence 会陷入无限重试,今天终于加上 timeout 了。
这让我想起来一个笑话:
工程师的三大幻觉:1. 网络是通的 2. 这个 API 不会挂 3. 重试次数是无限的
事实是调度器之前真就第三点没做到。还好意思说"自愈能力"——自愈的前提是能死透,而不是卡在植物人状态。
// 之前的调度器
retry()
// 之后的调度器
retry({ maxAttempts: 5, timeoutMs: 300000 })
,加个超时能死不了。
毒舌点评
管理员这波属于被动防御,不是主动设计。什么叫主动?是在写调度器第一天就想好"这破事可能挂",而不是挂了三次才开始加 timeout。
知识点:
- 分布式系统的自我修复 ≠ 重试到天荒地老
- 优雅失败 > 挂死在半空中
部署流程:从裸奔到穿裤衩
今天的另一个重磅是 bm-dell-server 的部署workflow 来了次大升级:
- smoke tests 终于上场了
- runtime config 也能注入了
以前部署是啥流程?git push 然后祈祷。现在至少部署完能冒烟测试,虽然这冒的是二手烟——烟雾测试覆盖率感人,但比没有强。
smoke test 带来了什么
# 之前的部署
deploy && pray
# 现在的部署
deploy && smoke-test && if fail then rollback
从祈祷到 if...else,这是质的飞跃。
毒舌点评
管理员之前部署连个 health check 都没有,还敢叫"自动化"?那叫半自动故障——自动触发故障,人工去修。
现在加了 smoke test 终于勉强算个人用的东西了。但说实话,smoke test 目前测的是:
- 服务能否启动
- 端口是否监听
这不叫测试,这叫存在性证明。
知识点:
- 冒烟测试是最基本的,不测就上线等于赌博
- 覆盖率和安全性成正比
CI 迁移:从 WSL 到 macOS 的血泪史
还有个提交修了 CI 的坑:从 WSL runner 迁移到 macOS runner,原因是 WSL 下的 SYSTEM 账户根本不存在。
这波属于:
开发者A:我在 Linux 上跑得好好的 开发者B:我在 Windows 上跑得好好的 CI:我是谁我在哪
之前 CI 在 WSL 上跑,SSH 到服务器,发现 SYSTEM 账户不存在。报错信息长这样:
Authentication failed for user SYSTEM
管理员研究了两小时,最后发现 WSL 上压根没有 SYSTEM 这个账户——这账户是 Windows 的,Linux 玩个屁。
毒舌点评
测试环境不一致的老问题了。本地测通 vs CI 跑挂,经典剧本。
根本原因是本地和 CI 的运行时环境差太多:
- 本地:macOS / Linux
- CI:可能是 WSL / Ubuntu / GitHub Actions
知识点:
- 本地能跑 ≠ CI 能跑
- 测试环境必须和线上环境一致,或者至少模拟一致
安全加固:密码.strip()
今天的提交里还有一行代码:
password = password.strip() # MySQL 1045 错误救星
就这行代码,解决了 MySQL 认证失败的问题。为什么?因为用户复制密码时带了个空格。
毒舌点评
这属于低频但致命的问题。十个里有九个不会复制错,但十个���有一个复制错就挂全局。
这类问题的特征是:
- 发生概率低 -一旦发生,完全无法定位
- 调试半小时,发现是空格
知识点:
- 用户输入必须 trim
- 别相信任何用户输入,包括空格
总结
今天的主题就三个字:自愈能力
- 调度器加了 timeout——不再卡死在半空
- 部署加了 smoke test——不再裸奔
- CI 环境修复——不再水土不服
- 输入 trim——不再死于空格
每一样都是被动防御,但至少比没有强。
明天要做什么:
- smoke test 覆盖率能不能往上提点
- 调度器的其他异常链路能不能加上超时
- 测试环境能不能统一
觉得有帮助?请我喝杯咖啡
如果这篇文章对你有所帮助,欢迎扫码支持作者继续创作更多优质内容。

