Redmine Periodic Task huge updates
Added by Julian Perelli 1 day ago
Julian Perelli wrote:
Hi all,
I maintain the "Periodic Task" plugin, recurring issues for Redmine (https://www.redmine.org/plugins/redmine_periodic_task, in the directory since 2015). Until v6.0.0 (January 2025) it was a small plugin: a form with subject, description, tracker, assignee and "every N days/weeks/months", checked from cron. Over 2026 it was rebuilt from that base into v7.1.0, and since most of it never got announced here, this post is the tour of what changed. Redmine 5.1 to 7.0 are supported and tested in CI on every commit.
The idea has not changed: you define a periodic task per project (an issue template plus a recurrence rule) and the plugin creates the issue when it is due. There is no "master issue" to keep open or re-copy; the template can be edited without touching past issues.
Five big changes¶
1. A periodic task now looks and behaves like an issue¶
The list, the form and the new detail page were rebuilt on Redmine's own issue views (same layout, labels, components, three-dots menu). The template carries every field an issue has: tracker, status, priority, assignee (user or group), category, target version, parent issue, start/due dates, estimated hours, % done, custom fields, watchers, attachments (copied onto every generated issue), subtasks and relations to other issues, plus tags and checklist templates when those plugins are installed. Generated issues link back to the task, the task page shows their history, and an issue page has a "Create periodic task from this issue" link that prefills the form.
2. Real scheduling rules, with a calendar that shows you what you configured¶
Beyond "every N days/weeks/months/years":- weekly on chosen weekdays (Mon+Thu), monthly on a day of the month or on the 1st..5th/last occurrence of a weekday (3rd Wednesday), every N business days following Redmine's own Non-working days setting;
- a per-task rule for runs that fall on a non-working day: run anyway, move to the next or the previous working day;
- an end condition: on a date and/or after N runs;
- a "previous issue still open" policy: create anyway, skip the occurrence, close the previous issue first, or wait and restart from its closing date (Todoist's "every!" semantics);
- time zones: dates are entered and shown in your zone.
While you edit the rule, the form shows it as a sentence ("each month on the 3rd Wednesday at 09:00"), the next 5 run dates, and a month calendar with non-working days greyed out and every run highlighted (moved runs struck through with the original date in the tooltip). So you see what you configured before saving it, and the task page shows the same view.
3. No cron required¶
A plugin setting runs the checker from ordinary web requests (throttled by an interval, DB-locked so several Puma/Passenger workers or servers never double-run, in a background thread so the request is not slowed down). That makes the plugin work on Docker, Windows and shared hosting where cron is not an option. If you have an external scheduler instead (uptime monitor, CI schedule, Kubernetes CronJob), there is a check URL protected like Redmine's /sys endpoints. Cron still works, and the three can be combined. The settings page shows a log of the last 50 runs and a "Run checker now" button, so you can see that your schedule is actually firing.
4. Assignee rotation¶
Besides a single assignee, a task can have an ordered list of members; each generated issue goes to the next one, wrapping around. That is the on-call / release captain / first-responder roster many teams were running by hand. The form shows who is next; members that can no longer be assigned are skipped.
5. More template variables¶
Subject and description accept dates relative to the run: **DAY**, **WEEK**, **WEEKISO**, **MONTH**, **MONTHNAME**, **QUARTER**, **YEAR**, the shifted **PREVIOUS_MONTH**/**NEXT_MONTH**/**NEXT_WEEK**(ISO) with their own year companions (so **PREVIOUS_MONTH**/**PREVIOUS_MONTH_YEAR** is right in January), day offsets like **DAY-1** or **MONTHNAME+10**, and **PREVIOUS_ISSUE**, the number of the issue created by the previous run, so each weekly report links to the last one. Month names are localized.
Also in there¶
- REST API (JSON/XML) to list, create, update, delete and run tasks, same conventions as the core API
- "Periodic task" filter and column on the issue list and in saved queries, recurrence marker on generated issues
- Task changes and runs show up in the project activity
- Administration → Periodic Tasks page listing every project's tasks; Copy action; Active flag to pause a task; Run now button
- 15 languages (bg, de, en, es, hr, it, ja, pl, pt-BR, ru, tr, uk, vi, zh, zh-TW)
- Fixes worth an upgrade on their own: a member of one project could open or run tasks of another project by id; the "next run date keeps increasing" bug; business-day intervals no longer skip a day; simultaneous triggers cannot create two issues for one occurrence
- Tests on Redmine 5.1, 6.0, 6.1 and 7.0 in CI, RuboCop, docker compose dev setup
Upgrading from any 6.x: git pull, bundle install, run the plugin migrations, restart. Nothing to reconfigure; existing tasks keep working with the new defaults.
Docs and screenshots: https://github.com/jperelli/Redmine-Periodic-Task
Changelog: https://github.com/jperelli/Redmine-Periodic-Task/blob/main/CHANGELOG.md
Feedback, bug reports and translations are welcome on GitHub. If you use it, a rating on the directory page helps others find it.
Julian