【问题标题】:migrating CMake results in multi-stage Docker build迁移 CMake 导致多阶段 Docker 构建
【发布时间】:2018-04-19 14:28:50
【问题描述】:

我有一个基于 CMake 的 C++ 项目,我需要将它集成到 CI/CD 管道中。管道有两个步骤,一个用于构建,另一个用于测试。在 Docker 容器中创建这个环境就像一个魅力,但会产生一个 2GB 的容器。所以我正在尝试实现一个多阶段的 Docker 构建,我将可执行文件复制到一个 Alpine 基础映像中。除了 cmake/ctest 功能外,所有这些都有效。我想公开将执行 CMake 生成目标的命令“make test”。

这是 CMake 为运行 ctest 创建的目标。

# Targets provided globally by CMake.

# Special rule for the target test
test:
        @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..."
        /usr/bin/ctest --force-new-ctest-process $(ARGS)
.PHONY : test

我想不通的问题是 ctest 从哪里获取测试配置。当我发出

ctest -N

在容器中它没有显示任何测试。

寻找 CMake 的 SME 来指导我这应该如何工作。

【问题讨论】:

  • ARGS 应该是 CMake 生成的同一个 Makefile 中的一个变量
  • 不幸的是,情况似乎并非如此。
  • 我在this answer 中找到了一个引用,即ARGS 旨在将选项从命令行传递给ctest,与ARGS='your ctest options here' 一样
  • 嗯,看来我的问题不是 ARGS 问题。我不需要将参数传递给 ctest,我需要将测试配置传递给 ctest。现在,ctest -N 显示了 0 个测试。我需要编辑问题。
  • 我想你的 CMakeLists.txt 中有正确的 add_test()

标签: c++ cmake ctest docker-multi-stage-build


【解决方案1】:

好的,我在容器中跟踪 ctest 并发现它正在每个具有测试可执行文件的目录中寻找 CTestTestfile.cmake 文件。将该文件与可执行文件一起添加到部署容器中,基本上是在构建容器中找到该文件的位置,可以解决问题。

在构建树的根目录下有一个 CTestTestfile.cmake,然后是单独的 CTestTestfile.cmake 文件以及测试可执行文件。

strace 是你的朋友,虽然我不得不学习 docker 的新技巧,因为 strace 是特权。这是我用来 strace ctest 的命令

docker run --rm --security-opt seccomp:unconfined strace ctest -N

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 2022-11-25
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2023-03-18
    相关资源
    最近更新 更多