如何配置使npm audit检测到问题依赖时GitLab CI流水线失败
GitLab CI 配置npm audit检测到风险依赖即阻断流水线实现方法
你当前使用的GitLab官方封装npm-audit分析镜像默认仅生成依赖扫描报告,不会因为检测到漏洞主动返回非0退出码,因此不会触发流水线失败。可通过以下两种方案实现需求:
方案1:使用npm audit原生退出码逻辑(推荐,支持自定义阈值)
npm audit 命令原生自带退出码规则:只要检测到符合配置阈值的安全漏洞,就会返回非0退出码,GitLab CI检测到脚本返回非0时会直接判定作业失败、阻断后续流程。该方案可灵活配置触发阻断的最低漏洞等级,参考配置如下:
dependency-scan: # 替换为你项目实际使用的Node版本,保证和项目开发环境版本一致 image: node:20-alpine stage: security-check script: # 安装项目依赖,必须先完成依赖安装才能执行audit检测 - npm ci # 执行安全检测,结果输出为JSON格式留存报告 - npm audit --audit-level=high --json > gl-dependency-scanning-report.json artifacts: reports: dependency_scanning: gl-dependency-scanning-report.json paths: - gl-dependency-scanning-report.json
--audit-level用于配置触发阻断的最低漏洞等级,可选值为critical/high/moderate/low/none- 示例中配置为
high表示检测到高危、严重漏洞时触发失败;如果需要所有等级漏洞都阻断,将参数值改为low即可
如果需要完全兼容GitLab原生依赖扫描报告格式、在安全面板展示完整数据,可额外安装官方报告转换工具处理输出内容,不影响阻断逻辑。
方案2:保留原有官方analyzer配置,新增报告校验步骤
如果不想替换原有官方分析镜像、需要完全保留原有报告的生成逻辑和格式,可以在原有脚本执行完成后,新增一步校验生成的JSON报告中是否存在漏洞条目,存在则返回非0退出码触发失败,参考配置如下:
dependency-scan: image: "registry.gitlab.com/gitlab-org/security-products/analyzers/npm-audit:1.4.0" stage: security-check variables: TOOL: npm script: # 如执行时提示jq命令不存在,放开下一行注释即可,该镜像基于Alpine制作,用apk包管理器安装jq # - apk add --no-cache jq - /analyzer run # 校验报告中漏洞条目数量,大于0则输出提示并返回非0退出码阻断流水线 - | VULN_COUNT=$(jq '.vulnerabilities | length' gl-dependency-scanning-report.json) if [ "$VULN_COUNT" -gt 0 ]; then echo "检测到${VULN_COUNT}个存在安全风险的问题依赖,流水线阻断" exit 1 fi artifacts: reports: dependency_scanning: gl-dependency-scanning-report.json paths: - gl-dependency-scanning-report.json
补充说明
- 如果需要忽略特定经过评估确认无影响的漏洞,npm 8及以上版本可使用
npm audit resolve命令标记忽略,被忽略的漏洞不会触发非0退出码。 - 上述配置可配合GitLab项目设置中的安全门禁规则一起使用,在合并请求环节额外增加漏洞校验,实现多层管控。
内容的提问来源于stack exchange,提问作者HichamElk
相关产品推荐
相关产品推荐

