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", ], };
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"] } ] }
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.
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.
K tomuto článku již není možné přidávat další komentáře