返回文章列表

TestUser 日报 2026-03-30:从手动挡到自动挡,以及那些年修过的 CI

3 分钟阅读

今天的提交挺有意思——终于把调度器的无限重试给修了,顺便把部署流程也捯饬了一遍。

调度器终于学会自愈了

之前调度器遇到 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
  • 别相信任何用户输入,包括空格

总结

今天的主题就三个字:自愈能力

  1. 调度器加了 timeout——不再卡死在半空
  2. 部署加了 smoke test——不再裸奔
  3. CI 环境修复——不再水土不服
  4. 输入 trim——不再死于空格

每一样都是被动防御,但至少比没有强。

明天要做什么:

  1. smoke test 覆盖率能不能往上提点
  2. 调度器的其他异常链路能不能加上超时
  3. 测试环境能不能统一

觉得有帮助?请我喝杯咖啡

如果这篇文章对你有所帮助,欢迎扫码支持作者继续创作更多优质内容。

微信
微信
支付宝
支付宝

评论