composer audit默认不发通知,仅终端输出风险列表;需配合脚本或CI流程封装,用--format=json解析结果后调用钉钉/Slack API发送告警,且必须满足CI中if: always()、jq判断有漏洞、携带仓库名/分支/SHA三个条件才可靠触发。

composer-audit 默认不发通知,得自己接
Composer-Audit 本身只是个命令行工具,执行 composer audit 后只在终端输出风险列表,不会自动发邮件、钉钉或 Slack。想让它“说话”,必须配合脚本或 CI 流程做一层封装。
常见做法是把审计结果转成结构化数据(比如 JSON),再用轻量脚本调用对应 API。别指望它内置 Webhook 支持——它连配置文件都不读,纯靠命令参数驱动。
用 --format=json + shell 脚本对接钉钉/企业微信
先确保已安装 composer-audit:运行 composer global require composer-audit/composer-audit(推荐全局安装,避免每次进项目都要装)。
执行审计并捕获结果:
composer audit --format=json --no-interaction 2>/dev/null
这个命令会输出标准 JSON,含 advisories 数组和 exitCode。关键点:
- 如果没风险,
advisories是空数组,但进程退出码仍是0 - 有风险时退出码为
1,但 JSON 仍完整输出,可直接解析 -
--no-interaction必须加,否则遇到高危项会卡住等人工确认
CI 中触发通知的三个硬性条件
在 GitHub Actions / GitLab CI 等环境里,光跑 composer audit 不够,容易被忽略。要真起作用,得同时满足:
- 命令放在
if: always()或等效逻辑里(否则失败就中断,根本走不到通知步骤) - 用
jq解析 JSON 并判断.advisories | length > 0,只在有风险时触发通知 - 通知内容里必须带
composer.json所在仓库名 + 分支 + 触发 SHA,否则开发不知道修哪个环境的哪次提交
漏掉任意一条,通知要么发不出,要么发了也查无此“包”。
为什么不用 Composer 插件方式集成通知?
有人试过写自定义 Composer 插件监听 post-install-cmd 或 post-update-cmd 事件来自动审计,但这条路基本走不通:
- Composer 插件生命周期里拿不到完整的依赖树快照,
audit需要解析vendor/composer/installed.json,而该文件在插件执行时尚未完全写入 - 插件无法可靠区分是本地开发执行还是 CI 执行,容易导致开发者每次
composer install都收到告警邮件 - 错误处理能力弱——插件抛异常会导致整个
composer install失败,违背“审计是观察行为,不是阻断行为”的原则
真正稳定的路径只有一条:把它当成独立检查步骤,和 PHPStan、PHP-CS-Fixer 放在同一层 CI job 里跑,不嵌套、不劫持、不依赖生命周期钩子。











