如何在Jenkins中安排任务?

373

我在 Jenkins 中新增了一个工作,希望能够定期调度。

配置任务页面中,勾选了“周期性构建”复选框,并在计划文本框中添加了表达式:

15 13 * * *

但是它并没有在预定的时间运行。

这是否是正确的任务定时计划流程?

图片描述

该任务应该在早上4:20自动运行,但实际上未运行。


它运行了还是没有运行?如果我没记错,你的cron说“每天13:15”。是的,我认为这是安排定期构建的正确方式。 - Fildor
2
也许这会对你有所帮助:http://en.wikipedia.org/wiki/Cron#CRON_expression - 我看到 Cedric 已经链接了它...也许你应该告诉我们,期望的时间间隔是多久? - Fildor
1
供参考,右侧的蓝色问号显示了可能值的良好解释。 - devstopfix
这是一个很好的自动生成网页 --> https://crontab-generator.org/ - Fabián Carrasco
10个回答

658
通过将计划周期设置为15 13 * * *,您告诉Jenkins在每个月的每一天的第13小时的第15分钟安排构建。Jenkins使用cron expression,不同的字段包括:
  1. MINUTES 每小时的分钟数(0-59)
  2. HOURS 每天的小时数(0-23)
  3. DAYMONTH 每月的日期(1-31)
  4. MONTH 每年的月份(1-12)
  5. DAYWEEK 每周的日期(0-7),其中0和7代表星期日
如果您想每5分钟安排一次构建,则可以使用此命令:*/5 * * * * 如果您想每天8点安排一次构建,则可以使用此命令:0 8 * * * 过去几个版本(2014年以来),Jenkins有一个新参数H(摘自Jenkins代码文档):
为了让定期调度的任务在系统上产生均匀的负载,应尽可能使用符号H(代表“哈希”)。
例如,对于十几个每日作业,使用0 0 * * *将导致午夜出现大量峰值。相比之下,使用H H * * *仍会每天执行每个作业一次,但不是同时执行,更好地利用有限资源。
还要注意: H符号可以被认为是范围内的随机值,但实际上它是作业名称的哈希,而不是随机函数,因此对于任何给定的项目,该值保持稳定。 更多使用“H”的示例

7
如何每6小时定期执行构建?* */6 * * * 是否可行? - ѕтƒ
39
请使用“H/5 * * * ”而不是“/5 * * * *”来平均分配负载。 - friederbluemle
40
令人沮丧的是,我的大脑似乎无法理解这些表达方式,必须不断地参考文档才能明白。 - ajeetdl
12
不要忘记阿尔伯特·爱因斯坦的话:“能查到的东西不要死记硬背。” - Helmut Granda
6
谢谢你关于H与哈希相关的解释。我仍然认为这是Jenkins作者不幸的命名选择。在这种情况下,他们本应该猜到每个人都会从直觉上将H与小时联系起来,并选择其他名称。 - Johan Boulé
显示剩余5条评论

56

格式如下:

分钟 (0-59), 小时 (0-23), 天 (1-31), 月份 (1-12), 星期几 (0-6)

可以将字母H代表单词哈希插入到任何一个值中,它将根据您项目名称的哈希代码计算参数。

这样做的目的是为了让您在同一时间在构建机器上构建多个项目时,比如每天午夜,它们不会同时开始执行构建。每个项目在不同的分钟开始执行,具体取决于其哈希码。

您还可以指定值在数字之间,例如 H(0,30) 将返回可能哈希值为 0-30 的项目的哈希代码。

示例:

  1. 每天早晨08:30开始构建,周一至周五: 30 08 * * 1-5

  2. 平日每天两次构建,分别在中午12:00和午夜00:00,周日至周四: 00 0,12 * * 0-4

  3. 每天下午晚些时候开始构建,在下午4:00 p.m. - 4:59 p.m.或16:00 -16:59之间,具体取决于项目的哈希值:H 16 * * 1-5

  4. 在午夜开始构建:@midnight 或每个星期六的午夜开始构建:59 23 * * 6

  5. 每个月的第一天在凌晨2:00 a.m. - 02:30 a.m.之间进行构建:H(0,30) 02 01 * *


1
在第四个例子中,您将在星期六晚上11:59开始构建,这是午夜前1分钟:) 只是说一下。 - Stunner

52

Jenkins允许您设置多个时间,用换行符分隔。

如果您需要每天早上7点以及每个星期日下午4点构建项目,则以下设置很好用。

H 7 * * *

H 16 * * 0

1
H(0-0) 6 * * 1 (在美国东部时间周一早上6点运行),H(0-0) 16 * * 0 (在美国东部时间周日下午4点运行)。使用纯 H 16 是不会在下午4点 / 1600 运行的,您必须使用 H(0-0) 16... - AKS
3
与其使用 H(0-0),您可以简单地使用 0。使用 H 的优点在于,并非所有作业都会在完全相同的时间尝试运行,而是尝试获取“下一个可用的时间段”。 - derHugo
我需要设置一个定时任务,每隔两天早上7点执行一次。你能帮我写定时任务的代码吗? - Zvezda Bre

36

*/5 * * * * 表示每隔 5 分钟执行一次

5 * * * * 表示每小时的第 5 分钟执行一次


34

Jenkins中设置定时任务的步骤:

  1. 点击作业需求的"配置"
  2. 向下滚动到"构建触发器"副标题
  3. 勾选按时间周期构建的复选框
  4. 在"计划"字段中添加时间表,例如:@midnight

enter image description here

注意:在计划字段下方,可以看到上一次和下一次运行的日期和时间。

Jenkins还支持预定义的别名来安排构建计划:

@hourly, @daily, @weekly, @monthly, @midnight

@hourly --> 每小时开始的时候构建 --> 0 * * * *

@daily, @midnight --> 每天午夜构建 --> 0 0 * * *

@weekly --> 每周日午夜构建 --> 0 0 * * 0

@monthly --> 每月的第一天午夜构建 --> 0 0 1 * *

另一个例子,如何只在特定的一周中运行:

# Every Sunday at 19:00

0  19  *  *  0

数字代表以下列表中对应的星期几:

0 = Sunday
1 = Monday
2 = Tuesday
3 = Wednesday
4 = Thursday
5 = Friday
6 = Saturday

如果你想知道一周有多少天,可以像这样添加逗号:

# Monday, Wednesday and Friday:

0  19  *  *  1,3,5

1
at-midnight 很酷 :) Jenkins 似乎识别了很多以 @ 开头的特殊值,包括 @daily。你能否发布一个权威列表的链接? - chrisinmtown
@chrisinmtown,预定义别名列表已添加,希望对您有所帮助 :) - Gavriel Cohen

14

Jenkins作业调度语法 首先,让我们来看一下Jenkins作业调度配置。它看起来很像Linux的cron语法,但你不必熟悉命令行Linux就能弄清楚它。

一个调度条目由五个由空格分隔的字段组成。您可以通过添加多个条目来安排多个时间运行作业。

屏幕截图 Jenkins Schedules 每个字段都可以包含精确值或使用一组特殊表达式:

熟悉的星号*表示所有有效值。因此,每天运行的作业在第三个字段中有一个*。

破折号分隔值范围。例如,每天上午9点到下午5点每小时运行一次的作业将在第二个字段中有9-17。

间隔用斜杠/指定。每15分钟运行一次的作业在第一个字段中有H/15。请注意,第一个字段中的H具有特殊含义。如果您想让作业每15分钟运行一次,可以将其配置为0/15,这将使它在每个小时的开始运行。但是,如果您以这种方式配置了太多的作业,则可能会超载Jenkins控制器。最终,H告诉Jenkins根据作业名称的哈希选择一分钟。

最后,您可以使用逗号指定多个值。因此,每周一、三和五运行的作业在第五个字段中有1,3,5。

Jenkins在其帮助部分中提供了一些调度示例。

Every fifteen minutes (perhaps at :07, :22, :37, :52):

H/15 * * * *

Every ten minutes in the first half of every hour (three times, perhaps at :04, :14, :24):

H(0-29)/10 * * * *

Once every two hours at 45 minutes past the hour starting at 9:45 AM and finishing at 3:45 PM every weekday:

45 9-16/2 * * 1-5

Once in every two hour slot between 8 AM and 4 PM every weekday (perhaps at 9:38 AM, 11:38 AM, 1:38 PM, 3:38 PM):

H H(8-15)/2 * * 1-5

Once a day on the 1st and 15th of every month except December:

H H 1,15 1-11 *

Jenkins还具有一组别名,使使用常见的时间间隔更加容易。

表格截图Jenkins Aliases


9
为了每5分钟调度一个cron job,您需要像这样定义cron设置:
*/5 * * * *

我想在美国东部时间上午8:00准确运行作业,因此我构建的cron表达式是 - 00 08 * * *,这样可以吗? - Sangram Anand
很遗憾,它没有起作用,在帖子中附上了屏幕截图,顺便说一下,我正在使用当前的EST时间进行测试,即凌晨4:20左右。 - Sangram Anand
东部标准时间是否与构建服务器上的时区相同? - fduff
是的,时间是相同的,顺便说一下 */5 * * * * (每隔5分钟)也运行良好。 - Sangram Anand
要在美国东部时间早上8点准时运行作业,您需要按照以下方式操作:H(0-0) 8 * * * - AKS

9

谢谢。这对我理解Jenkins中的*概念非常有帮助。 - Gunjan Paul

4

尝试使用 0 8 * * *。它应该可以直接使用!


4
Jenkins使用Cron格式进行调度。您可以参考此链接获取更多详细信息https://zh.wikipedia.org/wiki/Cron 。 还有一件事,Jenkins为我们提供了一个非常有用的预览。请查看截图。 enter image description here 希望这有所帮助。谢谢。

如何应用这些更改? - Balaji Boggaram Ramanarayan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接