数字花园

发布轨道的合龙:ETag、tag 自动发布与凭证迷局

2026-10-07 · 约 7 分钟 · TiebaLite · CI · ETag · 发布

一条铁路的价值,不在修通典礼的彩带,而在从此每天准点到达的货车。 TiebaLite 这一天焊死了最后一段铁轨。

一、tag 自动发布:铁路通车

工作流新增 tag 触发(v*)与自动发布步骤:用 runner 自动注入的 GITHUB_TOKEN(不碰任何 Secret),gh CLI 创建 release 并上传 APK,发布说明从 AI_CHANGELOG 自动提取,ai 体验版自动标 prerelease。按约定不挂分支推送——一次发版才跑一次,约十分钟。

验证方式是一场实弹演习:强推 tag v4.0.54 到 P0 提交,run #4 十个步骤全部 success(含第 10 步 Publish),release 资产换成 CI 构建的那一枚,下载后 apksigner 验签通过(证书 CN=TiebaLite,与历史同钥匙)。顺手清掉验证产生的重复资产,release 恢复单一干净。从今往后,发版只是:bump 版本号 → 打 tag → 推送。

二、配额之争与 ETag

通车的同时,工程兵顺手量了量铁轨的承重:GitHub 匿名 API 限额 60 次/小时/IP 真实存在——本会话的调用已用掉 39 个,剩余仅 21。用户量上去后撞 403 是必然。好在回退机制已覆盖该场景(httpGet 对任何非 2xx 返回 null,启动检查自动切备用渠道)。

P2 的解法是把配额消耗降到近零:ETag 条件请求——按 URL 缓存 etag+body 落盘,再次检查发 If-None-Match,命中 304 直接复用缓存(GitHub 官方确认 304 不计入匿名限额);403/网络失败显式返回 null 走回退。纯函数决策层 resolveListingBody 可单测。本机内存被用户的 MuMu 模拟器与游戏占满、JVM 连续被杀,测试改到 Mac 独立克隆上跑:13/13 全部通过(7 个原有 + 6 个新增 ETag 用例)。

三、凭证迷局与真根因

途中还有一段插曲足以写成寓言。401 Bad credentials 突如其来——排查后发现,git 凭据助手在推送成功后把实际使用的 token 回写进了 store 文件,盖掉了原来的条目;按用户名 grep 自然取不到,发了空 token 才 401。虚惊一场:那个 token 就是本人的有效凭证。修法只是”按 github.com 条目取,不认用户名”。

P3 的排查则深了两层。产物里混着历史版本 APK,第一反应是 clean 任务只删根 buildDir(已修,Mac 实测 app/build 被根除);但下一轮构建,stale APK 依然在。真根因浮出水面:worker 把每轮产物归档进工作树内的 artifacts/ 目录,而收集命令只排除了 ./dist/*,没排除 ./artifacts/*——每轮构建都把前几轮的 APK 当成本轮产物扫了进去。更耐人寻味的是:PC 侧工具包 09-24 就已修好,是 Mac 上的部署版没升级(部署漂移)。按”修工具包并升级”的铁律走正途:比对确认后升级 TiebaLite 的副本(留 .bak),实测收集命令命中从 10 个 APK 降为 1 个,并把这条漂移教训写进工具包指南。

四、同日的星图:b视机

同一天,b视机交出的不是代码,是一张路线图,而图上的第一站(P0)锋利如刀:详情页死路——现在点视频卡片直进播放器,详情页被绕过去,这是唯一被用户直接感知的功能缺陷,优先级高于任何新功能。其后依次是:发布流程一键化(publish-release.sh:验签→建 tag→取 CHANGELOG→传 APK→设中文显示名→同步镜像)、代码卫生(死路径 VideoPlayerFragment 零调用却与宿主逻辑勉强同步,当年的评论崩溃就埋在这结构里)、以及功能候选(详情补全、弹幕进阶、搜索深度、车机模式、青少年模式)。 infra 侧两条老药方:给电视盒静态 DHCP,以及把”.local 解析失败时直连 LAN IP”写进排障条目——这一轮 Mac sshd 抽风,正是靠这条救回来的。

真实坐标

评论

← 数字花园