Github/Gitlab Actions中的cron格式和设置方法

Github / Gitlab Actions是一种轻量级的CI(Continuous integration,持续集成),能够自动化地完成某些特定功能或功能组合。在编写Gitlab Actions时通常需要在workflow中指定运行时间,通过schedule定时执行某些工作,其中需要使用cron定义工作流的时间表。

Set cron schedule · Actions · GitHub Marketplace · GitHub
Set the cron schedule for a GitHub Action
https://github.com/marketplace/actions/set-cron-schedule

img

但由于不支持秒级的定时设定,使得这一cron格式与标准的cron有所不同,在使用过程中需要注意!

Github / Gitlab Actions 中的Cron格式
该cron有五个由空格分隔的字段,每个字段代表一个时间单位。第一个数字代表分钟,第二个数字代表小时,第三个数字代表日,第四个数字代表月,第五个数字代表星期。
img

此外,该cron指定的是格林尼治时间**(UTC)*,如果需要换算成北京时间*,要在该cron的基础上增加八小时**得到北京时间。

例如 0 1 * * * 表示在每天 格林尼治时间的 1:00 AM,也就是在北京时间的 9:00 AM 自动运行。

1
2
3
on:
schedule:
- cron: '0 0 * * *'

Github / Gitlab Actions 中的Cron内容

关于每个部分的设定如下表:

*字段* *允许值*
0-59
小时 0-23
日期 1-31
月份 1-12 或者 JAN-DEC
星期 0-6 或者 SUN-SAT

可以在五个字段中的任意一个字段中使用运算符:

符号 描述 示例
* 任意数值 15 * * * * 在每天的每个小时的15分运行
, 数值列表分隔符 2,10 4,5 * * * 在每天的第4和第5个小时的第2和第10分运行
- 数值范文连接 30 4-6 * * * 在每天的第4和5和6小时的30分运行
/ 步进数值 20/15 * * * * 在每天的每个小时中,从第20分钟到59分钟每隔15分钟运行一次(即20分、35分和50分运行)

注意:

  • 以上时间均为UTC标准时间,不是北京时间
  • 只要当前时间符合以上时间就会运行,可以运行多次而非仅在第一次符合时间要求时运行
  • GitHub操作不支持非标准语法@yearly、@monthly、@weekly、@daily、@hourly和@reboot。

更多用法

可以参考官方Doc中的schedule部分:

Events that trigger workflows - GitHub Docs
https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows

img

和标准的Cron表达式的区别

目前注意到了两个区别,第一,是位数区别,不能设置秒;第二,是星期的允许值不同,从0开始而非从1开始。常规的Cron表达式格式如下。

img

1
2
3
4
5
6
7
8
9
10
11
12
特殊符号: 

“*” 字符被用来指定所有的值。如:"*"在分钟的字段域里表示“每分钟”。
“?” 字符只在日期域和星期域中使用。它被用来指定“非明确的值”。当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。看下面的例子你就会明白。 月份中的日期和星期中的日期这两个元素时互斥的一起应该通过设置一个问号来表明不想设置那个字段。
“-” 字符被用来指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”。
“,” 字符被用来指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”。
“/” 字符用于指定增量。如:“0/15”在秒域意思是每分钟的0,15,30和45秒。“5/15”在分钟域表示每小时的5,20,35和50。符号“*”在“/”前面(如:*/10)等价于0在“/”前面(如:0/10)。记住一条本质:表达式的每个数值域都是一个有最大值和最小值的集合,如:秒域和分钟域的集合是0-59,日期域是1-31,月份域是1-12。字符“/”可以帮助你在每个字符域中取相应的数值。如:“7/6”在月份域的时候只有当7月的时候才会触发,并不是表示每个6月。
“L” 是‘last’的省略写法可以表示day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表示一个月的最后一天。如果在day-of-week域表示‘7’或者‘SAT’,如果在day-of-week域中前面加上数字,它表示一个月的最后几天,例如‘6L’就表示一个月的最后一个星期五。
“W” 字符只允许日期域出现。这个字符用于指定日期的最近工作日。例如:如果你在日期域中写 “15W”,表示:这个月15号最近的工作日。所以,如果15号是周六,则任务会在14号触发。如果15好是周日,则任务会在周一也就是16号触发。如果是在日期域填写“1W”即使1号是周六,那么任务也只会在下周一,也就是3号触发,“W”字符指定的最近工作日是不能够跨月份的。字符“W”只能配合一个单独的数值使用,不能够是一个数字段,如:1-15W是错误的。
“L”和“W”可以在日期域中联合使用,LW表示这个月最后一周的工作日。
#” 字符只允许在星期域中出现。这个字符用于指定本月的某某天。例如:“6#3”表示本月第三周的星期五(6表示星期五,3表示第三周)。“2#1”表示本月第一周的星期一。“4#5”表示第五周的星期三。
“C” 字符允许在日期域和星期域出现。这个字符依靠一个指定的“日历”。也就是说这个表达式的值依赖于相关的“日历”的计算结果,如果没有“日历”关联,则等价于所有包含的“日历”。如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历”中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)。

注意:除了{日期}和{星期}可以使用”?”来实现互斥,表达无意义的信息之外,其他占位符都要具有具体的时间含义,且依赖关系为:年->月->日期(星期)->小时->分钟->秒数。

在线Cron表达式设置工具

推荐两个好用的表达式生成工具,第二个可以给出运行时间进行人类可读的验证。需要注意将该表达式调整位数和星期的设置,以应用在 Github / Gitlab Actions 中。

Cron - 在线Cron表达式生成器

在线Cron表达式生成器

参考教程:

https://www.jianshu.com/p/e9ce1a7e1ed1

原文链接:

https://blog.csdn.net/Ximerr/article/details/123501772