📘 Introduction
1. Contexte
1.1. Dichotomie développement / exploitation
Regardons comment est définie l’informatique sur Wikipédia :
L'informatique est un domaine d’activité scientifique, technique, et industriel concernant le traitement automatique de l’information numérique par l’exécution de programmes informatiques hébergés par des dispositifs électriques-électroniques : des systèmes embarqués, des ordinateurs, des robots, des automates, etc.
On distingue deux parties dans cette définition :
-
d’une part « le traitement automatique de l’information numérique par l’exécution de programmes », autrement dit : résoudre des problèmes à l’aide de programmes informatiques.
-
d’autre part « l’exécution de programmes informatiques hébergés par des dispositifs électriques-électroniques », autrement dit : un programme doit être installé sur une machine puis exécuté.
La plupart des spécialités de l’informatique − science des données, génie logiciel, traitement du langage, systèmes distribués, etc. −, s’intéressent en premier lieu à la première partie de cette définition. L’essentiel d’un parcours d’enseignement dans une formation en informatique se concentre donc en premier lieu sur cette question, à savoir résoudre des problèmes par le développement (en anglais, development) de programmes adaptés.
Cependant, comme écrit dans la seconde partie de cette définition, le cycle de vie d’un programme n’est pas terminé une fois ce dernier écrit : il est encore nécessaire de l’installer sur une machine (poste utilisateur, serveur, téléphone, capteur, montre, routeur,…) et le faire fonctionner dans un environnement particulier (matériel, système d’exploitation, conditions physiques, cohabitation ou collaboration avec d’autres programmes, …), afin d’accomplir une tâche donnée dans un contexte donné (calcul intensif dans le cloud, usage récréatif ponctuel sur téléphone, tâche de fond légère sur un serveur, …). Dans ce cours on nomme exploitation (en anglais, operations) toute la partie du cycle de vie d’un logiciel où ce dernier est déployé dans l’environnement auquel il est destiné, et est entre les mains de ses utilisateurs.
| On notera que c’est durant la phase d’exploitation qu’un logiciel va bel et bien pouvoir réellement résoudre les problèmes pour lesquels il a été conçu. |
On peut schématiser étapes traditionnelles de la vie d’un logiciel de la manière suivante :
Historiquement, le développement et l’exploitation sont associés à deux rôles généralement séparés :
-
Le concepteur / développeur de logiciel, en première ligne durant la phase de développement. Ses tâches incluent − sans ordre ni exhaustivité − d’analyser les besoins, concevoir le logiciel, mettre au point des algorithmes, sélectionner et/ou préparer des données, écrire le code du programme, écrire et exécuter des tests unitaires, compiler et/ou empaqueter un programme, etc.
-
L’administrateur système, en première ligne dans la phase d’exploitation. Ses tâches vont inclure préparer des machines (physiques ou virtuelles), installer et configurer un système d’exploitation, configurer un réseau virtuel, piloter un serveur à distance, déployer le logiciel dans le cloud, copier un fichier de configuration, puis effectuer la maintenance opérationnelle du système en exploitation.
Voyons maintenant comment s’articulent ces deux activités sous la forme d’un processus itératif :
-
À gauche, le point de départ est un ensemble de besoins qui justifient de développer un nouveau logiciel. Cet ensemble de besoins est généralement rédigé sous la forme d’un cahier des charges.
-
Ces besoins sont ensuite traduits en tâches de conception et développement, qui mènent à produire une version du logiciel attendu.
-
Une version produite du logiciel passe ensuite en test d’acceptation, aussi appelée la recette. C’est lors de cette étape que le logiciel est mis à l’épreuve dans des conditions d’usage réalistes afin de vérifier qu’il permet bien de répondre aux besoins, et qu’il ne comporte pas de défaut.
-
Si on réalise lors de cette étape que les besoins initiaux étaient mal énumérés ou incomplets, alors on repart en élaboration des besoins en vue de produire une nouvelle version du logiciel.
-
Si les tests d’acceptation ne sont pas réussis, on repart en conception et développement pour corriger le problème, ce qui donnera une nouvelle version du logiciel.
-
Si les tests d’acceptation sont réussis, on passe à l’étape suivante.
-
-
Enfin, si tout est OK, le logiciel est mis en exploitation (ce qui inclut un déploiement sur les machines souhaités) et peut être utilisé réellement. Durant la mise en exploitation, il est à nouveau possible que des défauts soient identifiés ou que de nouveaux besoins émergent, ce qui dans les deux cas entraînera là aussi une nouvelle itération de développement et de mise en exploitation.
| Dans ce cours nous faisons généralement l’hypothèse que c’est le même acteur − par exemple la même entreprise − qui développe un logiciel et le met en exploitation. Cependant c’est n’est pas toujours le cas : un grand nombre d’entreprises, collectifs et communautés ne font que développer des logiciels, qui doivent ensuite être mis en exploitation par les clients et/ou utilisateurs de ces logiciels. Une premier exemple serait un éditeur qui vend un logiciel à une seconde entreprise, qui doit ensuite se charger de mettre en exploitation le dit logiciel sur sa propre infrastructure. Un autre exemple serait un fournisseur de service qui choisisse d’utiliser un logiciel libre existant pour son service, et qui se charge donc uniquement de la mise en exploitation du logiciel, tandis que le développement est assuré par la communauté libre. |
Dans ce processus itératif, on peut voir que tout ce qui concerne la production d’une version du logiciel fait partie du domaine du développement, tandis que la mise en exploitation est du domaine de l'administration système. Les tests d’acceptation sont un peu à la frontière entre les deux domaines, car sont nécessaires pour valider une version du logiciel − ce qui concerne directement l’équipe développement − mais nécessitent pour cela de faire un premier déploiement du logiciel dans un environnement réaliste − ce qui concerne directement l’équipe administration système.
Ce qu’on peut retenir de ce processus, c’est que les deux domaines d’activité (développement et administration système) sont extrêmement dépendants l’un de l’autre, et doivent nécessairement travailler ensemble afin d’atteindre l’objectif commun : la bonne livraison du logiciel et la satisfaction des besoins.
1.2. Cas d’études utilisés dans ce cours
Pour rendre la problématique un peu plus concrète, voyons deux cas d’études élaborés pour les besoins de ce cours. Chacun de ces cas d’étude comporte une partie développement, et une partie de mise en exploitation.
| Il est possible que vous ne connaissiez pas les langages de programmation ou les outils utilisés pour développer ces deux projets. Pas de panique, il n’est pas demandé de comprendre le travail de développement réalisé sur chacun de ces deux projets ! Il vous sera simplement demandé, dans le cadre de ce cours, d’être capable de mettre en place l’intégration et l’exploitation un logiciel déjà développé, en comprenant simplement quelles contraintes il faudra satisfaire dans chaque cas. |
1.3. Organisation type et problématique
Pour mettre en œuvre le processus itératif présenté en Figure 2, une organisation type prend la forme suivante :
L’activité "développement" consiste à produire (ou améliorer) le code source du logiciel produit, et à construire une version livrable du logiciel à partir de ce code source. Pour cela, on peut distinguer deux types d’environnements :
-
l'environnement de développement est la machine sur laquelle le développeur produit des changements sur le code source.
-
l'environnement d’intégration est la machine utilisée pour intégrer tous les changements réalisés sur le code, et pour construire la version livrable du logiciel (à l’aide de compilateurs, gestionnaires de dépendances, etc.).
| Dans certains cas c’est le même environnement qui sert pour le développement et l’intégration. |
Afin de produire le logiciel attendu, un ensemble d'outils de construction doivent être déployés dans les environnement de développement et d’intégration. Ces outils incluent par exemple des compilateurs, des gestionnaires de dépendances, ou des exécuteurs de test unitaire. Il est également nécessaire "d’orchestrer" l’exécution de tous ces outils pour produire une version livrable fiable à l’issue de cette phase.
L’activité "administration système" consiste à déployer la version livrable du logiciel produite dans différents environnements, notamment :
-
l'environnement de recette, qui est utilisé pour valider la version produite vis à vis des besoins initiaux,
-
l'environnement de production, qui est l’endroit final où est installé le logiciel pour une utilisation par les utilisateurs finaux.
| Dans une organisation plus complexe, on pourra trouver également un environnement de pré-production entre l’environnement de recette et de production. |
2. Objectifs de ce cours
-
Comprendre certains enjeux liés au déploiement d’un logiciel.
-
Apprendre les bases théoriques et pratiques de la conteneurisation, une technique aujourd’hui incontournable dans tous les domaines de l’informatique pour déployer des logiciels,
-
Comprendre comment utiliser la conteneurisation pour gérer les différentes étapes de mise en exploitation d’un logiciel,
3. Références
-
Humble, Jez, and David Farley. Continuous delivery: reliable software releases through build, test, and deployment automation. Pearson Education, 2010.
-
https://fr.wikipedia.org/wiki/Informatique (consulté le 24/08/2023)