审查狗 reviewdog

Reviewdog(审查狗)是一款自动化代码审查与安全扫描集成工具,专为CI/CD管道设计。它能聚合多种静态应用安全测试(SAST)、代码检查器(Linter)和格式化工具的输出,并将发现的安全漏洞、代码质量问题以统一的评论形式自动发布到GitHub、GitLab等平台的拉取请求(Pull Request)中。该工具支持40多种安全扫描器(如Semgrep、Bandit、Gitleaks、Checkov),可实现差异扫描(仅关注新增代码)、严重性分级门控,并能与GitHub Actions、GitLab CI等主流CI/CD平台无缝集成,是提升DevSecOps流程效率、在代码审查阶段前置安全左移的关键技能。

DevOps 0 次安装 0 次浏览 更新于 3/1/2026

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_TOKENGITHUB_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

参考资料