Home >> Blog >> La gestion automatisée des dépendances

La gestion automatisée des dépendances

08 août 2024

Par Maxime Ancellin.

Introduction

Aujourd’hui, j’ai l’occasion de faire mon premier « blog post » !

Notre sujet du jour sera la gestion des dépendances automatisée et ses cas d’usage.

Il est vrai que les cas d’application sont ce qui est le plus intéressant à voir quand on parle d’un outil ou d’une technologie.

Nous connaissons tous plusieurs outils qui nous aident au quotidien.
En revanche, nous n’avons pas tous les mêmes besoins, c’est là que l’expérience entre en jeu pour déterminer ce qui nous correspond le mieux.

Cette publication est donc basée sur un retour d’expérience et remit en forme pour s’adapter à un billet de blog.

Les objectifs de cette publication

Au travers de ce sujet, nous souhaitons répondre aux questions suivantes:

  • Comment résoudre les problématiques de mise à jour des outils ?
  • Comment tester cette mise à jour et faire en sorte qu’elle ne casse pas mon code, mon container, etc…
  • Comment faire pour résoudre les problématiques ci-dessus par une approche automatisée ?

Si vous vous posez ces questions, vous êtes au bon endroit !

La gestion des dépendances

Avant de commencer, qu’est-ce qu’on appelle une dépendance ?

Dans nos métiers techniques, nous travaillons avec de nombreux concepts et outils.

Lors d’un projet, on pourrait recoder l’ensemble des élément nécessaire à son bon fonctionnement, mais cela serait fastidieux et très difficile à maintenir dans le temps (beaucoup de code et connaissance à gérer).

Pour pallier à cela, on utilise tout un ensemble de ressources qui sont partagées par des entreprises ou la communauté et que l’on peut inclure/utiliser dans nos projets.

C’est donc cela qu’on appelle des dépendances.

Les gestionnaires et dépendances connues

La plupart des langages/technologies récentes utilisent des gestionnaires de dépendances afin d’orchestrer les différentes ressources et leurs versions.

On peut facilement citer :

  • NPM/Yarn: NodeJS
  • Maven: Java
  • PIP: Python
  • APT: Debian (et distributions ayant cette base)
  • Homebrew: macOS

Concernant les dépendances, il en existe une infinité.
Voici un exemple de packages particulièrement populaires :

  • AWS SDK
  • MongoDB
  • Keycloak

Les solutions évoquées ci-dessus sont très liées à l’environnement du monde du développement.

Avec la méthodologie DevOps, le monde de l’infrastructure s’en rapproche de plus en plus.

Les solutions permettant de déployer les infrastructures “As Code” utilisent également les mêmes principes.

C’est le cas de :

  • Terraform avec les modules
  • Ansible avec les rôles
  • CI/CD dans le cas où l’on utiliserait une librairie de pipeline versionnée
  • Ou même Kubernetes qui gère l’ensemble de ces ressources sous forme d’API versionnée.

Voici une petite illustration qui schématise comment cela fonctionne dans le cadre d’un projet applicatif.

La problématique

Les dépendances ont de nombreux d’avantages et permettent de grandement simplifier notre travail.
Mais elles créent également une vraie problématique dans le maintien à jour et la correction des failles de sécurité des packages que l’on utilise.

On peut utiliser les outils (npm, pip, etc…) pour les mettre à jour, mais cela implique une démarche manuelle.
Dans un univers avec de nombreux projets Git et de micro-services, cela représente beaucoup de travail pour maintenir l’ensemble des éléments à jour.

C’est ici que notre sujet commence.

Pour répondre à cette problématique, il existe des outils permettant de faire ce travail à votre place.
De nombreuse solution sont présente sur le marché, mais nous allons ici parler uniquement des deux principaux.

DependaBot VS Renovate

Ce sont les deux solutions largement adoptées par la communauté.

En effet, elles permettent une installation rapide et ne demandent pas forcément de configuration.

DependaBot

C’est un outil spécifiquement conçu pour être utilisé dans le cadre d’une utilisation avec GitHub, en mode SaaS (Software as a Service).

Avec cette intégration directe à GitHub, DependaBot offre une solution clé en main pour la gestion des dépendances, permettant ainsi une optimisation du flux de travail, une plus grande efficacité et une sécurité renforcée.

La force de DependaBot est sa grande simplicité et son intégration très rapide à vos projets GitHub.

Renovate

Tout comme DependaBot, il est conçu pour être utilisé en mode SaaS sur GitHub (pour la version Mend.io).

Il existe également en version Open Source et permet d’héberger soi-même Renovate via un conteneur dans une pipeline de CI/CD, sur un orchestrateur de conteneurs ou une installation sur une machine via NPM.

Cela permet donc une meilleure confidentialité et une maîtrise plus fine de la gestion des credentials.

Les forces de Renovate :

  • Multi plateforme Git
  • Permet d’être hébergé autrement qu’en SaaS

Cependant, il peut être plus complexe à configurer, mais offre une grande liberté.

Vous l’aurez compris, c’est Renovate l’outil que je recommande pour répondre à notre problématique.
Sa grande flexibilité, le fait de pouvoir l’héberger soi-même et d’avoir le code Open Source sont très clairement des avantages.

Voici comment il fonctionne :

Pourquoi faire ?

Comme évoqué précédemment, le temps consacré à la gestion manuelle des packages n’est pas du temps où nous pouvons effectuer des tâches à valeur ajoutée.

Néanmoins, nous sommes contraints d’effectuer ces tâches pour des raisons de Sécurité ou de Dette technique, ou alors les ignorer (Évidemment, je ne recommande pas, l’offuscation est rarement la bonne solution.)

Sécurité

D’un point de vue de la sécurité, cela nous permet de suivre les mises à jour en continu.
Par conséquent, on peut même demander à Renovate de merger automatiquement les nouveaux « patch » afin de garantir que les correctifs soient bien appliqués.

Attention, cela peut engendrer de la casse si les évolutions de vos dépendances ne sont pas fiables.

Dette technique

Maintenant, que l’on n’a plus besoin de passer sur chaque projet pour lancer nos commandes permettant la mise à jour des packages, on peut se consacrer à la production de code.

De plus, avec une bonne chaîne de CI/CD, nous pouvons également nous assurer que les évolutions n’introduiront pas de régression.

Cela signifie que la dette technique sur les packages ne devrait plus s’accumuler, voire même finir par être résorbée.

Attention, lors de la mise en place, il est fort possible d’avoir beaucoup de « Pull Requests » générées.
Il faut pouvoir absorber la charge de travail ou alors préférer activer les niveaux/fonctionnalités de Renovate de manière progressive.

Intégration

Si vous souhaitez intégrer Renovate (ou DependaBot pour GitHub) sur vos projets, vous pourrez trouver la marche à suivre sur les liens ci-dessous.

Configuration

Maintenant que votre Bot Renovate est configuré sur votre instance Git.
Nous allons voir comment le configurer pour des usages standard.

Vous avez dû le remarquer, mais suite à l’intégration de l’outil, une Pull Request a été faite sur l’ensemble de vos « repository Git » afin d’ajouter un fichier renovate.json qui intègre la configuration à appliquer sur votre repo.

Par défaut

Le fichier créé par Renovate est la configuration de base.
Vous pouvez retrouver les informations relatives à celle-ci sur la page presets de leurs GitHub.

Personnalisation

Comme je l’évoque plus haut, il n’est pas toujours évident d’absorber l’ensemble des « Pull Request » qui seront proposés par Renovate lors de la mise en place de celui-ci.
Nous avons donc la possibilité d’activer les fonctionnalités que l’on souhaite.

Par exemple, ci-dessous, nous activons uniquement la prise en charge des Dockerfile

{
  "enabledManagers": [
    "dockerfile"
  ]
}

La liste des managers est disponible sur la documentation.

Vous pouvez également, ajouter un certain nombre d’automatisations comme assigner des personnes pour la relecture, merger automatique certaines mise à jour.

Voici un exemple de configuration étendu.

{
    "packageRules": [
        {
            "matchManagers": ["github-actions"],
            "commitMessageTopic": "Chore(ci): {{depName}} update",
            "automerge": true,
            "automergeType": "pr-comment",
            "automergeComment": "LGTM !"
    }
  ]
}

Si dessus, nous définisson une configuration particulière pour les « Pull requests » sur la partie « GitHub actions ».

Nous avons défini les éléments suivants:

  • Nous ciblons le manager: github-acitons
  • Le message de commit sera: Chore(ci): {{depName}} update
  • La Pull request sera merger automatiquement sur les conditions suivantes:
    • Un commentaire sur la Pull requests
    • Le commentaire devra être: LGTM !

Vous pouvez retrouver l’ensemble des configurations de Renovate sur la documentation officielle.

Partage de configurations

Evidemment, on n’a pas envie de faire notre configuration sur l’ensemble de nos projets Git.
On retomberait dans une certaine mesure dans le cas où il est compliqué de gérer l’ensemble des dépendances sur tous les projets Git.

Pour cela nous pouvons créer dans un projet Git, un ensemble de configurations partagées (un peu comme celle fourni par Renovate).
Cela nous permettra depuis les autres projets d’utiliser une seule et même configuration et donc de travailler sur un seul fichier pour tous nos projets.

On pourra alors utiliser la configuration ci-dessous (dans le cas où nous sommes sur GitLab):

{
  "extends": [
    "gitlab>MonOrganisation/mon-super-projet/renovate-bot//configurations/fichier-de-configuration-sans-extention"
  ]
}

Vous pouvez trouver les autres configurations dans la section config-presets de la documentation.

La suite

Dans le prochain article, nous verrons comment utiliser Renovate dans un flux GitOps et automatiser les mises en staging/production.

Laisser un commentaire

  Edit this page