Dependabot 自动 PR 合并策略
解读
在国内 PHP 团队的日常迭代中,Composer 依赖更新往往由 Dependabot 自动发起 Pull Request。面试官问“自动 PR 合并策略”,并不是让你背 GitHub 文档,而是考察三件事:
- 能否在保障线上稳定的前提下,把“人工点 Merge”变成“机器自动合”;
- 是否理解国内代码托管(Gitee、Coding、阿里云 Code)与 GitHub 在权限模型、CI 资源、审批流程上的差异;
- 能否用 PHP 生态工具(Composer、PHPUnit、Rector、PHPStan)把“自动合并”做得让测试、运维、安全三方都放心。
一句话:给出一条“可落地、可回滚、可审计”的自动化闭环,而不是简单勾选 “Auto-merge”。
知识点
- Dependabot 配置语法(package-ecosystem、schedule、ignore、groups)
- GitHub/GitLab/Gitee 的 merge 权限模型与 CODEOWNERS 机制
- CI 阶段的“质量门”:Composer audit、PHPUnit、PHPStan、Rector、Snyk、SonarQube
- 国内镜像源(腾讯云、华为、阿里云 Composer 镜像)对版本号漂移的影响
- 自动合并的三种触发方式:GitHub auto-merge、GitLab merge when pipeline succeeds、本地机器人(如 Mergify、Kodiak、企业微信机器人)
- 回滚策略:Composer lock 回退、OPcache 平滑重启、灰度机器分组、快速熔断
- 审计与合规:自动合并日志留存、钉钉/飞书群通知、变更单号与工单系统对接(如 Jira、禅道)
答案
我给团队设计过一套“三级门禁、灰度回滚”的 Dependabot 自动合并策略,已稳定运行 14 个月,核心步骤如下:
-
配置精细化
- composer.json 里用
~和^锁主版本,避免大版本被动升级; - dependabot.yml 按功能分组(security、runtime、dev),security 走单独队列,最高优先级;
- 国内源加
repositories.aliyun.com镜像,防止 GitHub 抽风拉包失败。
- composer.json 里用
-
CI 三级门禁
① 静态门禁:PHPStan level 8 + Rector diff,增量报错即失败;
② 单元门禁:PHPUnit 覆盖率下降超 2% 即失败;
③ 业务门禁:基于 Laravel 的 HTTP Test 回放核心下单链路,P99 延迟上涨超 10% 即失败。
所有门禁通过后才可进入“可合并”状态。 -
自动合并机器人
因为公司代码在 Gitee 企业版,没有 GitHub auto-merge,所以自研 PHP 控制台命令MergeBot,逻辑:- 监听 Gitee Webhook → PR 标签为
dependabot且 CI 状态为 success; - 调用 Gitee API 检测至少 1 名代码所有者(CODEOWNERS)的
LGTM评论; - 满足条件后,使用 Deploy-Key 把 PR rebase 到最新 master,再 fast-forward 合并,保证线性历史;
- 合并后立刻打
deploy-ready标签,触发 Jenkins 灰度发布到 10% 容器,5 分钟内无异常告警则全量。
- 监听 Gitee Webhook → PR 标签为
-
回滚与审计
- 每次合并写入 MySQL 变更日志:包名、from→to 版本、合并人、合并时间、回滚命令;
- 若灰度阶段 5xx 率>1%,Jenkins 自动执行
composer require 包:旧版本 --no-update && composer update lock,回滚时间<90 秒; - 飞书群机器人实时推送“合并+灰度”结果,方便值班工程师二次确认。
通过这套策略,我们把 87% 的补丁级依赖更新变成“0 人工干预”,全年因依赖升级导致的线上故障从 6 次降至 0 次,符合国内公司对“稳定第一、效率第二”的考核要求。
拓展思考
- 如果公司切换到私有 Composer 仓库(Satis / Packagist Private),如何验证 Dependabot 仍能正确解析版本?
- 当某个依赖的升级必须伴随 PHP 版本升级(如 PHPUnit 10 要求 PHP≥8.1),自动合并策略如何与“PHP 灰度扩缩容”联动?
- 在“安全合规红线”下,金融类项目需要“双人审批”才能合并,如何在不破坏自动化的前提下,让第二位审批人只需点一次“确认”即可完成?
- 国内多云架构下,CI 资源池可能分布在阿里云、华为云,如何确保 Dependabot 触发的流水线总能在 3 分钟内拿到空闲 Runner,避免排队导致合并窗口过期?