2016-02-27 313 views
7

我有一个cmake示例项目,我想在运行在Ubuntu 15.10上的Jenkins上构建。我已经安装:CMake,C++和Jenkins /持续集成

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

而且创造了两个构建步骤:

  1. 运行cmake生成的生成文件
  2. 运行让所有从build目录

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 /詹金斯设置使用cmake建议的方法?

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

我有点担心,第一步骤1)生成Makefile会吃了建造时间和它并没有真正似乎最佳做每个推此步骤。特别是因为我不希望更改文件CMakeLists.txt,但是当它们更改新生成的文件时当然应该使用。

的是,我只是习惯或有我错过了什么上面的方法常见的做法?

+0

是否“生成生成文件”采取足够的时间去担心?虽然它可能不会经常变化,但是在发生变化时单独采取措施或搞乱构建真的不是一个好的解决方案...... –

+0

是的,这也是我关心的问题,安全性高于抱歉,解决方案是使当它增长时,肯定会将我的应用程序分解成更小的更快的部分。回顾上面的两个构建步骤,1)cmake/generate,2)运行make all是否有作为代码生成步骤的一部分来做到这一点?还是他们是完全独立的,应该像这样对待? – u123

+0

我不太清楚你在问什么。我的态度总的来说就是“采用足以解决当前问题的最简单的解决方案”,而不是让事情复杂化,直到你确实有充分的理由。我在我的Jenkins系统上运行了三个不同的工作(在家中):“使用g ++编译+运行所有测试”,“使用g ++编译+运行所有测试” - 每15分钟检查git仓库中的新提交,是下载LLVM的版本和我的代码,并基于项目中的构建脚本一起构建它 - 每晚一次。 –

回答

0

我甚至不确定你需要这个插件。 AFAIR插件网页只有在你想让jenkins使用特定的cmake版本时才有用,或者你需要一个GUI来为你设置cmake变量。我只是从命令行执行cmake。

为了您的问题的第二部分,如果更改的CMakeLists.txt,Makefile文件会自动重新运行cmake的,所以严格来说,它没有必要运行cmake各一次。但另一方面,cmake的配置速度相当快,而且很可能比编译需要更少的时间。

2

是的,你可以一步到位。

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

我在这个岗位的底部截图是在工作中(我用的忍者,而不是Unix的Makefile文件,但效果是一样的)一个CMake的步骤。

我用两个构建调用:

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

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

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

你可以删除你的shell步骤,你的项目仍然会生成。


关于最佳实践和再生CMake的你的问题,我是指你这篇文章Jenkins Best Practices它指出:

为了确保构建可重复性,构建必须是干净的构建,它完全由源代码控制构建。这种做法也意味着必须将所有代码(包括第三方jar,构建脚本,发行说明等)签入源代码管理。

请注意,我还检查了我的CMake步骤中的“Clean Build”,以便整个CMake工作区都被清除,并且每个构建都从头开始生成项目。这将确保没有造成陈旧缓存变量的问题,等等。在我工作的一个CMake的步骤

截图: Jenkins/CMake config