【问题标题】:Coverity scan while building in Docker container在 Docker 容器中构建时的覆盖率扫描
【发布时间】:2017-11-03 07:50:51
【问题描述】:

我有一个自定义 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,因为:

    • 我相信这会显着增加 docker 映像的大小
    • 我使用 Travis CI addon 进行 Coverity 扫描,这将 把事情复杂化了很多。


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

我很高兴有任何关于这个问题的建议。谢谢。

【问题讨论】:

    标签: docker static-analysis coverity


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您好,感谢您的评论。我使用命令 cov-translate --dir=./cov docker exec -ti container sh -c "<build commands>" 进行了尝试。但是在构建之后,我最终得到了translate_and_emit: [ERROR] No compiler settings found for docker
      • cov-translate 需要像编译器本身一样使用。看起来您正在尝试使用它,就好像它是 cov-build。也许尝试在您的评论中的命令行上使用cov-build
      • 您能说得更具体些吗?如果您的意思是在命令前面直接添加 cov-build 并使用整个 cov-translate 作为构建命令,它也不起作用。此外, --help 根本没有帮助。
      • 我猜你只能将编译器翻译成受支持的编译器,因此列在cov-configure --list-compiler-types
      • 好的,我以某种方式解决了它。我将在这里的答案中写下我的方法。感谢您的帮助。
      【解决方案3】:

      这是我使用的解决方案:

      在 "script"、"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 加密并导出为环境变量。

      一个具体的例子通常比长篇文章更容易理解;这是一个应用上述步骤来构建并将结果发送到覆盖率扫描的提交:

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

      【讨论】:

        猜你喜欢
        • 2016-04-14
        • 2017-03-11
        • 1970-01-01
        • 2018-10-09
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        • 2022-11-08
        • 1970-01-01
        相关资源
        最近更新 更多