使用 Coverity Scan 与 Travis CI

Coverity Scan 是一款适用于 Java、C、C++ 和 C# 的免费静态代码分析工具。它分析每行代码和潜在的执行路径,并生成潜在代码缺陷列表。通过将 Coverity Scan 添加到您的 CI 流程,您将获得更深入的代码质量洞察,超出了您的自动化测试范围。

此附加组件利用 Travis CI 基础设施,在您的 GitHub 项目上自动运行代码分析。

什么是静态分析? #

静态分析是一组用于查找源代码缺陷和漏洞的流程。

在静态分析中,不会执行正在检查的代码。因此,不需要测试用例和专门设计的输入数据集。对缺陷和漏洞的检查不仅限于在代码执行若干次期间运行的代码行,还可以包括代码库中的所有代码行。

此外,Coverity 静态分析的实现可以遵循源代码中的所有可能的执行路径(包括跨过程的路径),并查找由彼此独立不构成错误的语句的组合引起的缺陷和漏洞。

常见问题解答 中查看有关 Coverity Scan 的更多详细信息。

构建提交频率 #

对项目的每次提交都运行静态分析可能有点过分。为了使更多项目能够使用免费服务,附加组件在设计时默认以每个分支为基础运行分析。我们建议您创建一个名为 coverity_scan 的分支,您可以在想要触发分析时将其合并到该分支中。有关构建提交频率的信息,请查看 常见问题解答

macOS 支持 #

Coverity Scan 附加组件不适用于启用了 SIP 功能的 macOS 版本,例如 macOS El Capitan (10.11) 及更高版本。具体而言,在 Travis CI 上,它目前仅在我们的 Xcode 6.4 映像上运行(即使用 osx_image: xcode6.4)。但是,可以通过自定义脚本或命令使其在其他版本上运行。请联系 support@travis-ci.com 以了解操作方法。

分步配置 #

  1. 如果您尚未使用 GitHub 帐户注册 Coverity Scan,请 注册

  2. 如有必要,请在 GitHub 上为您的项目创建一个公共仓库。

  3. 如有必要,请注册 Travis CI 并按照 入门教程 指南配置您的项目。

  4. 登录 Scan,然后添加您的项目。确保将其添加为 GitHub 项目

  5. (可选)首次在项目中使用 Coverity Scan 时,您可能希望在自己的开发机器上进行构建,以确保一切正常完成。这步是可选的,但它将简化任何必要的调试。请咨询 Coverity Scan 下载页面 以获取说明。

  6. 从 Coverity Scan 仪表板中,单击 项目设置。然后,在右侧,单击 提交构建 按钮。

  7. 假设该项目通过 GitHub 正确注册,您将看到一个名为 配置 Travis CI 的选项卡。访问该面板。

  8. 在 Travis CI 配置页面上,您将看到一个示例 .travis-yml 文件。它将自动生成一些必要的项目特定字段,包括加密的 Coverity Scan 令牌(用于上传结果)。将配置从那里复制到您的 .travis.yml 文件中,并按照以下步骤进行更改。

  9. 使用任何必要的配置命令填充 build_command_prepend,以准备您的项目进行构建。例如 build_command_prepend: ./configure

  10. 使用构建项目的命令填充 build_command。这将作为参数传递给 cov-build 命令。例如:build_command: make

  11. 将这些更改提交到 coverity_scan 分支。

  12. coverity_scan 分支推送到 GitHub。等待片刻,让 Travis CI 查看提交,并开始构建。

  13. 直接访问 Travis CI,或者单击 项目设置 页面上的按钮(在项目在 Travis CI 上激活后将显示该按钮)。

travis.yml #

在 Coverity Scan 上的项目页面上,选择 Travis CI 选项卡。您将看到一段 YAML 片段,需要将其复制到您的 .travis-ci 文件中。请注意,这是一个示例,可能需要进行一些调整才能使构建正常运行。

env:
  global:
    # COVERITY_SCAN_TOKEN
    # ** specific to your project **
    - secure: "xxxx"

addons:
  coverity_scan:

    # GitHub project metadata
    # ** specific to your project **
    project:
      name: my_github/my_project
      version: 1.0
      description: My Project

    # Where email notification of build analysis results will be sent
    notification_email: scan_notifications@example.com

    # Commands to prepare for build_command
    # ** likely specific to your build **
    build_command_prepend: ./configure

    # The command that will be added as an argument to "cov-build" to compile your project for analysis,
    # ** likely specific to your build **
    build_command: make

    # Pattern to match selecting branches that will run analysis. We recommend leaving this set to 'coverity_scan'.
    # Take care in resource usage, and consider the build frequency allowances per
    #   https://scan.coverity.com/faq#frequency
    branch_pattern: coverity_scan

项目设置应该是不言自明的,应该与 Coverity Scan 上的项目配置值相匹配。 branch_pattern 是您想要运行 Coverity Scan 的分支的正则表达式。在启用其他分支之前,请查看 常见问题解答 中有关构建提交限制的信息。我们建议将其保留为 coverity_scan

COVERITY_SCAN_TOKEN 是加密的,可以通过 Travis CI CLI 获取。Coverity Scan 在您的项目的 Travis CI 选项卡上提供了此信息以方便起见,但您也可以手动运行它(有关加密的更多信息,请查看 加密密钥)。

gem install travis
cd my_project
travis encrypt COVERITY_SCAN_TOKEN=project_token_from_coverity_scan

然后,如 YAML 示例所示,复制生成的代码行。

环境变量 #

定义后,以下环境变量将覆盖 .travis.yml 中的相应配置值

  1. COVERITY_SCAN_NOTIFICATION_EMAIL
  2. COVERITY_SCAN_BUILD_COMMAND
  3. COVERITY_SCAN_BUILD_COMMAND_PREPEND
  4. COVERITY_SCAN_BRANCH_PATTERN

执行 #

下次您提交到适当的分支时,Coverity Scan 构建过程将自动运行分析并上传结果。请注意,此分析将取代正常的 CI 运行。您应该将相同的更改合并到另一个分支以运行您的测试。

禁用后续测试运行 #

由于 Travis CI 附加组件的工作方式,您的标准脚本阶段(即您的测试)将在 Coverity Scan 分析完成后运行。为了避免这种情况,您可以修改 .travis.yml 中的 script 指令。

当 Coverity Scan 附加组件在运行时, COVERITY_SCAN_BRANCH 环境变量将被设置为 1。因此,您可以将脚本从

script: make

更改为

script: if [ ${COVERITY_SCAN_BRANCH} != 1 ]; then make ; fi

确保将 make 替换为您的标准 CI 构建命令。