用途:Safe Push 是 IntelliJ 仓库的推送流程,由 Patronus 驱动,确保代码变更在合并到 master 等受保护分支前通过所有必需测试。
主要能力:通过仓库根目录的 safePush.cmd 脚本在命令行使用。常用命令包括:./safePush.cmd HEAD:master(推送当前 HEAD 到 master)、./safePush.cmd :master(推送指定提交)、./safePush.cmd -dry-run HEAD:master(仅测试不推送)。选项有 -autosquash(默认 true,自动压缩 fixup! 提交)、-dry-run、-emergency(跳过测试直接推送,仅限紧急情况)、-verbose、-help。
流程:变更先推送到临时分支,Patronus 触发所需 CI 检查(测试、编译),测试对不稳定失败最多重试 4 次;全部通过后合并到目标分支,并通过 Slack/Space/Email 通知结果。成功约 3-5 小时(95 分位约 4.7 小时),失败约 4-5 小时。启动后会收到 Patronus URL(形如 https://patronus.labs.jb.gg/robot/),应回显给用户,作为运行的主要入口(分享链接、取消按钮、恢复分支按钮)。状态跟踪、失败检查枚举、单次尝试深入查看等由 patronus 技能记录;单个 TeamCity 构建的深入检查交由 teamcity-cli 技能。取消与恢复分支操作在浏览器中进行。
紧急推送:仅用于修复编译中断、回滚破坏安装程序的提交、修复 .patronus/config.yaml 配置错误。不应用于 Javadoc 拼写修复、因“无关”测试失败而跳过、赶时间跳过测试、推送与并发推送冲突的大变更。
Bazel 测试与环境变量:Bazel 沙箱默认不继承环境变量,编写会启动外部进程(如 bazel.cmd)的测试时,需在 BUILD.bazel 的 java_test 目标中用 env_inherit 显式传递所需变量,如 LOCALAPPDATA、PROCESSOR_ARCHITECTURE、USERPROFILE(Windows)和 HOME(Unix/macOS,bazel 缓存目录所需)。
限制与排障:Safe Push 卡住或缓慢可查看 #ij-builds Slack 频道;看似无关的测试失败,Patronus 最多重试 4 次,若 4 次均失败而在 master 通过,则很可能是变更导致;疑似基础设施问题报告至 #ij-qa-watch。调试失败可前往 Patronus 上的 Safe Push,点击 commits 查看变更,点击 Restore Branch 在本地恢复。参考:Safe Push 文档、Patronus 手册、Slack 频道 #patronus-support、#ij-builds、#ij-qa-watch。