If you want to have a single configuration for all your applications / microservices / projects, you’ve come to the right place. Let me show you how to do it with GitLab and Renovate.
Renovate, a tool to keep your dependencies up to date
Renovate is a tool that automatically upgrade the dependencies of any project, by creating Merge Request (MR) on GitLab (Pull Request on GitHub). It works with several languages (NodeJs, Go, Rust, Python) and on all major Git platforms (GitLab, GitHub, Bitbucket, Gitea). It has a lot of configuration options where you can get totally lost, such as creating MRs according to a schedule, automatic merging, discovering projects from a GitLab account, choosing which dependencies to update, etc…
Renovate works with two main components:
- a worker (CI, Docker, CLI)
- projects you want to keep up to date via a config file
renovate.json
at the root of each Git repository.
Why we need Renovate
We, at MONI, have a lot of microservice, something like 50+, with some private dependencies to share configurations and enums.
For instance, when you switch to another project and do npm install
, each time you get this line 2 moderate severity vulnerabilities
, and sometimes 16 vulnerabilities (12 moderate, 1 high, 3 critical)
. It is scary.
Now, my manager said to me “we need to find a tool to keep up to date all our dependencies to avoid security vulnerabilities”. We also wanted to avoid having a configuration for each microservices because all our microservice are similar (NodeJs and pretty much the same dependencies). Having a Renovate config every where is too much maintenance.
Setup Renovate for GitLab
Create a new project Renovate
to use as a worker for all your Git repositories.
Renovate can be used on GitLab by using their template CI, available here.
Our .gitlab-ci.yml
from Renovate
looks like this at this stage.
include:
- project: 'renovate-bot/renovate-runner'
file: '/templates/renovate.gitlab-ci.yml'
Another thing to do is set up CI variables RENOVATE_TOKEN
with a Personal token or Group token with scopes read_user
, api
and write_repository
.
We need to override renovate job to help the worker to find our projects hosted on GitLab and disable onboarding because we don’t want to have a renovate.json
in each of our services. Another thing to note is the need to manually trigger the renovate job or start it via a cron.
include:
- project: 'renovate-bot/renovate-runner'
file: '/templates/renovate.gitlab-ci.yml'
renovate:
variables:
RENOVATE_ONBOARDING: "false"
RENOVATE_AUTODISCOVER: "true"
RENOVATE_AUTODISCOVER_FILTER: microservices/svc-test
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
- when: manual
It’s working but it opens a lot of MR, one for each outdated dependency. That’s not exactly what we want. Let’s go deeper.
Define the Universalis configuration
default.json
in any public Git repository like here.
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended"],
"prConcurrentLimit": 4,
"branchPrefix": "fix/TE-000-",
"commitMessagePrefix": "fix: ⬆️ TE-000 ",
"groupName": "all",
"packageRules": [
{
"packagePatterns": ["*"],
"enabled": false
}
],
"osvVulnerabilityAlerts": true,
"vulnerabilityAlerts": {
"enabled": true
}
}
This config:
- extends the recommended one
- limit to 4 MR by services
- set a git branch prefix
- set a commit message (MR title depends on this too)
- group upgrade dependencies in one MR (only used if more than one dependency need a upgrade)
- disable all dependencies upgrade
- enable all dependencies upgrade for security issue only
Setup Renovate to manage one configuration to rules them all
The first thing I discovered was the possibility of using Global Extends to use a default configuration for all my projects BUT it has to be hosted on a public Git repository.
The second thing is Require Config, it is an option to disable the check of local renovate.json
of each project scanned by Renovate.
Let’s try it.
include:
- project: 'renovate-bot/renovate-runner'
file: '/templates/renovate.gitlab-ci.yml'
renovate:
variables:
RENOVATE_ONBOARDING: "false"
RENOVATE_AUTODISCOVER: "true"
RENOVATE_AUTODISCOVER_FILTER: microservices/svc-test
RENOVATE_REQUIRE_CONFIG: ignored
RENOVATE_GLOBAL_EXTENDS: gitlab>renovate-bot/renovate-runner
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
- when: manual
Wow, it’s working but unfortunately, it does not solve all npm audit
security issues.
Little note about security vulnerabilities by Renovate
This configuration will not solve all the problems of the npm audit
output, as Renovate’s database security is limited to OSV database.
Debug Renovate config
It’s a real nightmare to detect why your Global Extend Config
changes don’t affect Renovate worker’s run. You have to disable the cache to apply the new Global Extend Config
… Nightmare.
I’ve added the LOG_LEVEL
variable to help you debug your configuration.
include:
- project: 'renovate-bot/renovate-runner'
file: '/templates/renovate.gitlab-ci.yml'
renovate:
variables:
RENOVATE_ONBOARDING: "false"
RENOVATE_AUTODISCOVER: "true"
RENOVATE_AUTODISCOVER_FILTER: microservices/svc-test
RENOVATE_REQUIRE_CONFIG: ignored
RENOVATE_GLOBAL_EXTENDS: gitlab>renovate-bot/renovate-runner
RENOVATE_REPOSITORY_CACHE: disabled
LOG_LEVEL: debug
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
- when: manual