10

我怎样才能让詹金斯做以下事情?

从 SVN 签出trunk/,然后使用 CMake 构建配置调试和发布,而无需为配置重复作业。

4

4 回答 4

10

我花了一段时间才弄清楚这一点。这是我设法做到的。

  1. 创建一个自由式的工作“结帐”。这项工作将完成所有不依赖于配置类型(调试/发布)的事情。
  2. 在“源代码管理”下选择 Subversion
  3. 填写存储库 URL。让它指向 /trunk 可能是个好主意。
  4. 将本地模块目录设置为“。” (没有引号)
  5. 结帐策略“模拟干净”很好
  6. 构建触发器轮询单片机,将计划设置为“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. 创建另一个作业“构建”,这次将其设为“多配置”作业。该作业将为每个配置(调试/发布)运行。

  10. 首先,将构建触发器设置为在作业“结帐”之后构建
  11. 现在在配置矩阵下添加一个轴“配置”,其值为“调试版本”(空格 = 分隔符)。不幸的是,Jenkins 的 CMake builder 插件不适用于多配置作业。我们甚至不能使用 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%
    

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

    msbuild <solution>.sln /target:<project>
于 2012-05-24T08:48:41.920 回答
9

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

于 2012-05-23T11:10:04.807 回答
3

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

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

另请参阅CMake 文档

于 2014-06-26T05:10:14.137 回答
1

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

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

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

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

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

于 2014-05-06T14:04:51.040 回答