월간 트리거 반복 자동화가 예상대로 실행되지 않음

oke, Moin과 오늘 이 케이스에 대해 이야기를 나눴는데, 그녀가 월간 반복 설정을 사용할 때 버그가 있을 수 있다고 언급했어요. 월의 길이가 달라지니까요? 물론 그녀가 맞긴 했는데… 일부러 말이에요. :stuck_out_tongue:

어쨌든, 조금 더 파고들었어요. :detective:

schedule pm with data-explorer results 자동화 스크립트를 코어 plugins/automation/lib/discourse_automation/scripts 폴더에서 실제로 찾을 수 없었으니, 다른 곳에 숨겨져 있는 것 같습니다.

하지만 plugins/automation/lib/discourse_automation/triggers/recurring.rb의 반복(recurring) 로직을 살펴보고 있었는데(아마 해당 스크립트가 이 로직을 사용 중일 겁니다):

월간 반복 자동화의 기본 코드가 실제 달력 날짜 대신 N번째 요일을 계산하고 있으며, Calendar day와 로직이 일치하지 않는다고 생각합니다. RRule에 BYDAY=#{count}#{byday}를 주입함으로써 자동화가 요일 정렬을 강제하고, 대신 BYMONTHDAY를 사용해야 합니다.

즉, 자동화를 4월 15일(4월의 3번째 수요일)에 시작하도록 설정하면 시스템은 규칙을 매월 3번째 수요일에 실행한다고 해석합니다.

5월이 되면 3번째 수요일은 5월 20일이므로, 스케줄이 5일만큼 어긋나게 됩니다.

더 나아가, 자동화를 매월 30일이나 31일(예: “5번째 화요일”)에 설정하면 시스템은 다음 달의 5번째 화요일을 찾게 됩니다. 만약 해당 달에 화요일이 4번밖에 없다면, 자동화는 유효한 날짜를 찾지 못해 해당 월 전체를 조용히 건너뜁니다.

테스트한 수정안이 있으며, 팀이 검토하기를 원한다면 PR을 만들 예정입니다. 이 수정안은 로직을 N번째 요일에서 정확한 달력 날짜로 변경합니다.


테스트 및 디버깅 과정에서 캡처한 몇 가지 스크린샷입니다:

두 개의 인스턴스, 하나는 수정 전이고 다른 하나는 제 로직 수정이 적용된 것입니다.

양쪽에 동일한 자동화를 생성합니다(수정된 버전은 오른쪽):

"다음 자동화 트리거 시점:"이라는 배너의 차이를 확인해 보세요. 5일 어긋남이 보입니다 - 패치되지 않은 버전은 5월 15일이 아닌 3번째 수요일(5월 20일)로 어긋나고 있습니다.

예를 들어, 실제 날짜 대신 4번째 목요일을 찾고 있다면 월 전체가 완전히 건너뛸 수 있습니다.

rails 콘솔에서도 동일한 결과를 테스트할 수 있습니다.

패치 전:

수정 후:

PR은 여기 있습니다:

수정: 버그는 recurring 트리거가 매월 실행되도록 설정된 모든 자동화 스크립트에 영향을 미치는 것으로 보입니다. :grimacing:

때로는 빈 배너도 재현할 수 있습니다. 예를 들어 시작 날짜를 2026년 4월 29일로 설정하면, 5월에는 존재하지 않는 5번째 수요일을 찾을 수 없기 때문에 자동화가 여기서 트리거되지 않습니다: (왼쪽은 수정 전, 오른쪽은 수정 후)

위와 같이 주어진 주(Nth day in week)를 찾을 수 없을 때 버그가 rails에서 NoMethodError를 던지는 것으로 보입니다. 그래서 다음 트리거 배너가 비어 있고 실행이 실패합니다:

3개의 좋아요