RUN-4780: Clarify Groovy plugin hot reload requires plugin.refreshDelay - #1952
Conversation
…eshDelay RUN-4780: Rundeck never reloads a Groovy plugin after initial load by default. Hot reloading requires setting plugin.refreshDelay explicitly; document activation per install type (RPM, DEB, Docker, bootRun) and warn that enabling it watches every plugin in libext.
…eshDelay RUN-4780: Rundeck never reloads a Groovy plugin after initial load by default. Hot reloading requires setting plugin.refreshDelay explicitly; link to the canonical System Properties Configuration page for install-specific setup, and warn that enabling it watches every plugin in libext.
There was a problem hiding this comment.
🟡 Changes recommended
The new documentation includes ambiguous Docker guidance and a potentially unsafe RPM/DEB example that can overwrite existing RDECK_JVM_OPTS settings.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR updates the Rundeck documentation to clarify that Groovy plugin hot reloading is not automatic after initial load, and requires explicitly enabling refresh checks via the plugin.refreshDelay JVM system property. It also adds a local ignore entry for a .atl/ directory.
Changes:
- Clarifies Groovy plugin “Hot Reloading” as an opt-in capability in the Overview section.
- Reworks the iterative development workflow to document enabling hot reload via
-Dplugin.refreshDelay=..., including cautions about watching all Groovy plugins inlibext. - Updates
.gitignoreto ignore a local.atl/directory.
File summaries
| File | Description |
|---|---|
| docs/developer/groovy-plugin-development.md | Clarifies hot reload behavior and adds an opt-in configuration subsection + caveats for Groovy plugin development. |
| .gitignore | Ignores local .atl/ directory artifacts. |
Review details
- Files reviewed: 1/2 changed files
- Comments generated: 2
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Use the append pattern for RDECK_JVM_OPTS to avoid overwriting an existing value, and replace the unverified Docker command flag with a link to Extending Docker Configuration since the official images configure the JVM via env vars/templates, not direct -D passthrough.
There was a problem hiding this comment.
🟢 Approval recommended
The documentation updates align with existing configuration guidance in the repo and introduce no apparent inconsistencies or incomplete changes.
Review details
- Files reviewed: 1/2 changed files
- Comments generated: 0 new
- Review effort level: Lite
|
A few follow-ups from review (claims verified against
|
…e hot reload Verified against rundeckapp source: resources.groovy reads plugin.refreshDelay via application.config.getProperty, and Application.groovy registers rundeck-config.properties as a Spring PropertySource with addFirst, giving it higher precedence than JVM system properties. It's also the one config file present across every install type, simplifying the Docker case raised in review without needing a derived image.
RUN-4780 review (luismalamoc, section 2): resources.groovy defines the lang:groovy bean for every .groovy in libext unconditionally, and Spring eagerly instantiates non-lazy singletons at context startup regardless of refresh-check-delay. A broken/empty .groovy file can break startup whether or not plugin.refreshDelay is set - the warning no longer implies the risk is exclusive to enabling it.
|
@luismalamoc Thanks for the detailed review. Verified all three against
Ready for another pass whenever you have a chance. |
luismalamoc
left a comment
There was a problem hiding this comment.
Verified both follow-ups are addressed:
rundeck-config.propertiesdocumented as the primary method (68cb382) — confirmed againstApplication.groovy(addFirstproperty source, takes precedence) and the linked Config File Reference page exists on4.0.x.- Startup warning softened (cf0587b) to reflect that broken/empty
.groovyfiles inlibextare a startup risk regardless ofplugin.refreshDelay.
Snyk failure is repo baseline, tracked separately per team's call. LGTM.
Summary
Fixes RUN-4780 ("Hot reloading groovy plugin is not working"). The docs claimed Groovy plugins hot-reload automatically after their initial load; in practice Rundeck never re-checks a loaded Groovy plugin unless
plugin.refreshDelayis explicitly set (root cause:resources.groovydefaults the Springrefresh-check-delayto-1, disabling the refresh check entirely — this has been the behavior since the feature was introduced, not a regression).plugin.refreshDelayJVM system property.libext, not just the one being edited, and can break startup if any of them are empty or invalid.Changes
docs/developer/groovy-plugin-development.md— corrected the Overview bullet and rewrote the "Iterative Development" section under Development Workflow..gitignore— ignore local.atl/directory.