使用 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 以了解操作方法。
分步配置 #
-
如果您尚未使用 GitHub 帐户注册 Coverity Scan,请 注册。
-
如有必要,请在 GitHub 上为您的项目创建一个公共仓库。
-
登录 Scan,然后添加您的项目。确保将其添加为 GitHub 项目。
-
(可选)首次在项目中使用 Coverity Scan 时,您可能希望在自己的开发机器上进行构建,以确保一切正常完成。这步是可选的,但它将简化任何必要的调试。请咨询 Coverity Scan 下载页面 以获取说明。
-
从 Coverity Scan 仪表板中,单击
项目设置
。然后,在右侧,单击提交构建
按钮。 -
假设该项目通过 GitHub 正确注册,您将看到一个名为
配置 Travis CI
的选项卡。访问该面板。 -
在 Travis CI 配置页面上,您将看到一个示例
.travis-yml
文件。它将自动生成一些必要的项目特定字段,包括加密的 Coverity Scan 令牌(用于上传结果)。将配置从那里复制到您的.travis.yml
文件中,并按照以下步骤进行更改。 -
使用任何必要的配置命令填充
build_command_prepend
,以准备您的项目进行构建。例如build_command_prepend: ./configure
-
使用构建项目的命令填充
build_command
。这将作为参数传递给cov-build
命令。例如:build_command: make
-
将这些更改提交到
coverity_scan
分支。 -
将
coverity_scan
分支推送到 GitHub。等待片刻,让 Travis CI 查看提交,并开始构建。 -
直接访问 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
中的相应配置值
COVERITY_SCAN_NOTIFICATION_EMAIL
COVERITY_SCAN_BUILD_COMMAND
COVERITY_SCAN_BUILD_COMMAND_PREPEND
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 构建命令。