Comme vous vous en doutiez, le mot DevOps est la concaténation des trois premières lettres de Development et Operations, et illustre ainsi l'union du développement et de l'exploitation.
Historiquement, ces deux aspects de l’informatique sont des entités complètement séparées au sein d’une entreprise. De part leurs nombreuses différences opérationnelles et l’hétérogénéité des profils, il semblait plus facile et naturel de les gérer séparément et donc de répartir les responsabilités entre chacun des deux pôles.
Cependant la séparation du développement et de l’exploitation pose un problème évident : Le mur de la confusion.
Le mur de la confusion est un mur imaginaire qui sépare l'équipe de développement de celle d'exploitation. Ce mur représente la différence d'objectifs des deux pôles :
Une oppositions se crée ainsi entre les deux équipes :
Toutefois, depuis 2010, en parallèle de l’essor des méthodes agiles et d’une volonté croissante de plus de flexibilité et de vélocité, un mouvement voulant rassembler ces deux équipes a pris de l’ampleur : le DevOps. Introduit comme la solution à ces conflits il permetrait de casser ce mur, et de réunir les objectifs de ces deux équipes historiquement concurrentes.
Par contre pour intégrer le DevOps au sein de ses équipes, il est nécéssaire d'atteindre une certaine fluidité et un certain niveau d’industrialisation entre le développement et l’exploitation. Pour cela, il faut adopter à minima de nouveaux processus au sein de vos équipes :
Jenkins est un outil open source d’intégration continue. Il permet entre autres l’automatisation de tâches en fonction de l’activité sur votre outil de versioning. Il peut se brancher aux principaux outils de versioning : GIT, SVN, CVS.
C'est tres souvent le premier outil DevOps a être déployé lors de la mise en place des process.
Dès qu’un développeur met à jour l’application, Jenkins peut le détecter et lancer un ensemble de tâches prédéfinies. On a alors un récapitulatif des tâches exécutées afin de savoir si l’ensemble des tâches a bien été effectué.
Grâce à l’installation de Jenkins, on a ainsi la possibilité d’ajouter des tests et déploiements automatisés à chaque nouvelle version de l’application et ainsi grandement réduire les risques de régressions.
Les tests unitaires permettent de vérifier que le fonctionnement de l’application est toujours celui attendu. C’est une vérification “fonction par fonction” ou “brique par brique”, ainsi chaque test unitaire ne teste qu’une petite partie de l’application.
Ces tests demandent une certaine discipline mais doivent être mis en place par les développeurs tout au long du processus de développement.
A chaque développement, il faut donc les ajouter ou les mettre à jour afin qu’ils coïncident avec les nouveaux développements déployés sur l’application.
Les outils pour développer des tests unitaires sont nombreux et dépendent du langage utilisé : PHPUnit, JUnit, JSUnit, …
SonarQube est un logiciel open source permettant l’analyse de votre code supportant un tres large panel de langages.
Il analyse l’ensemble du code (moins certaines exclusions paramétrables) et remonte différentes mesures :
SonarQube possède énormément de configurations et l'ensemble de ses remontées sont paramétrables pour correspondre au mieux avec votre application.
Il dispose aussi de profils de qualité pouvant être ajoutés à votre projet. Ces profils contiennent différentes règles à vérifier selon le langage ou framework sélectionné. On peut trouver par exemple des profils Drupal, Magento, Java, etc...
Une fois l’ensemble des précédents tests passés, il est temps de passer au déploiement de l’application sur un serveur de test. Ce déploiement automatique, effectué par Jenkins, est donc à mettre en place après les tests unitaires et l’analyse de SonarQube.
Une fois l’application livrée sur un environnement de test, il advient au client ou à l’équipe de test et qualité d’effectuer les tests fonctionnels. Cela permet de vérifier que l’application correspond fonctionnellement aux besoins du client et ne souffre d’aucun bug.
Pour les plus professionnels et les plus aguerris d’entre vous, vous pouvez néanmoins mettre en place des tests fonctionnels automatisés. Cela rendra la tâche plus simple pour l’équipe de test. Pour bien comprendre la mise en place de ces tests automatisés, il faut savoir que les tests fonctionnels sont généralement divisés en deux catégories :
Très peu coûteuse, la mise en place de Jenkins et SonarQube comme socle de votre intégration continue augmente drastiquement la qualité du code et la vélocité de vos projets. Cette véritable industrialisation de la qualité vous assure de retrouver la confiance dans vos processus de développement et mise en production.
Nous utilisons systématiquement ces pratiques et vous encourageons forcement à les déployer au sein de vos projets.
Dans un contexte de société de service, le sujet des tests unitaires est plus épineux. Soyons clair, l’utilisation systématique des tests unitaires couplée à leurs automatisations transporte votre niveau de vélocité et d’agilité à un niveau incomparable. Par contre d’expérience il faut compter environ 30% de charge de travail supplémentaire et malheureusement dans des contextes de projet difficile ou avec des contraintes budgétaires serrées, trop souvent les clients font le choix de préférer une solution moins chère plutôt qu’une solution plus agile, maintenable et véloce.
Le compromis que nous proposons est de cibler les fonctionnalités critiques du projet et de déployer les tests unitaires uniquement sur ces parties.
Et vous, quel est votre retour sur expérience sur les sujets DevOps ?
Avez-vous réussi à force de pédagogie et d’arguments à convaincre vos clients de préférer la qualité au jetable ?
A très vite !