CMake,C++和Jenkins /持续集成

u12*_*123 11 c++ cmake jenkins

我有一个cmake示例项目,我想在Ubuntu 15.10上运行Jenkins.我安装了:

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

并创建了两个构建步骤:

  1. 运行cmake以生成makefile
  2. 从构建目录运行make all

在此输入图像描述

我工作得很好:

[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
Run Code Online (Sandbox Code Playgroud)

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

目前我的cmake/Jenkins构建将在每次推送; 1)生成makefile,2)构建项目.

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

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

bad*_*err 6

是的,您可以一步完成。

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

我在这篇文章底部的屏幕快照是工作中的CMake步骤(我使用Ninja而不是Unix Makefile,但是效果是相同的)。

我使用两个构建调用:

  • 空白 -相当于调用ninjamake在shell中,
  • 安装 -等同于调用DESTDIR=. ninja install

如果我想从makefile文件中构建其他目标,则可以在此步骤中添加其他调用。

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

您可以删除外壳步骤,您的项目仍将构建。


关于最佳实践和重新生成CMake的问题,我请您参考有关Jenkins最佳实践的这篇文章,其中指出:

为确保内部版本可复制,该内部版本必须是干净的内部版本,完全由Source Code Control构建。这种做法还意味着必须将所有代码(包括第三方jar,构建脚本,发行说明等)检入Source Code Control。

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

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