Dans un précédent article nous vous avons parlé de la démarche devops. La principale raison de cette démarche est d’avoir des mises en production facilitées, tout en ayant une meilleure confiance dans les livrables. A moins que vous préfériez passer des nuits blanches au boulot…
Débloque les + belles offres tech en 10 mins
N’importe qui à la prod’ vous le dira : on ne change pas un système qui fonctionne… dans les faits c’est une très mauvaise pratique. En effet tôt ou tard il faudra faire des changements, et plus on attend pour les faire plus on aura mal. Dès lors il faut plutôt pratiquer la politique du « release early, release often », autrement dit on livre tôt et souvent. Ca permet comme ça de fournir des micro-changements dans l’application et, au cas où quelque chose va mal, on parvient très vite à le localiser et le résoudre. Cela implique néanmoins de mettre en place l’infrastructure nécessaire pour des tests poussés et pouvant être exécutés fréquemment. Il faut aussi mettre à jour régulièrement le système de base de la machine, notamment pour des raisons de sécurité, mais là encore ça ne se fait pas sans tests préalables.
Une constante revient parmi les équipes de production : l’installation doit pouvoir se réaliser en un clic ou une commande simple. On observe en effet bien trop souvent, notamment dans le monde JEE, des équipes qui fournissent les fichiers .class et une documentation de 200 pages pour faire le déploiement, quand ce n’est pas plus. Certains éditeurs de logiciels à ce niveau en sont à oublier des fichiers dans leurs livrables, car tout est fait à la main. Cette situation n’est pas tenable, et donc il faut soigner le packaging.
L’idéal est de s’adapter au format natif de la plateforme cible. Par exemple sous Windows les livrables seront fournis en .msi, sous les Linux à base Debian en .deb, et pour les Redhat des RPM. De la sorte on peut bénéficier des outils natifs de la plateforme. Sous Windows c’est plus compliqué mais sous les vrais systèmes on peut par exemple déclarer qu’on a besoin de telle ou telle librairie, et au moment de l’installation des livrables les librairies seront automatiquement installées si elles ne l’étaient pas au préalable.
Un logiciel, quel qu’il soit, se compose en fait de trois éléments principaux :
Pour le code les choses sont évidentes. Maintenant il est également important de versionner la configuration et de la conserver dans un gestionnaire de sources, afin de pouvoir monter rapidement une machine. En effet contrairement à ce qu’on pourrait penser les seules choses à sauvegarder sur un serveur sont les données utilisateur. Le reste doit pouvoir être redéployé très rapidement.
Par exemple dans mes expériences passées en packageant des logiciels en RPM il suffisait de cinq minutes pour installer une nouvelle machine, alors que sans ceux-ci pour la même opération il aurait fallu beaucoup plus. Et de même la configuration était ensuite appliquée automatiquement, avec des outils dédiés.
Afin de diminuer le travail de configuration au déploiement, même si celle-ci est automatisée, les livrables fournis par les équipes de développement devraient fournir une configuration par défaut. Celle-ci contient notamment :
En analysant les configurations des serveurs on s’aperçoit que bien souvent l’essentiel des configurations est identique entre les différentes machines et seuls changent quelques paramètres comme les URLs de bases de données. Dès lors il est hors de question de répéter les mêmes manipulations sur des centaines de machines. Heureusement pour ce faire, il existe des outils tels que Puppet ou Chef qui permettent à travers un langage de personnaliser les configurations par machine, en évitant autant que possible de se répéter tant que ce n’est pas nécessaire.
Ces outils permettent par ailleurs bien souvent aussi d’installer automatiquement les livrables, ce qui peut permettre d’économiser un temps précieux à faire des choses plus intéressantes.
Une problématique qui revient également souvent est la gestion des bases de données. En effet là encore il faut pouvoir versionner les changements opérés de façon à pouvoir monter si besoin une nouvelle base sur un nouvel environnement sans avoir besoin d’y passer des semaines. Une bonne stratégie pour y arriver consiste tout simplement à créer un fichier SQL par mise à jour de la base de données et le versionner, et à garder dans le schéma une table contenant les informations de version. Un très bon outil implémentant cette stratégie est Flyway.
Parmi les stratégies les plus intéressantes on trouve ce qu’on appelle le « blue-green déployment ». Le concept est en fait assez simple : il s’agit d’avoir deux chaînes de serveurs identiques, on appellera la première la bleue, et la deuxième la verte, derrière un load balancer. L’idée est que lors d’une mise en prod une des chaînes doit être à l’état de la version précédente, tandis que l’autre doit rester à la version précédente. Dès lors on peut installer tranquillement la nouvelle version sur une chaîne, alors que la production tourne sur l’autre, et la mise en production de la nouvelle version est tout simplement une bascule du load balancer.
Les avantages de cette approche sont les suivantes :
Une problématique qui se pose concerne la base de données, puisqu’il faut éviter de perdre des données en cas de retour à l’état antérieur, tout en évitant aussi le coût des migrations de base d’un serveur à l’autre qui peut être très important.
Une manière de s’en sortir consiste en fait à utiliser la même base de données pour les deux chaînes. Cela implique néanmoins que la base de données soit compatible avec la version N et la version N – 1, puisqu’une bascule peut être faite à tout moment. Dès lors cela nécessite que pour passer de la version N – 1 à la version N, seuls des ajouts de champs ont été faits dans la base. Aussi, les champs, plus gérés dans la version N, seront supprimés une fois que la version N – 1 aura été supprimée du serveur.
Comme dans tout le reste de la stratégie devops, l’idée est que si on doit avoir mal, autant le faire souvent pour ne pas avoir beaucoup mal à chaque fois. En l’occurrence il vaut mieux faire des déploiements fréquents, plutôt que de passer des semaines à fixer un déploiement majeur qui contiendra des dizaines de nouvelles fonctionnalités dont on aura depuis longtemps oublié le fonctionnement et les tenants et aboutissants. De même pour les tests qui doivent être automatisés et le reste. Bref faites vous mal souvent, mais pas beaucoup à chaque fois. 😀
Débloque les + belles offres tech en 10 mins
Cet article vous a plu ? Vous aimerez sûrement aussi :
Julien
Moi c’est Julien, ingénieur en informatique avec quelques années d’expérience. Je suis tombé dans la marmite étant petit, mon père avait acheté un Apple – avant même ma naissance (oui ça date !). Et maintenant je me passionne essentiellement pour tout ce qui est du monde Java et du système, les OS open source en particulier.
Au quotidien, je suis devops, bref je fais du dév, je discute avec les opérationnels, et je fais du conseil auprès des clients.
Elles sont passées où les femmes dans la tech ? Entre le manque de représentation…
Dans cette vidéo, on interview Nicolas Grekas, contributeur clé de Symfony, pour discuter de sa…
Comment trouver son job dans la tech ? Marie a la réponse ! Grâce à…
Adobe, l'empire créatif, et pas des moindres ! Belle ascension de la part de ces…
Est-ce plus simple de créer des morceaux avec les outils de Musique Assistée par Ordinateur…