在 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 哲学,这是完全可以理解的)并且 不发出任何文件
我不想要的(至少在希望有更好的解决方案的情况下):
- 在本地安装在容器中构建所需的所有东西
只能够运行 Coverity 扫描。
从容器内 到 运行 cov-build,因为:
- 我相信这会显着增加 docker 图像大小
- 我使用 Travis CI addon 进行 Coverity 扫描,这会
让事情变得复杂。
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 作业生命周期的其他阶段
- 使用 wget 下载 coverity 工具存档(要使用的完整命令可以在您的 coverity 扫描帐户中找到)
- 将存档解压到 coverity_tool 目录
- 像往常一样启动你的 docker 容器,不需要将 coverity_tool 目录挂载为一个卷(如果你已经在 [=43= 所在的目录中创建了 coverity_tool ] 容器已启动)
- 在 docker
中使用 cov-build 工具构建项目
- 将生成的cov-int目录存档
- 使用 curl 命令将结果发送到 coverity
步骤 6 在容器内应该是可行的,但我通常在容器外进行。
另外别忘了将COVERITY_SCAN_TOKEN加密导出为环境变量
具体的例子往往比长篇大论更容易理解;这是一个应用上述步骤构建和发送结果到覆盖率扫描的提交:
https://github.com/BoubacarDiene/NetworkService/commit/960d4633d7ec786d471fc62efb85afb5af2bed7c
我有一个自定义的 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 哲学,这是完全可以理解的)并且 不发出任何文件
我不想要的(至少在希望有更好的解决方案的情况下):
- 在本地安装在容器中构建所需的所有东西
只能够运行 Coverity 扫描。
到 运行 cov-build,因为:
- 我相信这会显着增加 docker 图像大小
- 我使用 Travis CI addon 进行 Coverity 扫描,这会 让事情变得复杂。
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 作业生命周期的其他阶段
- 使用 wget 下载 coverity 工具存档(要使用的完整命令可以在您的 coverity 扫描帐户中找到)
- 将存档解压到 coverity_tool 目录
- 像往常一样启动你的 docker 容器,不需要将 coverity_tool 目录挂载为一个卷(如果你已经在 [=43= 所在的目录中创建了 coverity_tool ] 容器已启动)
- 在 docker 中使用 cov-build 工具构建项目
- 将生成的cov-int目录存档
- 使用 curl 命令将结果发送到 coverity
步骤 6 在容器内应该是可行的,但我通常在容器外进行。
另外别忘了将COVERITY_SCAN_TOKEN加密导出为环境变量
具体的例子往往比长篇大论更容易理解;这是一个应用上述步骤构建和发送结果到覆盖率扫描的提交:
https://github.com/BoubacarDiene/NetworkService/commit/960d4633d7ec786d471fc62efb85afb5af2bed7c