Jenkins + Windows + CMake +多种构建类型(调试,发布)

时间:2012-05-23 10:27:23

标签: windows jenkins cmake

我如何让詹金斯做以下事情?

签出中继/来自SVN,然后使用CMake构建配置Debug和Release,而不需要配置的重复作业。

4 个答案:

答案 0 :(得分:9)

我花了一些时间来弄明白这一点。这就是我设法做到的方式。

  1. 创建一个自由式作业“Checkout”。这项工作将完成所有不依赖于配置类型(调试/发布)的东西。
  2. 在“源代码管理”下选择Subversion
  3. 填写存储库网址。将它指向/ trunk可能是一个好主意。
  4. 将本地模块目录设置为“。” (没有引号)
  5. 作为退房策略“Emulate clean”很不错
  6. 构建触发器轮询SCM,将Schedule设置为“5 * * * *”,每5分钟检查一次。
  7. 现在,在“高级项目选项”下,选中“使用自定义工作区”并将目录设置为例如“C:/ SRC”。我们不希望Jenkins使用其内部工作区,因为我们希望其他作业能够访问源。
  8. 在Build下添加以下Windows批处理命令,该命令用于清除构建目录。出于某种原因,CMake没有提供这样做的方法。

    cd c:\
    rmdir /S /Q build
    mkdir build
    cd build
    
    cmake --version
    rem optionally: svn info c:\src
    cmake -G "Visual Studio 10" c:\src
    
  9. 创建另一个作业“Build”,这次使其成为“多配置”作业。这项工作将针对每个配置运行(调试/发布)。

  10. 首先,将构建触发器设置为在作业“Checkout”之后构建
  11. 现在在Configuration Matrix下添加一个“配置”轴,其值为“Debug Release”(空格=分隔符)。不幸的是,Jenkins的CMake构建器插件不适用于多配置作业。我们甚至不能使用cmake --build,因为它总是构建Debug配置。要构建,我们必须使用另一个批处理脚本:

    cd c:\build
    call "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
    msbuild ALL_BUILD.vcxproj /verbosity:minimal /maxcpucount:1 /property:Configuration=%configuration%
    
  12. 如果要构建整个解决方案,请指定.sln文件而不是ALL_BUILD.vcxproj。如果您只想构建特定项目,请使用

        msbuild <solution>.sln /target:<project>
    

答案 1 :(得分:8)

使用Jenkins Matrix job。将其中一个轴定义为 build_mode ,其值为 Debug Release 。然后运行CMake,它将为您将使用的编译工具(XCode,gcc,VisualStudio等)创建两种配置。然后,您可以将 build_mode 用作环境变量,并将其传递给构建实际编译的步骤。

答案 2 :(得分:3)

使用Visual Studio生成器时,您可以将配置传递给cmake --build - 命令:

cmake --build . --config Release
cmake --build . --config Debug

另请参阅CMake docs

答案 3 :(得分:1)

在使用Jenkins一段时间之后,我发现如果你想重用源目录,你应该尽可能少地使用它。

Jenkins中的默认设置是每个构建使用不同的目录作为其工作区。这意味着您在每次构建时都会执行完整的SVN检查。这需要永远。

如果要为每个构建使用相同的源目录,则必须担心同步:一次只能构建一个构建。据我所知,Jenkins没有内置的同步方法。唯一的方法是只使用一个执行器。即使这样,你也无法控制执行者选择下一份工作的方式。

让我们说工作&#34; SVN更新&#34;触发工作&#34; Build&#34;。有人开始&#34; SVN更新#33&#34;,它应该触发&#34; Build#33&#34;。但是,如果詹金斯&#39; &#34;民意调查SCM&#34;功能时间表&#34; SVN更新&#34; #34在此期间,我还没有办法告诉它#34; Build#33&#34;必须在&#34; SVN更新#34&#34;之前运行。所以你最终可能会得到#34; SVN更新#34&#34;在#34; Build#33&#34;之前运行,一切都失败了。除非您手动禁用轮询作业。当然,提醒自己重新启用它。

反正。使用Jenkins两年后,我将答案改为:永远不要使用共享资源的多个作业(如源目录),并将所有逻辑烘焙到shell脚本中(用于循环配置)。