RENOVATE_SCHEDULE loses to repo config; RENOVATE_FORCE wins
Self-hosted Renovate parses RENOVATE_* env vars for almost every option, but repository config is merged over env values; only the bot-admin force object overrides the merged result.
On GitLab Free, where there is no hosted Renovate app, I run Renovate as a scheduled container inside GitLab CI (Self-hosting Renovate on GitLab CI). When combining daily security runs with a weekly repository schedule window (Daily runs, weekly batches), running the bot on demand requires triggering a GitLab CI pipeline manually.
Setting RENOVATE_SCHEDULE in the pipeline has no effect because Renovate merges repository configuration (renovate.json5) over environment variables. Overriding repository settings from a GitLab CI job requires the bot-admin force configuration object.
Note
Fact-checked against Renovate source in September 2026.
Usage
# .gitlab-ci.yml: a manual job that bypasses the repo schedule for one run
renovate:run-on-demand:
extends: .renovate_run_base
variables:
RENOVATE_FORCE: '{"schedule":["at any time"]}'
rules:
- when: manual
allow_failure: true
Renovate parses object-valued environment variables with JSON5, requiring valid JSON/JSON5 syntax.
Renovate’s configuration precedence explains the behavior:
- Generic environment parsing:
env.tsreadsRENOVATE_<OPTION>for every option not explicitly markedenv: false, delegating object values tocoercions.ts. - Repository merge precedence: In
utils.ts,mergeChildConfigmerges repository config over inherited environment options, concluding withreturn { ...config, ...config.force }. Only properties set insideforcetake precedence over repository-level config.
Notes
- Although the configuration options reference does not explicitly document an environment variable for
schedule, Renovate still ingestsRENOVATE_SCHEDULE. The setting fails to take effect only because repository configuration (renovate.json5) overrides inherited environment variables. forceis restricted to bot administrators: accepted in self-hosted runner configuration or environment variables, and rejected inside repositoryrenovate.json5. Pipeline CI variables are therefore the correct location for on-demand schedule overrides.- Top-level
forcekeys override only root configuration. Nested presets such aslockFileMaintenance.scheduleorpackageRules[].scheduleremain governed by their own schedules unless explicitly specified inside theforcepayload. - Apply
forcesparingly: properties declared inforceunconditionally supersede repository-level rules across every branch processed by that run.
References
- Renovate
forceoption. The sanctioned bot-admin override. - Renovate env parser source. Generic
RENOVATE_*handling. - Renovate
mergeChildConfigsource. Repo config over env;forcespread last. - Daily runs, weekly batches. The companion setup post using this override.
- Self-hosting Renovate on GitLab CI. The container execution model on GitLab Free.
This post was written with AI assistance.