gpt4 book ai didi

c++ - CMake、C++ 和 Jenkins/持续集成

转载 作者:可可西里 更新时间:2023-11-01 15:22:52 28 4
gpt4 key购买 nike

我有一个 CMake 示例项目,我想在 Ubuntu 15.10 上运行的 Jenkins 上构建它。我已经安装:

https://wiki.jenkins-ci.org/display/JENKINS/CMake+Plugin

并创建了两个构建步骤:

  1. 运行 CMake 生成 makefile
  2. 从构建目录运行ma​​ke all

enter image description here

它工作正常:

[build] $ cmake -G "Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug /var/lib/jenkins/workspace/cmake-test/cmake-gtest/src
-- Configuring done
-- Generating done
-- Build files have been written to: /var/lib/jenkins/workspace/cmake-test/cmake-gtest/build
[build] $ /usr/bin/make
[ 4%] Built target libfoo
[ 9%] Built target libbar
[ 14%] Built target myApp
[ 52%] Built target gmock
[ 90%] Built target gtest
[100%] Built target testfoo
[cmake-test] $ /bin/sh -xe /tmp/hudson1792271459427590561.sh
+ cd cmake-gtest/build
+ make all
[ 4%] Built target libfoo
[ 9%] Built target libbar
[ 14%] Built target myApp
[ 52%] Built target gmock
[ 90%] Built target gtest
[100%] Built target testfoo
Finished: SUCCESS

但这是在 CI/Jenkins 设置中使用 CMake 的推荐方法吗?

目前,我的 CMake/Jenkins 构建将在每次推送时进行; 1) 生成 makefile,2) 构建项目。

我有点担心第一步 1) 生成 makefile 会耗尽构建时间,而且在每次推送时执行此步骤似乎并不是最佳选择。特别是因为我不希望经常更改 CMakeLists.txt 文件,但是当它们更改时,当然应该使用新生成的文件。

上述方法是我必须习惯的常见做法还是我错过了什么?

最佳答案

是的,您可以一步完成。

例如,在我的 Jenkins 环境中,在构建 Ubuntu 作业时,我使用 CMake 插件进行整个编译,因为它允许调用多个构建工具。

我在这篇文章底部的屏幕截图是作业中的 CMake 步骤(我使用 Ninja 而不是 Unix Makefile,但效果是一样的)。

我使用了两个构建调用:

  • 空白 - 相当于在 shell 中调用 ninjamake
  • 安装 - 相当于调用 DESTDIR=。忍者安装

如果我想从 makefile 构建额外的目标,我可以向这一步添加额外的调用。

请注意,在您的屏幕截图中,您在配置中有一个空白调用。这将已经调用 make,并且正如您的日志输出所确认的那样,您实际上正在编译您的项目两次,因为您在以下步骤中手动调用了 make all .

您可以删除 shell 步骤,您的项目仍会构建。


关于您关于最佳实践和重新生成 CMake 的问题,请参阅 Jenkins Best Practices 上的这篇文章它指出:

To ensure a build can be reproducible, the build must be a clean build, which is built fully from Source Code Control. This practice also implies that all code including third-party jars, build scripts, release notes, etc. must be checked into Source Code Control.

请注意,我还在我的 CMake 步骤中选中了“Clean Build”,这样整个 CMake 工作区就会被清除,并且项目是从头开始为每个构建生成的。这可确保不会出现由过时的缓存变量等引起的问题。

我的一项工作中的 CMake 步骤的屏幕截图: Jenkins/CMake config

关于c++ - CMake、C++ 和 Jenkins/持续集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35672472/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com