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

And*_*urg 10 windows cmake jenkins

我怎样才能让Jenkins做到以下几点?

Checkout trunk /来自SVN,然后使用CMake构建配置Debug和Release,而不需要配置的重复作业.

And*_*urg 9

我花了一段时间才弄明白这一点.这就是我设法做到的方式.

  1. 创建一个自由风格的工作"结帐".这项工作将完成所有不依赖于配置类型(调试/发布)的东西.
  2. 在"源代码管理"下,选择Subversion
  3. 填写存储库URL.可能是一个好主意,使它指向/ trunk.
  4. 将本地模块目录设置为"." (没有报价)
  5. 签出策略"模拟清洁"很好
  6. 构建触发器轮询SCM,将Schedule设置为"5****"以每5分钟检查一次.
  7. 现在在Advanced Project Options下,选中'Use custom workspace'并将dir设置为例如"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
    
    Run Code Online (Sandbox Code Playgroud)
  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%
    
    Run Code Online (Sandbox Code Playgroud)

如果要构建整个解决方案,请指定.sln文件而不是ALL_BUILD.vcxproj.如果您只想构建特定项目,请使用

    msbuild <solution>.sln /target:<project>
Run Code Online (Sandbox Code Playgroud)


mal*_*cot 8

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


And*_*urg 2

使用 Jenkins 一段时间后,我发现如果你想重用源目录,你应该使用尽可能少的作业。

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

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

假设作业“SVN update”触发作业“Build”。有人启动“SVN update #33”,这应该会触发“Build #33”。然而,如果 Jenkins 的“Poll SCM”功能同时安排“SVN update”#34,我还没有找到一种方法来告诉它“Build #33”必须在“SVN update #34”之前运行。因此,您最终可能会在“Build #33”之前运行“SVN update #34”,并且一切都会失败。除非您手动禁用轮询作业。当然,并提醒自己事后重新启用它。

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