Setting up SCA with Renovate Bot: dependency management automation

Dependencies become outdated faster than the team can update them: debt grows, releases break, and fixes turn into emergencies. We set up SCA and update automation turnkey — from repository analysis to merge policies. Our engineers build the process so that time spent on updates is reduced severalfold and releases no longer depend on manual edits.

Our competencies:

Frequently Asked Questions

Latest works

  • Development of a web application for FEEDME
    Development of a web application for FEEDME
    1365
  • Development of an online store for the company FURNORO
    Development of an online store for the company FURNORO
    1330
  • B2B Advance company logo design
    B2B Advance company logo design
    776
  • Development of a web application for Enviok
    Development of a web application for Enviok
    1077
  • AIDER company logo development
    AIDER company logo development
    1022
  • CRM development for Chasseurs
    CRM development for Chasseurs
    1113

SCA: why manual dependency updates break releases

In a project of a dozen services, versions of the same library almost always diverge: one module pulls in a fresh branch, another uses the one that once built.

As long as the services do not intersect, this goes unnoticed; the first shared release surfaces behavioral incompatibility, and the build fails at the very end, when fixes are already costly.

Vulnerabilities in libraries follow the same logic.

They are usually learned about from an external mailing list, not from your own inventory, and then manual search begins: which service contains this dependency, whether it came directly or transitively, whether there is a fixed version, and what it will pull along with it.

Updates are postponed precisely because of the cost of analysis. A major jump of one library pulls version conflicts into shared modules, and instead of editing one line, the engineer gets a day of behavioral reconciliation.

Dependency debt grows quietly: each missed release increases the distance to the current branch and reduces the chance that the update will pass at all without code changes.

Software composition analysis makes this debt visible and manageable: an inventory of dependencies across all services appears, a list of vulnerabilities tied to specific code, and a clear update order.

Then it is not handled by hand, but handed to automation with checks at every step — we break down how this is solved.

What dependency automation with Renovate Bot provides

Renovate Bot reads manifests and lock files in all repositories, builds a dependency graph, and opens version changes itself — grouped, on schedule, and with mandatory checks.

Rules live in a single config for the entire organization: separate routes for patches and major updates, a limit on the number of simultaneous edits, and windows when changes are not created.

Then automation takes over — green checks go to merge, red ones become a task for an engineer with a ready set of changes.

The speed of vulnerability remediation is no longer measured in policy timeframes, but in hours.

A dependency composition scanner finds the problematic version, the nearest window brings the fixed one — and the share of vulnerabilities closed within the first day after a fix is released goes from a few to the majority.

The share of build failures falls because updates come in small continuous portions, not as an accumulated lump once a quarter.

At the same time, the lock file is maintained: transitive dependencies stop diverging between environments, and an entire class of failures — “works locally, not on staging” — disappears.

Industry reviews consistently show: most code in modern projects is third-party code, and teams with automated dependency updates close vulnerabilities several times faster than teams with a manual cycle.

Hence the effect on availability — fewer incidents from outdated libraries, shorter downtime windows, more predictable release schedules.

SCA modes: manual releases, scheduled and targeted updates

Choosing a scanner is easier than agreeing on what to do with what is found. An SCA tool shows a vulnerable or outdated dependency version, but does not decide who changes it and when.

Without such a rule, the team goes to an extreme: either the repository drowns in edits that no one has time to review, or updates do not ship for months.

We separate three modes and add a fourth — automatic merging for a narrow class of edits. They differ not by tool, but by change size, frequency, and who presses the button.

Mode When it fits Limitations
Manual releases A major-version change breaks compatibility, a human must review the change The update waits for a release window, security fixes arrive with delay
Scheduled updates A product with a steady cycle: a batch of edits once a week and a full test run The batch is harder to roll back — it is unclear which edit broke the build
Targeted updates Critical vulnerabilities and dependencies with a short support window The flow needs prioritization, otherwise the mode loses its meaning
Automatic merging Patches within one branch, covered by tests: checks are green — the edit goes through on its own Requires a high coverage rate; with weak tests, the risk of a hidden defect grows

The update policy ties the modes into one rule: security fixes — targeted and immediately, minor versions — into the scheduled window, major — manually with a regression run.

The quality of the policy is visible in two numbers: the share of edits that passed without manual intervention, and the time from version release to its arrival in the project.

Stages of implementing dependency update automation

SCA implementation does not start with turning on the bot — first you need to understand what already exists in the projects.

We count repositories, package managers, lock files, and places where dependencies are updated by hand, separately marking dead branches that we do not include in automation. This also determines the order of work: from dependency inventory to handing the policy over to the team.

  1. Dependency inventory. We bring repositories, package managers, and current versions into one list — without it, it is unclear where automation will have an effect and where it will only add noise.
  2. Priority scheme. We divide updates into security fixes, minor, and major: each class has its own response time and depth of checks.
  3. Update merge rules. Security patches go to auto-merge when checks are green, major versions go in a separate branch with manual review of changes.
  4. Pilot implementation. We enable SCA on several repositories with different stacks and look at the volume of changes, the number of conflicts, and false positives.
  5. Calibration. Based on the pilot results, we adjust the schedule, update grouping, and limit of simultaneous requests so the flow does not overload reviewers.
  6. Scaling and handover. We roll it out to the remaining projects, describe the policy and rollback procedure, and go over typical update conflicts with the team.

Stages cannot be skipped: without inventory, the bot floods the team with dozens of requests; without calibration, reviewers stop opening updates altogether. A fixed policy makes updates a flow, not a scramble before a security review.

Configurations, merge rules, and update policies

After implementation, the customer is left not only with working updates, but also with the rules by which they are performed: the update configuration lives in the repository next to the code, in our case — in the Renovate settings file.

Without fixed policies, automation turns into a stream of merge requests that no one dares approve. We hand over the following set of artifacts:

  • Update configuration — the rules file: covered package managers, grouping of patches separately from major versions, run windows, affected branches.
  • Priority matrix — “vulnerability class → response time → owner”: critical items are closed within the first day, cosmetic ones go into the scheduled window.
  • Auto-merge policy — only patch versions with green checks are merged without a human; changes to public interfaces go through review by the service owner.
  • Branching scheme and request template — how branches are named and what is attached to the request: vulnerability identifier, affected packages, compatibility notes.
  • Vulnerability response policy — the procedure from alert to rollout: who checks, who escalates, which update blocks a release.
  • Dependency report — a periodic snapshot: share of outdated packages, overdue response times, updates that are postponed most often.
  • Update documentation — a short instruction: how to add an exception, roll back an unsuccessful update, connect a new repository to the shared configuration.

All artifacts go through review together with the code. A policy that lies in a separate document outside version control becomes outdated first.

Case study: reduced dependency debt in a large repository

In a monorepo with several hundred direct dependencies, updates were done manually: tasks got lost in the general backlog, critical vulnerabilities lived in a branch for months, and a rare “big upgrade” broke the build in several places at once.

Before: manual updates and growing debt

At the start, the repository had more than 40 open critical vulnerabilities, and none were closed faster than three weeks. The average time from fix publication to release was 3–4 weeks.

Build failures during mass updates reached 30%: the log did not show which of a dozen changes broke the checks, and the analysis was postponed.

After: automation and results

We deployed Renovate on a schedule: patch versions and minor releases are gathered into one merge request and go through automatically after green checks, while major ones arrive separately and wait for review.

The lock file update is placed in a separate commit — the cause of a failure is immediately visible. The SCA report stopped being a quarterly event and is generated on every merge.

Results of the first months of work:

  • open critical vulnerabilities — from 40+ to 0–2 at any given time;
  • time from fix publication to release — from 3–4 weeks to 1–2 days;
  • share of build failures on updates — from 30% to 5–7%;
  • about 80% of updates pass without developer involvement.

The main effect is not individual numbers, but that debt stops accumulating: every week some dependencies move forward, and rollback to the previous version remains predictable.

What to do if dependencies have not been updated for years?

If dependencies have not been updated for years, an attempt to bring everything up at once almost always ends in a broken build: transitive links pull different versions of the same libraries, and some packages are no longer maintained by their authors.

Therefore, the lag is handled in waves — groups of related updates, each passing checks and going into the main branch separately.

The queue is built from the SCA report, not alphabetically: first close what has known vulnerabilities and has long received no fixes, then packages that are behind by a major version, and finally updates without behavioral impact. Product tasks do not stall: while one wave is being checked, the next is only being prepared.

Then the process stops being manual. Renovate monitors the package registry, opens update changes itself, groups them according to rules, and schedules them, without touching what has not passed checks; auto-merge is enabled only for safe minor bumps.

A separate branch for each wave provides a rollback point if the library behaves differently than expected.

For unsupported packages, a library migration plan is needed: isolation via a wrapper, replacement with a supported alternative, temporary version pinning with a review date. It is agreed in advance — it determines the order of work and the code areas to be changed.

The result is measured not by the number of updated packages, but by the share of outdated direct dependencies and the time from fix release to entering the main branch. As long as these indicators stay at the same level, the lag does not accumulate again.

Common technical questions about update automation

Teams usually have the same doubts: noise from automatic requests, rollback when the build breaks, private internal libraries, and who exactly presses “merge.” Below is how each of them is resolved at the configuration level, not by persuasion.

Will the bot flood the repository with merge requests?

No, if you set up grouping: minor updates of one stack are gathered into one request, the limit of simultaneously open requests is capped at a number, and the schedule narrows the window. In practice, the repository gets one or two requests per week instead of manual review.

What happens if the build fails after an update?

Checks run before merge, so the breakage is visible inside the request, not in the main branch. The change is rolled back with one action, the previous state is restored, and other updates continue on their own.

We have private internal libraries — will the bot break them?

Packages from the internal registry are described by a separate rule: versions are taken from your source, changes to them go in an agreed-upon mode, not automatically. This does not block updates of public dependencies.

Who is responsible for merging — automation or an engineer?

Merging is always up to a human: automation prepares the change, runs checks, and leaves a trace in the history. Auto-merge can be allowed only for patches with green tests — the policy is set by you and edited in the configuration.

Let’s discuss the task: how to bring order to dependencies

To keep the conversation concrete rather than about general principles, we start with a repository audit: we look at how dependency control (SCA) is currently organized, how many updates are done manually, and where lags accumulate. This requires a minimum of input data — it is usually sent as an archive or a link to a mirror.

What to send for analysis:

  • list of repositories and branches that should be covered by automation;
  • manifests and lock files for your ecosystems: package.json, requirements.txt, go.mod, pom.xml;
  • current update rules: intervals, auto-merge, exceptions, pinned versions;
  • configuration of checks that must pass before merge, and build requirements;
  • roles and access: who issues tokens, who approves major updates, who maintains private registries;
  • list of critical services and allowed update windows, including freezes before releases.

Then — a discussion on the merits: we break down which updates Renovate can merge automatically, what requires manual approval, and where separate rules are needed for major versions.

As an output, you get an implementation estimate and a dependency work plan broken into stages with priorities — from quick wins to moving all repositories to unified rules and regularly reviewing reports. Describe the task in two or three paragraphs — we will come back with an estimate and a plan.