在Docker容器中构建时的Coverity扫描

时间:2017-11-03 07:50:52

标签: docker static-analysis coverity

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

现在,根据cov-build --help

  

cov-build或cov-build-sbox命令拦截对该的所有调用   编译器调用的编译器,并从中捕获源代码   文件系统。

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

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

想要什么(至少在希望有更好的解决方案时):

  • 在本地安装在容器中构建的所有必要内容 只能运行Coverity扫描。
  • 从容器内运行cov-build,因为:

    • 我认为这会显着增加码头图像尺寸
    • 我使用Travis CI addon 进行Coverity扫描,这样就可以了 使事情复杂化。


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

我对这个问题的任何建议感到非常兴奋。谢谢。

3 个答案:

答案 0 :(得分:1)

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

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

  • 然后我将Coverity安装到主机上(在我的案例中是Travis CI机器。)

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

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

希望这有助于某些人遇到类似问题。

答案 1 :(得分:0)

如果您可以调整构建,可以更改编译器&#34;是/var/www/html/。这实际上是cov-translate <args> --run-compile <original compiler command line>在引擎盖下做的事情(减去cov-build,因为你的编译器已在运行),并且应该导致构建捕获。

答案 2 :(得分:0)

这是我使用的解决方案:

在“脚本”,“ after_script”或所需的Travis作业生命周期的另一个阶段中

  1. 使用wget下载Coverity工具档案(要使用的完整命令可在Coverity扫描帐户中找到)
  2. 将存档解压缩到Coverity_tool目录
  3. 像往常一样启动Docker容器,而无需将Coverity_tool目录作为卷挂载(如果您已在启动Docker容器的目录内创建了Coverity_tool)
  4. 在docker内部使用cov-build工具构建项目
  5. 存档生成的cov-int目录
  6. 使用curl命令将结果发送到Coverity

第6步应该在容器内可行,但我通常在外部进行。

也不要忘记将COVERITY_SCAN_TOKEN加密并作为环境变量导出。

一个具体的例子通常比一长篇文章更容易理解;这是适用于以上步骤的提交,用于生成结果并将其发送到Coverity Scan:

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