计划如何被触发?
简单重复模式
日历模式
不依赖其他信息,根据当日日期就能直接判断是否符合的
第一种,重复型的
第二种,单次型的,在执行之后会删除任务
还有一个每天都输出任务的快捷方式,使用 every: day
支持用列表指定多个日期
需要注意,用 on 时,匹配任意一个日期,就会把整个 on 删除掉。
如果想只删除对应的,可以将 on 作为多个独立的触发模式
参考配置
重复型:
- 每年的 6 月 12 日: every: 6-12
- 每周三: every: Wednesday 或 every: Wed 或 every: 周三 或 every: 星期三
- 每月的 15 日: every: 15
- 八月的每一天: every: August 或 every: Aug 或 every: 八月
单次型:
- 在 7 月 15 日: on: 7-15
- 在下次的 5 号: on: 5
- 在 2025 年 8 月 26 日: on: 2025-8-26 ,其实 every: 2025-8-26 也只会输出一次,不同之处在于它不会自动删除
需要注意的是,如果指定 31 号,但是当月没有这一天,则在月底不会触发,该模式是严格遵守指定的日期的。
农历日期
相比公历,需要在日期前加“农历”二字,如果指定的是闰月,则还需要在最后增加“闰”字
也可以加上空格
另外,every 后面还可以跟二十四节气
公历高级重复
根据相对描述决定任务日期
简单重复只是以天为最小单位,也是唯一单位。高级重复,则可以以月和年为周期,以周和天为单位指定日期。
- 指定起始日期:
from: 2025-11-19,必须从年份开始,如果省略几号,就视作 1 号,如果再省略几月,就视作 1 月。有些情况下,这个参数可以省略,比如每月,每年这种。 - 指定一个周期:可以是每几天、每几周、每几月、特定月份、每几年,
every: 3week、every: 2month、every: June、every: year - 指定想要的那一天,可以用第几天或周几描述,如:第三天
on: 3d、倒数第一天on: -day或last: day、第一个星期一on: Monday、倒数第一个星期五on: -Fri或last: Fri,
每个月、每年的某一天
每月第一个星期一
每月倒数第二天运行一次
每月最后一个星期六
每月倒数第二个星期六
每个六月的最后一个星期六
每年最后一个星期六
今天是第一天,每若干天、若干周、若干月、若干年就触发一次
如果只有 every 和 from ,没有 on 或 last,那么含义就是把 from 作为第一天,每经过一次 every 就被触发一次。下面举例说明。
每 16 天一次,会在 2025-8-11、2025-8-27、2025-9-12 ... 触发
每 3 周一次,会在 2025-11-21、2025-12-12 ... 触发
每 2 月一次,会在 2025-11-21、2026-1-21 ... 触发
每 2 年一次,会在 2025-11-21、2027-11-21 ... 触发
需要注意的是,假如第一天是某月的 31 号,下一次的月份可能没有 31 号,此时,会在下一次的月份的最后一天触发,如 30 号就被触发。
如果是一年一次,可以直接用
every: 11-21实现,更简单直观
每若干天、若干周、若干月、若干年的某一天
从 2025 年 11 月 21 日起,每三周中的第一周的周三。也就是会在 11 月 19 号(但已经过去)、 12 月 10 号被触发
从 2025 年 8 月起,每两个月中的第一个月的倒数第七天。也就是会在 8 月 25 号、 10 月 25 号被触发
从 2025 年开始,每两年中的第一年的第三天运行
可以发现,from 指定的日期可以不必精准到天,如果周期是年,到年就行,周期是某几天,就精确到天。特殊的是,周期是周的话,可以指定开始周中的任意一天,都将表示那一周。
另外,这里还有一个限制,只会从每若干周中的第一周、每若干月中的第一个月这样第一个里面去找,如果想要在第二个里面去找,可以更改 from 的日期,调整为从第一个里面去找。
进一步定制周期
通过将周期的左右边界往中间收,对周期进行定制,姑且称为向右偏移和向左偏移。
偏移单位可以是天和周,两周后 after: 2week、倒数第一周前 ahead: 1week、四天后 after: 4d、倒数第四天前 ahead: 4d
有用的设置是,先偏移几周,然后再偏移几天,或者先偏移几天,再找第几个周几。
需要说明一下先偏移一周的含义,比如要实现:每月不算第一周,之后的第三天。假如这个月第一天是周四,不算第一周,就是把 1 号(周四)到 4 号(周日)都不算在内,所以会在 7 号被触发。
这样的功能是应对这样的场景:每月两周后的第三天,不一定是这个月的第三个周三,也可能是第二个周三。
每月最后一周之前的倒数第二天
先偏移几天,再找星期几。
每月 4 天后的第一个周五
每月倒数第 4 天后的倒数第一个周五
从含义上讲,如果一个任务是从某天开始每若干周一次
from 2025-7-8 every 3week,已经完全决定了每次触发的时间,此时添加预偏移是无意义的,也不会生效。
动态检查模式
根据 GitHub release 是否更新进行判断
当有更新时,该任务会添加 tag,其他任务可以继续通过该 tag 触发。
依赖模式
if 后面需要使用 tag ,可以用 and 和 or 指定多个条件
可以同时使用 after 和 before
希望计划 B 与计划 A 同时被触发,或者在计划 A 之前或之后的某一天执行,它们的关系是计划 B 的触发依赖计划 A 的触发。
首先,在计划 A 添加一个 tag
同时触发,只需要使用 if,后面可以跟 tag 或日期
计划 A 后的第 2 天 2025-1-13
计划 A 前的第 6 天 2025-1-5
计划 A 前的第 1 个星期六(含当天) 2025-1-11
TODO 不含当天呢?
计划 A 前的第 2 个星期六 2025-1-4
TODO 如果计划的时间不确定呢?比如 github release,那么从语义上说,就是不可能完成的事情,所以退化为当天触发,并提示
TODO 依赖成链也要能支持,检测环链
复合模式
如果一个计划有多种触发模式,可以通过写多个相同的计划,每一个用一种触发模式实现,但这样比较繁琐,还可以把所有触发模式放在一个列表里,然后放在 trigger 下面
下面是每周六和月末周日触发该计划
要注意的是,如果计划里使用了 trigger,就不能再把触发模式放在顶层,下面这样是非法的
触发模式之间的关系
前面所述是满足触发模式中任意一个即可,这是或关系。
如果需要所有触发模式都满足才行,也就是与关系,可以这样指定,以“每月最后一日,且该日是周六的情况下”为例: