name: reviewdog description: > 用于CI/CD管道的自动化代码审查和安全检查集成工具。 聚合来自多个安全和质量工具(SAST、linters、格式化工具)的发现结果, 在拉取请求中生成统一的代码审查评论。适用于:(1) 将安全扫描集成到代码审查工作流中,(2) 在拉取请求上自动化安全反馈,(3) 将多个工具输出整合为可操作的审查评论,(4) 在CI/CD管道中强制执行安全编码标准,(5) 在开发过程中提供内联安全注释。 version: 0.1.0 maintainer: asrour category: secsdlc tags: [代码审查, ci-cd, 自动化, 安全反馈, 拉取请求, 代码检查, sast集成] frameworks: [OWASP, CWE] dependencies: tools: [reviewdog, git] optional: [semgrep, bandit, hadolint, checkov, gitleaks, shellcheck, eslint] references:
Reviewdog - 自动化安全代码审查
概述
Reviewdog是一个自动化代码审查工具,它将安全扫描和代码检查结果集成到拉取请求的审查评论中。它充当各种安全工具(SAST扫描器、linters、格式化工具)和代码托管平台(GitHub、GitLab、Bitbucket)之间的通用适配器,从而在代码审查期间实现无缝的安全反馈。
核心能力:
- 聚合来自多个安全和质量工具的发现结果
- 在特定代码行上发布内联审查评论
- 开箱即用支持40多种代码检查器和安全扫描器
- 与GitHub Actions、GitLab CI、CircleCI和其他CI平台集成
- 过滤发现结果,仅显示差异中的新问题(差异失败模式)
- 支持自定义规则集和安全策略
快速开始
使用安全扫描器进行基本的reviewdog操作:
# 安装reviewdog
go install github.com/reviewdog/reviewdog/cmd/reviewdog@latest
# 运行安全扫描器并通过管道传递给reviewdog
bandit -r . -f json | reviewdog -f=bandit -reporter=github-pr-review
# 或与Semgrep一起使用
semgrep --config=auto --json | reviewdog -f=semgrep -reporter=local
GitHub Actions集成:
- name: 运行 reviewdog
uses: reviewdog/action-setup@v1
- name: 使用 reviewdog 进行安全扫描
env:
REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
bandit -r . -f json | reviewdog -f=bandit -reporter=github-pr-review
核心工作流
步骤1:安装 reviewdog
在您的CI环境或本地安装reviewdog:
# 通过Go
go install github.com/reviewdog/reviewdog/cmd/reviewdog@latest
# 通过Homebrew (macOS/Linux)
brew install reviewdog
# 通过Docker
docker pull reviewdog/reviewdog:latest
步骤2:配置安全工具
设置您想要集成的安全扫描器。Reviewdog支持多种输入格式:
支持的安全工具:
- SAST:Semgrep、Bandit、ESLint Security、Brakeman
- 秘密检测:Gitleaks、TruffleHog、detect-secrets
- IaC安全:Checkov、tfsec、terrascan
- 容器安全:Hadolint、Trivy、Dockle
- 通用检查器:ShellCheck、yamllint、markdownlint
步骤3:集成到CI/CD管道中
将reviewdog添加到您的CI管道中,以自动将安全发现结果作为审查评论发布:
GitHub Actions示例:
name: 安全审查
on: [pull_request]
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: 设置 reviewdog
uses: reviewdog/action-setup@v1
- name: 运行 Bandit SAST
env:
REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
pip install bandit
bandit -r . -f json | \
reviewdog -f=bandit \
-name="Bandit SAST" \
-reporter=github-pr-review \
-filter-mode=added \
-fail-on-error
GitLab CI示例:
security_review:
stage: test
script:
- pip install bandit reviewdog
- bandit -r . -f json |
reviewdog -f=bandit
-reporter=gitlab-mr-discussion
-filter-mode=diff_context
only:
- merge_requests
步骤4:配置审查行为
使用标志自定义reviewdog的行为:
# 过滤以仅显示更改行中的问题
reviewdog -filter-mode=diff_context
# 过滤以仅显示新增行中的问题
reviewdog -filter-mode=added
# 如果存在发现结果,则使构建失败
reviewdog -fail-on-error
# 设置严重性阈值
reviewdog -level=warning
步骤5:审查安全发现结果
Reviewdog将发现结果作为内联评论发布在拉取请求上:
- 内联注释:安全问题直接出现在受影响的代码行上
- 严重性指示器:严重、高、中、低严重性级别
- 修复指导:在可用时提供CWE/OWASP参考链接
- 差异感知过滤:仅显示PR中引入的新问题
安全注意事项
-
API令牌安全:将GitHub/GitLab令牌存储在秘密管理系统中(GitHub Secrets、GitLab CI/CD变量)
- 切勿将令牌提交到版本控制
- 使用最低要求的权限(拉取请求的读/写权限)
- 定期轮换令牌
-
访问控制:
- 配置reviewdog仅在受信任的分支上运行
- 使用CODEOWNERS要求安全团队批准reviewdog配置更改
- 限制谁可以修改
.reviewdog.yml配置
-
审计日志:
- 将所有安全发现结果记录到SIEM或安全监控平台
- 跟踪发现结果的引入和解决时间
- 监控被绕过的安全检查
-
合规性:
- 维护安全审查的审计跟踪(SOC2、ISO27001)
- 在代码审查中强制执行安全策略合规性
- 通过CI/CD工件支持合规性报告
-
安全默认值:
- 使用
fail-on-error来阻止存在安全发现结果的PR - 启用
filter-mode=added以捕获新的漏洞 - 配置适合您风险承受能力的严重性阈值
- 使用
捆绑资源
脚本 (scripts/)
setup_reviewdog.py- 自动化的reviewdog安装和CI配置生成器run_security_suite.sh- 通过reviewdog运行多个安全扫描器
参考资料 (references/)
supported_tools.md- 支持的安全工具完整列表及配置示例reporter_formats.md- 可用的输出格式和报告器配置cwe_mapping.md- 常见工具发现结果到CWE类别的映射
资产 (assets/)
github_actions_template.yml- 用于多工具安全扫描的GitHub Actions工作流gitlab_ci_template.yml- 用于reviewdog集成的GitLab CI配置.reviewdog.yml- 示例reviewdog配置文件pre_commit_config.yaml- 预提交钩子集成
常见模式
模式1:多工具安全套件
运行多个安全工具并在单个审查中聚合结果:
#!/bin/bash
# 运行全面的安全扫描
# Python安全
bandit -r . -f json | reviewdog -f=bandit -name="Python SAST" -reporter=github-pr-review &
# 秘密检测
gitleaks detect --report-format json | reviewdog -f=gitleaks -name="秘密扫描" -reporter=github-pr-review &
# IaC安全
checkov -d . -o json | reviewdog -f=checkov -name="IaC安全" -reporter=github-pr-review &
wait
模式2:基于严重性的门控
根据严重性阈值阻止PR:
- name: 严重发现 - 阻止PR
run: |
semgrep --config=p/security-audit --severity=ERROR --json | \
reviewdog -f=semgrep -level=error -fail-on-error -reporter=github-pr-review
- name: 中等发现 - 仅评论
run: |
semgrep --config=p/security-audit --severity=WARNING --json | \
reviewdog -f=semgrep -level=warning -reporter=github-pr-review
模式3:差异安全扫描
仅标记当前PR中引入的新安全问题:
# 仅显示新增代码中的发现结果
reviewdog -filter-mode=added -fail-on-error
# 显示修改上下文中的发现结果(新增行 + 周围行)
reviewdog -filter-mode=diff_context
模式4:自定义安全规则
使用grep或自定义解析器集成自定义安全策略:
# 检查禁止的模式
grep -nH -R "eval(" . --include="*.py" | \
reviewdog -f=grep -name="危险函数" -reporter=github-pr-review
# 自定义JSON解析器
./custom_security_scanner.py --json | \
reviewdog -f=rdjson -name="自定义策略" -reporter=github-pr-review
集成点
-
CI/CD平台:
- GitHub Actions(提供原生操作)
- GitLab CI/CD
- CircleCI
- Jenkins
- Azure Pipelines
- Bitbucket Pipelines
-
安全工具:
- SAST:Semgrep、Bandit、ESLint、Brakeman、CodeQL
- 秘密:Gitleaks、TruffleHog、detect-secrets
- IaC:Checkov、tfsec、terrascan、kics
- 容器:Hadolint、Trivy、Dockle
-
代码托管:
- GitHub(PR评论、检查运行、注释)
- GitLab(MR讨论)
- Bitbucket(内联评论)
- Gerrit(审查评论)
-
SDLC集成:
- 预提交钩子:推送前的快速本地反馈
- PR/MR审查:代码更改的自动化安全审查
- 主干保护:阻止存在安全发现结果的合并
- 安全仪表板:聚合发现结果以提高可见性
故障排除
问题:Reviewdog未发布评论
解决方案:
- 验证GitHub令牌是否具有正确的权限(私有仓库的
repo范围,公共仓库的public_repo) - 检查CI环境是否设置了
REVIEWDOG_GITHUB_API_TOKEN或GITHUB_TOKEN - 确保仓库设置允许来自工作流的PR评论
- 验证reviewdog是否在PR上下文中运行(而不是在推送到主分支时)
问题:误报太多
解决方案:
- 使用
filter-mode=added仅显示新问题 - 在
.reviewdog.yml中配置特定工具的抑制规则 - 使用
-level标志调整严重性阈值 - 使用基线文件忽略现有问题
问题:大型仓库的性能问题
解决方案:
- 使用
filter-mode=diff_context仅在更改的文件上运行reviewdog - 在CI中缓存工具依赖项和数据库
- 在计划作业上运行昂贵的扫描器,在PR上运行轻量级的扫描器
- 对多个工具使用并行执行
问题:与自定义安全工具的集成
解决方案:
- 将工具输出转换为支持的格式(checkstyle、sarif、rdjson、rdjsonl)
- 对于遵循reviewdog诊断格式的自定义JSON输出,使用
-f=rdjson - 为基于文本的输出创建errorformat模式
- 有关格式规范,请参阅
references/reporter_formats.md
高级配置
自定义reviewdog配置 (.reviewdog.yml)
runner:
bandit:
cmd: bandit -r . -f json
format: bandit
name: Python安全
level: warning
semgrep:
cmd: semgrep --config=auto --json
format: semgrep
name: 多语言SAST
level: error
gitleaks:
cmd: gitleaks detect --report-format json
format: gitleaks
name: 秘密检测
level: error
与安全框架集成
将发现结果映射到OWASP Top 10和CWE:
# 使用OWASP规则集的Semgrep
semgrep --config "p/owasp-top-ten" --json | \
reviewdog -f=semgrep -name="OWASP Top 10" -reporter=github-pr-review
# 在评论中包含CWE引用
reviewdog -f=semgrep -name="CWE分析" -reporter=github-pr-review