我们已经实现了一个 Post Commit Hook,它开始了我们在 Jenkins 上的工作。我们的灵感是这样的:SVN post-commit 和 Jenkins 的麻烦
它按预期工作,我们已将每个作业的轮询设置为空白,如 Yossi 所述。
我现在的问题是:当 Jenkins 服务器宕机时你会怎么做?无论如何都接受了提交,但是由于 Jenkins 服务器已关闭,因此作业未启动...您如何确保在服务器再次启动时启动作业?
我们已经实现了一个 Post Commit Hook,它开始了我们在 Jenkins 上的工作。我们的灵感是这样的:SVN post-commit 和 Jenkins 的麻烦
它按预期工作,我们已将每个作业的轮询设置为空白,如 Yossi 所述。
我现在的问题是:当 Jenkins 服务器宕机时你会怎么做?无论如何都接受了提交,但是由于 Jenkins 服务器已关闭,因此作业未启动...您如何确保在服务器再次启动时启动作业?
我们对该问题的解决方案:
我们没有让 post-commit 挂钩直接调用 jenkins 服务器,而是调用我们的中央质量应用程序(控制我们所有的 Jenkins 服务器、作业等)。然后,此应用程序将构建推送到相应的 Jenkins 服务器上。如果 Jenkins 服务器关闭 - 应用程序稍后再试。
Jenkins 将轮询您的源存储库,每分钟一次,以查看是否需要构建某些内容。
当我们使用 CVS 时,我使用了提交后挂钩来强制 Subversion 构建,因为轮询 CVS 存储库以查看是否发生了更改是一项很长的、处理器密集型的活动。如果您在 Jenkins 中使用 CVS 执行十几个或更多项目,您将减慢 Jenkins 和您的 CVS 存储库的速度。使用提交后触发器是唯一的方法。然而,我们遇到的一个问题是,如果 Jenkins 宕机了,它就不会执行缺失的构建。
当我们迁移到 Subversion 时,我只是将 Jenkins 设置为每分钟轮询我们的 Subversion 存储库。查找 Subversion 中是否发生更改非常快,并且占用的资源很少。如果 Jenkins 服务器宕机,Jenkins 将立即轮询各种 Subversion 项目,并从中断的地方开始构建。
这种行为有一些缺点,以及某些站点不允许 Jenkins 轮询存储库的原因:
对我来说,这些都是小问题,我喜欢 Jenkins 会照顾好自己而无需我担心的事实。但是,如果您需要在 Jenkins 中进行 Subversion 触发器构建,您可以使用 post-commit 挂钩发出构建命令来完成,但正如您所了解的,如果 Jenkins 已关闭,它不会知道它必须进行构建.
解决此问题的一种方法是让 Jenkins 进行轮询并使用提交后挂钩来触发 Jenkins 构建。有一个文件系统 SCM 插件可以轮询文件或目录,并以此触发构建。Jenkins也有一个命令行界面。你可以在你的 post-commit 钩子中组合这些。
使用命令行界面查看 Jenkins 是否启动并运行。如果是,您可以像往常一样通过 URL 触发构建。如果 Jenkins 未启动并运行,请更新轮询文件。
Jenkins 可以每 5 分钟左右轮询一次这个文件(不需要每分钟触发一次),如果发现这个文件被改变了,它会自动做一个新的构建。这样,如果 Jenkins 宕机了,就可以使用轮询机制作为备份。
如果您担心错过提交,您需要缓冲通知给 Jenkins。一种可能的情况如下:
当 Jenkins 不可用时,将信息写入文件(数据库)。您需要第二个进程定期读取文件 (DB) 并在 Jenkins 可用时将信息推送给 Jenkins。
一个完全不同的选择是在 Jenkins 不可用时忽略这种情况。当源代码频繁更改时,无论如何都会很快触发下一个构建。对于只有不经常更改的作业,您可以使用Startup Trigger Plugin。您还可以在启动时触发一个作业,该作业读取上一个示例中的文件 (db)。
一般来说,只需浏览Jenkins 插件列表,让您的想象力尽情发挥插件可以为您做的事情。你可能会想出非常有创意的解决方案。