每月触发的重复自动化未按预期运行

好的,Moin 和我今天聊到了这个案例,她提出使用“每月”频率可能存在一个 Bug,因为月份的长度各不相同?当然,她是对的——至少部分正确:stuck_out_tongue:

不管怎样,我又做了一些深入调查:detective:

我实际上在核心 plugins/automation/lib/discourse_automation/scripts 文件夹中找不到 schedule pm with data-explorer results 的自动化脚本,所以它一定藏在其他地方。

不过,我查看了这里关于周期性(推测该脚本会用到)的逻辑,位于 plugins/automation/lib/discourse_automation/triggers/recurring.rb

我认为,月度周期性自动化的底层代码计算的是“第 N 个星期几”,而不是实际的日历日期,这与“日历日期”存在逻辑不匹配的问题。具体来说,通过向 RRule 注入 BYDAY=#{count}#{byday},自动化系统强制对齐星期几,而应该使用 BYMONTHDAY 而不是 BYDAY

因此,如果你将自动化设置为从 4 月 15 日开始(这一天恰好是 4 月的第 3 个星期三),系统会将该规则解读为:每月第 3 个星期三运行

到了 5 月,第 3 个星期三是5 月 20 日,这导致计划偏移了 5 天。

此外,如果你将自动化设置在某月的 30 日或 31 日(例如“第 5 个星期二”),系统会在下个月寻找第 5 个星期二。如果那个月只有 4 个星期二,自动化将无法找到有效日期,并静默跳过整个月份

我已经测试了一个修复方案,并正在提交 PR,如果团队想查看的话。该修复将逻辑从“第 N 个星期几”改为“精确的日历日期”。


以下是我在测试和调试过程中的一些截图:

两个实例,一个未修复,另一个应用了我的逻辑修复

在两者中创建完全相同的自动化(修复版本在右侧):

查看横幅中“下次自动化将在以下时间触发:”消息的差异,存在 5 天的偏移——未修复版本会偏移至第 3 个星期三(5 月 20 日),而不是 5 月 15 日。

例如,如果系统查找的是“第 4 个星期四”而不是实际日期,某些月份可能会被完全跳过。

也可以在 Rails 控制台中测试相同的结果

未修复版本:

修复后版本:

PR 链接如下:

2 个赞