L’objectif du Gemfile c’est de dire « le projet a besoin de la bibliothèque X en version 4.5 minimum, et de la bibliothèque Y en version 1.3 à 1.5 ». L’objectif du Gemfile.lock c’est de dire « ici on a X en 4.5.6 et Y en 1.3.8, c’est cet ensemble précis qui est testé et mis en production ».
J’ai encore vu passer la question il y a quelques jours
Le Gemfile.lock, c’est quoi la bonne pratique, je le pousse sur le git ?
Et la réponse classique « Oui, pour s’assurer que la production soit en phase avec les versions que tu as testé », avec parfois quelqu’un qui ajoute « sauf pour les paquets gem / composer, où là il ne faut pas le pousser dans le dépôt git ».
Sauf qu’en fait c’est plus complexe, et ce n’est pas une problématique technique. C’est une question d’organisation :
Qui fait la maintenance applicative ? Qui suit les mises à jour de sécurité au jour le jour ? Qui est disponible en astreinte en cas de besoin ? Avez-vous une procédure de test automatisé suffisamment fiable ? Quelle est la politique de numérotation de vos dépendances ?
Plus exactement, le Gemfile.lock et le composer.lock doivent être maitrisés par l’équipe qui gère la maintenance de sécurité.
Équipe de développement
Ce peut être l’équipe de développement. Dans ce cas c’est à elle de pousser le .lock sur son outil de versionnement, de le mettre à jour et de déclencher un déploiement en cas de besoin.
Attention : Dire « je pousse les .lock dans le git », c’est dire, « personne d’autre que moi ne doit y toucher ». C’est parfois présomptueux, mais ça veut aussi dire être responsable de la mise à jour, y compris quand on n’en n’a pas envie.
Ça veut dire surveiller en permanence le besoin de mettre à jour une des dépendances pour des raisons de sécurité. Ça veut dire une veille active sur le sujet, du temps dédié à ça, et des outils ou processus bien définis. Très peu d’équipes de dev ont ça.
Est-ce le rôle de votre équipe de dev ? en a-t-elle les moyens ? le temps ? l’autonomie ?
Équipe de production
À l’inverse ça peut être à l’équipe de production de gérer ces artefacts. Dans ce cas c’est à cette dernière de pousser les .lock sur leur propre versionnement, avec le reste des configurations. Eux ont des processus établis pour faire les veilles de sécurité, des astreintes en cas de mise à jour en urgence, etc.
En échange ça veut dire que les dépendances sont spécifiées très sérieusement et plus précisément dans le Gemfile. Parfois dire « je veux la version 4.5.* » et pas uniquement « je veux une version 4 ou supérieure ». Pousser le Gemfile.lock sur le git de l’équipe de développement peut aussi être un indicateur que le Gemfile d’origine est géré avec légèreté au départ.
L’équipe de production se basera sur ces définitions précises, sur les notes de mises à jour des dépendances, puis mettra à jour le code et le Gemfile.lock en fonction. Elle fera ensuite passer les tests automatisés, peut être une équipe de QA. À la fin elle prendra – ou non – la responsabilité de déployer en production la mise à jour sans passer par l’équipe de développement, en fonction de l’urgence et du risque. Ça impose donc aussi des tests automatisés suffisamment solides pour se baser dessus lors d’une mise à jour mineure.
Dans une grosse structure, ou avec une équipe de production dédiée de qualité, c’est probablement une des meilleures options. Mais… votre équipe de production est-elle compétente sur ces sujets ? a-t-elle l’autonomie suffisante pour cela ? le code, le Gemfile et les tests automatisés sont-ils suffisament à niveau ?
Laisser un commentaire