Aller au contenu

Renovate Automatise la Gestion des Dépendances

Mise à jour :

La gestion des dépendances dans le développement logiciel est une tâche complexe et chronophage, souvent source de frustrations et de défis. Avec l’évolution constante des technologies et des bibliothèques, maintenir à jour un projet peut rapidement devenir un véritable casse-tête. C’est dans ce contexte que Renovate se révèle être un outil inestimable.

Renovate

Dans cette documentation, je vais vous plonger dans l’univers de Renovate, en mettant en lumière comment il simplifie et rationalise la gestion des dépendances. Nous allons explorer ensemble les raisons pour lesquelles Renovate est devenu pour moi un outil indispensable.

Qu’est-ce que Renovate

Chaque bibliothèque ou package que nous intégrons dans nos projets apporte non seulement des fonctionnalités, mais aussi des défis en termes de maintenance et de sécurité. C’est là que Renovate devient un acteur clé.

Des dépendances obsolètes peuvent introduire des vulnérabilités dans votre projet, exposant ainsi vos applications à des risques de sécurité. La maintenance manuelle des dépendances est une tâche répétitive et chronophage. Renovate automatise ce processus, vous permettant de vous concentrer sur le développement plutôt que sur la maintenance.

Renovate est un outil d’automatisation conçu pour maintenir à jour les dépendances des projets logiciels. Il surveille les dépôts des bibliothèques et packages que vous utilisez et propose automatiquement des mises à jour dès qu’une nouvelle version est disponible.

Fonctionnalités Clés de Renovate

  • Mises à jour Automatiques : Renovate vérifie régulièrement les nouvelles versions des dépendances et crée des pull requests pour les intégrer dans votre projet.
  • Prise en Charge de Multiples Langages : Il gère les dépendances dans divers écosystèmes, tels que JavaScript (npm, Yarn), Python (Pip), Java (Maven), collections ansible, …
  • Personnalisation : Vous pouvez configurer Renovate pour exclure certaines mises à jour, définir des plannings spécifiques, étendre son champ d’application et bien plus encore.
  • Intégration Continue : Renovate s’intègre facilement avec les outils de CI pour tester automatiquement les mises à jour avant leur intégration dans les branches principales.

Mise en oeuvre de Renovate

Renovate peut être lancé de plusieurs manières :

Chaque méthode a ses avantages, selon la complexité de votre projet et vos besoins spécifiques en matière de gestion des dépendances. Ici, nous nous concentrerons exclusivement sur l’intégration de Renovate dans un pipeline GitLab CI/CD. Cette approche est particulièrement efficace pour une intégration continue et automatisée des dépendances. Ici sera détaillé la première méthode.

Un exemple de projet permettant de mettre à jour un très grand nombre d’images de conteneur.

Installation de Renovate

La première étape consiste à installer Renovate avec npm (nodejs doit être installé sur votre poste de travail). Ouvrez votre terminal et exécutez la commande suivante à la racine de votre projet :

Terminal window
sudo npm install -g renovate

Cette commande installe Renovate globalement, vous permettant de l’utiliser dans n’importe quel projet sur votre machine.

Configuration Initiale

Une fois Renovate installé, la prochaine étape est de créer un fichier de configuration. Renovate utilise un fichier nommé renovate.json pour stocker les configurations. Créez ce fichier à la racine de votre projet et ajoutez-y une configuration de base :

{
"extends": ["config:recommended"]
}

Cette configuration de base est suffisante pour commencer, car elle inclut les paramètres recommandés par Renovate.

Création des Personal Access Token

Renovate a besoin de pouvoir accéder à vos dépôts et à des informations sur les projets officiels. Il faut créer deux PAT :

  • Le premier sur Github.com (si vous n’avez pas de compte, il faudra en créer un) avec le scope repo:public_repo. Il faut l’enregistrer dans une variable d’environnement nommé GITHUB_COM_TOKEN.
  • Le second, RENOVATE_TOKEN là ou sont stockés vos projets avec les droits :
    • pour GITLAB : api, write_repository et read_registry.
    • pour GITHUB : repoet workflow.

Exécution de Renovate

Avec Renovate installé et configuré, il est temps de le lancer. Exécutez la commande suivante dans votre terminal :

Terminal window
renovate --autodiscover

Renovate va maintenant scanner votre projet, détecter les dépendances et vérifier s’il existe des mises à jour disponibles.

Comprendre les Pull Requests de Renovate

Lorsque Renovate trouve des mises à jour, il crée automatiquement des issues et des pull requests dans votre dépôt. Chaque pull request contiendra les détails de la mise à jour, y compris les notes de version du package mis à jour. Il est important de passer en revue ces pull requests, de les tester si nécessaire et de les fusionner dans votre branche principale.

Gestion des Notifications

Renovate peut parfois générer un grand nombre de pull requests, surtout dans les grands projets. Vous pouvez configurer Renovate pour limiter le nombre de pull requests ouvertes simultanément. Cela se fait via le fichier renovate.json :

{
"extends": ["config:base"],
"prConcurrentLimit": 5
}

Cette configuration limite à 5 le nombre de pull requests de Renovate ouvertes en même temps.

Stratégies de Mise à Jour des Dépendances avec Renovate

Maintenant que Renovate est configuré et fonctionnel, il est essentiel de comprendre comment gérer efficacement les mises à jour des dépendances. Choisir la bonne stratégie de mise à jour peut faire la différence entre un projet stable et un projet parsemé de bugs et de problèmes de compatibilité.

Comprendre les Types de Mises à Jour

Les dépendances suivent généralement la convention de versionnement sémantique (SemVer), qui se décompose en mises à jour majeures, mineures et de correctifs. Chacune a ses particularités :

  • Mises à jour majeures : introduisent des changements significatifs, souvent incompatibles avec les versions antérieures.
  • Mises à jour mineures : ajoutent des fonctionnalités ou des améliorations tout en restant compatibles avec les versions précédentes.
  • Mises à jour de correctifs : se concentrent sur la résolution de bugs et de problèmes de sécurité sans ajouter de nouvelles fonctionnalités.

Configurer les Politiques de Mise à Jour

Avec Renovate, vous pouvez définir des politiques de mise à jour spécifiques pour chaque type. Par exemple, vous pourriez vouloir appliquer automatiquement les mises à jour de correctifs, mais examiner manuellement les mises à jour mineures et majeures. Voici un exemple de configuration dans renovate.json :

{
"extends": ["config:recommended"],
"rangeStrategy": "bump",
"major": {
"automerge": false
},
"minor": {
"automerge": true
},
"patch": {
"automerge": true
}
}

Dans cette configuration, Renovate fusionnera automatiquement les mises à jour mineures et de correctifs, mais laissera les mises à jour majeures pour une révision manuelle.

Planification des Mises à Jour

Pour éviter d’être submergé par les mises à jour, il peut être judicieux de planifier quand Renovate doit les appliquer. Par exemple, vous pourriez vouloir limiter les mises à jour pendant les heures de bureau ou spécifier des jours précis. Ajoutez cette configuration à votre renovate.json :

{
"extends": ["config:base"],
"schedule": ["before 10am on monday", "after 3pm on friday"]
}

Avec cette configuration, Renovate ne proposera des mises à jour que le lundi matin ou le vendredi après-midi.

Gestion des Branches de Fonctionnalités

Pour les projets avec plusieurs branches de fonctionnalités, Renovate peut être configuré pour gérer les mises à jour spécifiquement pour chaque branche. Cela garantit que même les branches de développement reçoivent les mises à jour nécessaires.

Configuration Avancée de Renovate

Après avoir établi une stratégie de base pour la mise à jour des dépendances, il est temps de plonger dans les fonctionnalités avancées de Renovate. Ces options vous permettent d’affiner davantage la gestion des dépendances, en adaptant Renovate aux besoins spécifiques de votre projet.

Création de Règles Spécifiques pour Certaines Dépendances

Il peut y avoir des cas où vous souhaitez traiter certaines dépendances différemment. Par exemple, une bibliothèque critique pourrait nécessiter une attention particulière. Voici comment configurer des règles spécifiques :

{
"packageRules": [
{
"packageNames": ["react", "react-dom"],
"groupName": "react monorepo",
"automerge": false
}
]
}

Dans cet exemple, react et react-dom sont regroupés et exclus de l’automatisation pour une révision manuelle.

Utilisation des Customs Datasources

Toutes les datasources ne sont pas gérées par Renovate, il faut parfois créer des CustomDatasources. Pa exemple, pour mettre à jour des images de système d’exploitation basées sur les images cloud officielles des distributions Linux, on va créer les custom datasources suivantes :

"customDatasources": {
"Ubuntu20LinuxRelease": {
"defaultRegistryUrlTemplate": "https://cloud-images.ubuntu.com/releases/20.04/",
"format": "html"
},
"Ubuntu22LinuxRelease": {
"defaultRegistryUrlTemplate": "https://cloud-images.ubuntu.com/releases/22.04/",
"format": "html"
},
"Ubuntu24LinuxRelease": {
"defaultRegistryUrlTemplate": "https://cloud-images.ubuntu.com/releases/24.04/",
"format": "html"
},
"ArchLinuxRelease": {
"defaultRegistryUrlTemplate": "https://geo.mirror.pkgbuild.com/images/",
"format": "html"
}
}

On indique l’url et le type d’information retrouvé sur cette page : json, plain, html ou yaml. En fonction du type, il faudra indiquer comment retrouver les informations de version. Par exemple dans notre cas, on utilisera extractVersion :

"packageRules": [
{
"matchDatasources": ["custom.Ubuntu24LinuxRelease","custom.Ubuntu22LinuxRelease","custom.Ubuntu20LinuxRelease"],
"extractVersion": "^release-(?<version>\\d+)/$"
},

On utilise une regex permettant d’extraire la version du texte release-yyyymmdd.

Pour terminer, il faut définir quels fichiers doivent être mis à jour. On utilise alors customManagers de type regex :

"customManagers": [
{
"customType": "regex",
"fileMatch": [".sh"],
"matchStrings": [
"#\\s*renovate:\\s*datasource=(?<datasource>.*?) depName=(?<depName>.*?)\nwget -q https://cloud-images.ubuntu.com/releases/24.04/release-(?<currentValue>.*)/ubuntu-24.04-server-cloudimg-amd64.img\nwget -q https://cloud-images.ubuntu.com/releases/24.04/release-(.*)/MD5SUMS",
],
"datasourceTemplate": "{{ datasource }}"
}
],

Il faut ajouter des informations dans les fichiers à modifier dont les champs datasource, depName et currentValue. Dans notre fichier ubuntu2404.sh on retrouve par exemple :

Terminal window
# renovate: datasource=custom.Ubuntu24LinuxRelease depName=Ubuntu24-template
wget -q https://cloud-images.ubuntu.com/releases/24.04/release-20240724/ubuntu-24.04-server-cloudimg-amd64.img
wget -q https://cloud-images.ubuntu.com/releases/24.04/release-20240724/MD5SUMS

Le plus compliqué étant d’écrire les bonnes [expression régulière](/docs/developper/expressions-regulieres/.

Gestion des Branches de Développement

Si vous travaillez avec plusieurs branches, Renovate peut être configuré pour gérer différemment les mises à jour sur chaque branche. Cela est particulièrement utile pour les branches de développement ou d’expérimentation :

{
"branchPrefix": "renovate/",
"separateMultipleMajor": true
}

Cette configuration crée des branches distinctes pour chaque mise à jour majeure, facilitant la revue et le test des changements.

Intégration avec les Tests Automatisés

Renovate s’intègre harmonieusement avec les systèmes de tests automatisés. En activant cette fonctionnalité, chaque mise à jour de dépendance peut être testée automatiquement pour s’assurer qu’elle ne casse pas votre application :

{
"extends": ["config:base"],
"automerge": true,
"automergeType": "branch",
"requiredStatusChecks": ["ci/travis-ci"]
}

Dans cet exemple, Renovate fusionnera automatiquement les mises à jour après le passage réussi des tests CI.

Configuration des Mises à Jour Groupées

Pour les projets avec un grand nombre de dépendances, il peut être avantageux de regrouper les mises à jour :

{
"extends": ["group:allNonMajor"],
"schedule": ["every weekend"]
}

Cette configuration regroupe toutes les mises à jour non majeures pour les appliquer ensemble pendant le week-end.

Bonnes Pratiques avec Renovate

Bien que Renovate soit conçu pour simplifier la gestion des dépendances, il peut

Gestion des Problèmes Courants

  • Pull Requests Excessives : Si Renovate crée trop de pull requests, envisagez d’ajuster la configuration pour regrouper les mises à jour ou limiter la fréquence des mises à jour.
  • Conflits de Dépendances : Lorsque Renovate propose des mises à jour qui sont en conflit avec d’autres dépendances, il peut être nécessaire de mettre à jour manuellement certaines dépendances pour résoudre le conflit.
  • Échecs des Tests Automatisés : Si une mise à jour échoue lors des tests, examinez les logs pour identifier le problème. Il peut être nécessaire de mettre à jour le code ou les tests pour accompagner la mise à jour de la dépendance.

Bonnes Pratiques pour l’Utilisation de Renovate

  • Examiner Régulièrement les Pull Requests : Bien que Renovate automatise les mises à jour, une revue humaine est indispensable pour s’assurer que les mises à jour s’intègrent bien dans votre projet.
  • Maintenir une Configuration Claire : Gardez votre fichier renovate.json aussi clair et structuré que possible. Cela facilite la maintenance et la compréhension de votre stratégie de gestion des dépendances.
  • Utiliser des Stratégies de Mise à Jour Réfléchies : Évitez d’appliquer automatiquement toutes les mises à jour. Pesez les avantages et les risques, surtout pour les mises à jour majeures.

Mise à Jour Sélective des Dépendances

Dans certains cas, il peut être préférable de ne pas mettre à jour certaines dépendances pour des raisons de compatibilité ou de stabilité. Utilisez la configuration ignoreDeps pour exclure spécifiquement ces dépendances :

{
"ignoreDeps": ["lodash", "express"]
}

Conclusion

En parcourant ensemble les différentes fonctionnalités de Renovate, nous avons découvert comment cet outil peut révolutionner la gestion des dépendances dans vos projets de développement logiciel. L’automatisation offerte par Renovate ne se limite pas à une simple mise à jour des packages : elle représente une stratégie complète pour alléger votre charge de travail et renforcer la sécurité de vos applications.

L’un des plus grands avantages de Renovate est le temps précieux qu’il vous fait gagner. En automatisant les mises à jour des dépendances, vous dégagez du temps pour vous consacrer à des tâches qui ajoutent une réelle valeur à vos projets. Plutôt que de vous enliser dans la maintenance et la gestion des dépendances, vous pouvez vous concentrer sur l’innovation, le développement de nouvelles fonctionnalités.

En maintenant vos dépendances à jour, vous minimisez les risques associés aux failles de sécurité, assurant ainsi une base solide et sécurisée pour vos applications. Cela n’est pas seulement bénéfique du point de vue de la sécurité informatique, mais aussi en termes de confiance et de crédibilité auprès de vos clients.