Composer 2.9 默认安全阻断导致 CI 更新失败:定位与处置
Composer 2.9 于 2025-11-13 发布,2.9.2 于 2025-11-19 发布。2.9 起默认开启自动安全阻断:composer update 不会再把依赖更新到存在已知安全公告的版本。本地可能因为 lock 文件早已固定而没有触发,CI 里一旦重算依赖图,就会直接失败。
默认值:哪些会拦,哪些不会
audit.block-insecure:默认true,阻止更新到有已知 advisory 的包版本。audit.block-abandoned:默认false,不阻止废弃包;需要时再打开,并用audit.ignore-abandoned忽略部分包。
也就是说,CI 突然失败大概率是 block-insecure 生效,而不是废弃包导致的。
先确认是阻断而非其他问题
composer update -vvv
composer audit
composer audit 仍然只针对现有 composer.lock 报告漏洞,不会因为阻断开启而改变输出。2.9 给 audit 增加了 --ignore-unreachable,CI 无法访问部分仓库(例如某些私有源)时可以减少误报干扰:
composer audit --ignore-unreachable
临时放行:只关阻断,不关审计
2.9.2 新增了 --no-security-blocking:
composer update --no-security-blocking
它关闭的是更新时的阻断,审计报告仍然可用。等价配置是:
{
"config": {
"audit": {
"block-insecure": false,
"block-abandoned": false
}
}
}
CI 里更推荐把开关收窄到具体 advisory,而不是整体关闭。
audit.ignore 的作用范围
audit.ignore 接受 advisory id;2.9.2 起也支持 CVE id,阻断路径内部仍优先按 advisory id 匹配以提升性能。
2.9.2 还允许通过配置限定 audit.ignore 的作用域,让同一份 ignore 列表只作用于 composer audit 的报告,或只作用于 update 时的阻断。这样可以做到“审计里保留告警,但不因它卡住构建”,反之亦可。配置键名可用 composer config --list 对照当前版本确认——2.9.2 同时修了 config 命令无法设置新增 audit 配置项的问题。
{
"config": {
"audit": {
"block-insecure": true,
"ignore": ["CVE-2024-12345", "PKSA-xxxx-xxxx-xxxx"]
}
}
}
partial update 失败:#12626
2.9.2 修复了一个具体场景:锁文件中另一个包存在已知公告时,composer update vendor/pkg 这类局部更新会失败。表现是只更新一个包却报出无关包的安全问题。遇到这种报错,先确认 CI 使用的 Composer 版本是否为 2.9.2 及以上:
composer --version
composer self-update 2.9.2
可以移除 roave/security-advisories
自动阻断在功能上完全替代 roave/security-advisories。已经迁移到 2.9 的项目可以移除该依赖,减少一次依赖解析:
composer remove roave/security-advisories --dev
缩小更新面:--minimal-changes
全量更新时,--minimal-changes 只修改满足新约束所必需的包,避免锁文件里大量无关版本漂移。对应配置项与环境变量:
{
"config": {
"update-with-minimal-changes": true
}
}
composer update --minimal-changes
COMPOSER_MINIMAL_CHANGES=1 composer update
在 CI 中配合安全阻断使用,可以把“被阻断的包”和“被顺带升级的包”区分开,排障范围更小。
同版本的其他变化
- 新增
repository命令:list/add/remove/set-url,仓库默认以带name的 JSON 数组存储:
composer repo add foo vcs https://github.com/acme/foo
composer repo add qux vcs https://example.org --after bar
- 自动恢复简单的 lock 冲突:仅 content-hash 冲突时,
composer update --lock或重跑update会忽略 git 冲突标记。 - Forgejo / Codeberg 原生支持;HTTP/3;自定义 header 认证;客户端 TLS 证书;
licenses --locked;SHELL_VERBOSITY;init非交互;COMPOSER_PREFER_DEV_OVER_PRERELEASE;脚本处理器性能改进;修复 Symfony 7 兼容与 preload 难调试的问题。