Jenkins定时任务仅运行第一行的解决方案

99次阅读
没有评论

问题描述

在使用Jenkins时,尝试通过Cron定时任务在两个不同的ECS集群上每分钟运行一个小型监控脚本。在启用”Build periodically with parameters”选项时,在文本框中输入了以下内容:

* * * * * %CLUSTER=Cluster1;
* * * * * %CLUSTER=Cluster2;

这个设置对于Cluster1工作得很好,但是对于Cluster2没有运行。它并不会失败,只是不会运行。如果将这两行互换位置,则对于Cluster2可以运行(此时位于顶部),但对于Cluster1则不行。我确保运行该任务的节点有足够的执行器,并且已启用”Execute concurrent builds if necessary”选项。在谷歌搜索时,我找到了一个类似的问题,但在这些行之后有一个空行,添加另一个空行、删除它或在它们之间添加空格都没有帮助。我目前使用的是一个不太好的解决方法,即将两个运行放在一个非参数化构建中,虽然它可以工作,但不够灵活。因此,问题可以总结为,为什么Jenkins不会从Cron中运行并发构建,我该如何改变这种情况呢?谢谢。

解决方案

请注意以下操作可能因版本差异而有所不同,建议在操作前做好备份。

方案1:修正Cron表达式

根据您的描述,问题可能出在Cron表达式的设置上。您在同一分钟内设置了两个任务,这可能会导致Jenkins只执行第一个任务。尝试调整Cron表达式以确保两个任务分别在不同的分钟运行。

以下是一个示例,将两个任务分别设置在每小时的15分钟和30分钟运行,以避免冲突:

15 * * * * %CLUSTER=Cluster1;
30 * * * * %CLUSTER=Cluster2;

方案2:使用随机时间参数

您还可以尝试使用随机时间参数(H)来避免冲突。通过在Cron表达式中使用H来设置随机分钟,从而确保任务在不同的时间点运行。以下是一个示例:

H * * * * %CLUSTER=Cluster1;
H * * * * %CLUSTER=Cluster2;

方案3:创建独立的任务

如果以上解决方案无法解决问题,您可以考虑创建独立的任务来分别运行Cluster1和Cluster2的监控脚本。这将确保每个任务都在自己的时间点运行,避免冲突。

方案4:参考已知问题

请注意,Jenkins存在一个已知问题(JENKINS-22129),可能会影响到每分钟运行的任务。如果上述解决方案仍然无法解决问题,您可以考虑参考该已知问题的讨论,以获取更多关于该问题的信息和解决方法。

提示:在进行任何更改之前,请确保在测试环境中进行,并做好充分的备份。

总结

通过调整Cron表达式、使用随机时间参数、创建独立任务或参考已知问题,您可以尝试解决Jenkins定时任务仅运行第一行的问题。选择适合您情况的解决方案,并根据实际情况进行调整和测试,以确保任务能够按预期运行。

注意:Jenkins的定时任务设置可能会受到版本和插件的影响,请根据您的实际情况进行调整。

正文完