编程 Composer 2.9 默认安全阻断导致 CI 更新失败:定位与处置

2026-11-14 21:05:40

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 难调试的问题。
复制全文 生成海报 PHP Composer 依赖管理

推荐文章

程序员茄子在线接单