我怎样才能让詹金斯做以下事情?
从 SVN 签出trunk/,然后使用 CMake 构建配置调试和发布,而无需为配置重复作业。
我花了一段时间才弄清楚这一点。这是我设法做到的。
在 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
创建另一个作业“构建”,这次将其设为“多配置”作业。该作业将为每个配置(调试/发布)运行。
现在在配置矩阵下添加一个轴“配置”,其值为“调试版本”(空格 = 分隔符)。不幸的是,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>
使用Jenkins 矩阵作业。将轴之一定义为build_mode,其值为Debug和Release。然后您运行 CMake,它将为您将使用的编译工具(XCode、gcc、VisualStudio 等)创建两种配置。然后,您可以像使用环境变量一样使用build_mode,并将其传递给执行实际编译的构建步骤。
使用 Visual Studio 生成器时,您可以将要构建的配置传递给 -cmake --build
命令:
cmake --build . --config Release
cmake --build . --config Debug
另请参阅CMake 文档。
使用 Jenkins 一段时间后,我发现如果要重用源目录,应该尽可能少使用作业。
Jenkins 中的默认设置是每个构建使用不同的目录作为其工作区。这意味着您每次构建都要进行完整的 SVN 检出。这需要永远。
如果您想为每个构建使用相同的源目录,则必须担心同步:一次只能构建一个。据我所知,Jenkins 没有内置的同步方式。唯一的方法是只使用一个执行器。即使这样,您也无法控制执行者选择下一个工作的方式。
假设作业“SVN 更新”触发作业“构建”。有人启动“SVN update #33”,这应该会触发“Build #33”。但是,如果 Jenkins 的“轮询 SCM”功能同时安排“SVN 更新”#34,我还没有找到一种方法来告诉它“构建 #33”必须在“SVN 更新 #34”之前运行。所以你可能会在“Build #33”之前运行“SVN update #34”,一切都失败了。除非您手动禁用轮询作业。当然,提醒自己事后重新启用它。
无论如何。在使用 Jenkins 两年后,我将答案更改为:永远不要使用共享资源的多个作业(如源目录),并将所有逻辑烘焙到 shell 脚本中(用于循环配置)。