在 Docker 容器中构建时进行 Coverity 扫描

Coverity scan while building in Docker container

我有一个自定义的 Docker 容器,我在其中执行项目的构建和测试。它以某种方式与 Travis CI 集成。现在我也想从 Travis CI 中 运行 Coverity 扫描 分析,但棘手的部分是(如果我正确理解 Coverity 文档),我需要 运行 构建。但是,构建 运行 在容器中。

现在,根据 cov-build --help

The cov-build or cov-build-sbox command intercepts all calls to the compiler invoked by the build system and captures source code from the file system.

我尝试过的:
cov-build --dir=./cov docker exec -ti container_name sh -c "<custom build commands>"

然而,使用这种方法,Coverity 显然不会捕获对编译器的调用(考虑到 Docker 哲学,这是完全可以理解的)并且 不发出任何文件

想要的(至少在希望有更好的解决方案的情况下):


Travis CI 部分只是 FWIW,在本地尝试了所有这些,但它也不起作用。

我很高兴能就此问题提出任何建议。谢谢。

如果您愿意调整构建,可以将 "compiler" 更改为 cov-translate <args> --run-compile <original compiler command line>。这实际上是 cov-build 在幕后所做的(减去 run-compile,因为您的编译器已经是 运行),并且应该导致构建捕获。

好的,我差不多解决了这个问题。

  • 我下载并修改了(只是一些修改以适合我的 环境 ) Travis 用来下载的 script 和 运行 Coverity 扫描.

  • 然后我将 Coverity 安装到主机(在我的例子中是 Travis CI 机).

  • 我运行docker容器并挂载了所在目录 Coverity 使用 docker run -dit -v <coverity-dir>:<container-dir>:ro ... 安装。这样我就避免了增加 docker 图片大小。

  • 执行了cov-build命令并使用上传分析 script 的另一部分直接来自 docker 容器。

希望这对遇到类似问题的人有所帮助。

这是我使用的解决方案:

在 "script"、"after_script" 或您想要的 Travis 作业生命周期的其他阶段

  1. 使用 wget 下载 coverity 工具存档(要使用的完整命令可以在您的 coverity 扫描帐户中找到)
  2. 将存档解压到 coverity_tool 目录
  3. 像往常一样启动你的 docker 容器,不需要将 coverity_tool 目录挂载为一个卷(如果你已经在 [=43= 所在的目录中创建了 coverity_tool ] 容器已启动)
  4. 在 docker
  5. 中使用 cov-build 工具构建项目
  6. 将生成的cov-int目录存档
  7. 使用 curl 命令将结果发送到 coverity

步骤 6 在容器内应该是可行的,但我通常在容器外进行。

另外别忘了将COVERITY_SCAN_TOKEN加密导出为环境变量

具体的例子往往比长篇大论更容易理解;这是一个应用上述步骤构建和发送结果到覆盖率扫描的提交:

https://github.com/BoubacarDiene/NetworkService/commit/960d4633d7ec786d471fc62efb85afb5af2bed7c