Aktualizace závislostí s Renovate Botem

PHP, JavaScript, Kvalita kódu, Bezpečnost

Téměř každý program obsahuje nějaké závislosti. Ty je potřeba aktualizovat, ale často se na to zapomíná. S tím pomůže Renovate Bot, který je open source a podporuje GitHub i Gitlab a další.

Aktualizace závislostí s Renovate Botem

Article in English can be found on dev.to/arxeiss/update-dependencies-with-renovate-37on

Zranitelnosti se vyskytují a vyskytovat budou i v těch nejlepších programech a knihovnách. Proto je velmi výhodné provést aktualizaci co nejdříve po vydání opravy, aby byla minimalizovaná doba, po kterou je výsledný projekt napadnutelný. Z Githubu je velmi známý Dependabot, který kontroluje aktualizace a vytváří Pull Requesty s danou aktualizací. O tom již psal Michal Špaček.

Existuje ale ještě jedna možnost, která se nazývá Renovate Bot. Tu lze použít jak pro GitHub, GitLab, Azure a mnoho dalších. Je ale nutné si bota hostovat samostatně, třeba v Gitlab CI.

SaaS Bot na Gitlabu není momentálně dostupný kvůli možnému útoku. Osobně bych jej ale stejně nedoporučil. Po integraci a registraci jsem začal dostávat od WhiteSource (autor nástroje) nabídky na nákup jejich software, a dokonce mi i volali. Dodnes nevím, kde vzali mé číslo.

Renovate Bot v Gitlab CI

Renovate dokáže sledovat aktualizace závislostí u různých programovacích jazyků. Zpracovává je pomocí managerů a pro některé jazyky nabízí í více možností  u Javy podporuje Gradgle i Maven. Podporuje také několik git platforem. Takže není divu, že nastavení je opravdu mnoho. Doporučuji projít jak self-hosted configuration tak i configuration options. Alespoň pro představu, co vše lze nastavit. Navíc jsou již připraveny presety, ze kterých je dobré vycházet.

Článek pojednává o použití Renovate pomocí Docker image. Existuje i možnost použít přímo samotného bota napsaného v JavaScriptu. Pak je ale nutné mít nainstalované nástroje pro každého používaného managera. Například Composer, Maven, pip apod., viz odkaz.

Krok 1 – Projekt s botem a hlavní CI pipeline

V prvním kroku je potřeba vytvořit nový projekt/repozitář, který bude obsahovat konfiguraci a pipeline. A následně nastavit její pravidelné spouštění pomocí CI/CD Schedules. Nastavení se provede pomocí souborů .gitlab-ci.yml, config.js a volitelně renovate.json. Proměnné doporučuji nastavit v CI/CD Variables. RENOVATE_TOKEN zajistí přístup bota k repozitářům a GITHUB_COM_TOKEN slouží ke stahování Release notes. Návod na vytvoření je v sekci Self-hosting.

# Obsah souboru .gitlab-ci.yml
update_repositories:
# Zde je konkrétní verze, renovate bot aktualizuje sám sebe viz config.js image: renovate/renovate:24.12.4 # variables: # Doporučuji nastavit pomocí CI/CD Variables # RENOVATE_TOKEN: "" # GITHUB_COM_TOKEN: "" script: - docker-entrypoint.sh artifacts: when: always paths: - renovate.log.json only: - schedules
// Obsah souboru config.js
module.exports = { onboardingConfig: { // Při onboardingu se vloží do repozitáře tento config extends: ["config:base"], }, platform: "gitlab", // Všechny repozitáře jsou na Gitlabu endpoint: process.env.CI_API_V4_URL, // Potřeba pouze pro self-hosted Gitlab, lze vynechat logFile: "renovate.log.json", // Cesta k logu, který je uložen jako artifact v .gitlab-ci.yml
// Autor nesmí být totožný jako jakýkoli vývojář, ideálně mít vlastní účet
// možnost je jen změnit jeho email https://github.com/renovatebot/config-help/issues/839 gitAuthor: "RenovateBot <pavel.kutac+renovate@gmail.com>", baseBranches: ["master"], assignees: ["pavel.kutac"], // Na koho jsou nové MR automaticky přiřazeny
// Seznam repozitářů u kterých aktualizuje knihovny repositories: [ "pavel.kutac/renovate-bot", // Aktualizuje sám sebe, tj verzi v .gitlab-ci.yml "pavel.kutac/docker-ftp-deployer", "pavel.kutac/kutac_cz", ], };

Onboarding MR vytvořeno Renovate botem

Soubor renovate.json je potřeba pouze v repozitářích, které Renovate bot spravuje. A protože výše je nastaveno, aby spravoval i sám sebe, je potřeba do něj vložit soubor s tímto obsahem. 

{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
// Povolí také major update Dockeru, defaultně je zakázán "extends": ["config:base", "docker:enableMajor"], "enabledManagers": ["gitlabci"], // Spouští se pouze gitlabci manager "requiredStatusChecks": null,
// Pokud se nejedná o major udpate, provede se okamžitý merge "packageRules": [{ "updateTypes": ["minor", "patch", "pin", "digest"], "automerge": true }] }

Krok 2 – nastavení aktualizovaných repozitářů

Podobně jako je potřeba vložit renovate.json soubor do repozitáře s botem, je potřeba jej vložit do všech repozitářů, které jsou v konfiguračním souboru v repositories. Pokud se bot spustí a soubor neexistuje, vytvoří Onboarding MR s tímto souborem a s obsahem z onboardingConfig. Následující ukázka je z projektu s blogem. Jedná se o JSON5 formát, který podporuje komentáře.

{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [ "config:base" ],
  "prHourlyLimit": 0, // Může vytvořit neomezeně MR každou hodinu
  "prConcurrentLimit": 0, // Neomezeně otevřených MR v jednu chvíli
  "baseBranches": [ "devel" ], // Základní větev ze které a do které jsou MR je devel
  "enabledManagers": [ "npm", "docker-compose", "dockerfile", "gitlabci", "composer" ],
// Každý MR dostane štítek podle toho, o jaký se jedná update a také podle jazyka "packageRules": [ { "updateTypes": ["major"], "addLabels": ["SemVer Major"] }, { "updateTypes": ["minor"], "addLabels": ["SemVer Minor"] }, { "updateTypes": ["patch", "digest", "bump"], "addLabels": ["SemVer Patch"] }, { "languages": ["php"], "addLabels": ["Lang PHP"] }, { "languages": ["js"], "addLabels": ["Lang JS"] } ] }

Vytvořené MR od Renovate

Krok 3 – Chování bota

Při každém spuštění bot zkontroluje, že soubor renovate.json, či jiný možný konfigurační soubor, je přítomen. Pokud jej nenalezne, vytvoří Onboarding MR s tímto souborem a nebude nic provádět, dokud soubor nebude vytvořen a MR uzavřen. Druhým krokem je vždy kontrola, že zadaná verze neobsahuje rozsahy, nýbrž konkrétní verzi – Version pinning. Změní tak třeba "laravel/framework": "^8.0" na "laravel/framework": "8.21.0". A opět nebude dále nic provádět, dokud tento MR není uzavřen a všechny verze nejsou pinnuté.

Pokud je vše již splněno, začíná vytvářet MR s aktualizacemi pro jednotlivé knihovny. Pokud například knihovna umožňuje aktualizaci minor/patch, ale zároveň major verze, vytvoří rovnou 2 MR. Je na uživateli, který schválí. Pokud ten se změnou v major verzi, při dalším spuštění Renovate po sobě uklidí a starý MR zavře.

Detail vytvořeného MR od Renovate

Doporučuji více prostudovat již dříve zmíněnou dokumentaci a všechny možností nastavení. Dá to nejlepší přehled o možnostech a chování Renovate bota. A nyní již nic nebrání se do toho vrhnout a nechat se notifikovat o změnách v použitých knihovnách a frameworcích.

Osobně mám nastaveno spouštět Renovate vždy 1. v měsíci. Následně provedu merge všech aktualizací, poté otestování a deploy. Poté bota spustím znovu ručně, aby po sobě provedl úklid. Nedoporučuji provádět automerge, pokud systém není 100% pokrytý testy.


Zkušenosti s pravidelnou aktualizací či automatizací těchto úkonů sdílejte v komentářích.

Přidat komentář

Položky označené * jsou povinné. Email nebude zveřejněn

Buď první, kdo přidá komentář. Zatím zde nic není