CI / CD
Cédric BRASSEUR
(Mis à jour le 29/06/2025)
Introduction CI/CD en entreprise
Historique, objectifs
Le mouvement DevOps
Les gestionnaires de code source
Centralisé / Décentralisé
Prise en main de git
Les revues de code
Intégration en continue
Définition & étapes (build, lint, tests)
Les différents outils
Mise en place d'intégration continue avec github actions
Vérifier en continue
Les tests, leur utilité, l'implémentation et leur automatisation
L'analyse sécurité : audit et analyses automatisés
Déployer en continue
Objectifs et outils
CI/CD
Aujourd'hui, l'informatique a une place importante dans les entreprises et il est important de pouvoir accélérer tous les processus menant à la mise en production d'une évolution ou d'une nouveauté pour l'entreprise.
Les besoins changent en fonction du temps… Vos applications doivent suivre !
Développements, vérification des tests unitaires, vérification syntaxique (ESLint),...
Déploiement rapide et le plus automatisé possible, retours clients, gestion des bugs, demande d'évolutions...
L'intégration continue a pour objectif de faciliter la tâche aux développeurs pour gérer leur code source et réaliser les tâches tout en rajoutant une couche de sureté avec différents tests automatisés.
Problématique : Est-ce que la modification apportée dans le code est valide par rapport au besoin et dans le contexte déjà existant ?
C'est l'heure de délivrer nos développements aux clients.
Le travail de vérification effectué en amont et l'utilisation d'outils appropriés permettent d'avoir un système de déploiement automatisé (Un seul clic devrait suffit pour délivrer sur l'environnement de production).
Pour la plupart des projets, il est important de cloisonner les environnements. D'une part pour ne pas mélanger des données de tests et des données de production, mais également pour pouvoir y faire tourner des versions différentes. Dans le but de pouvoir les tester en contexte avant chaque mise en production.
Voici les environnements minimums couramment utilisés :
Le déploiement est différent dans un cycle en V, il n'a pas de raison d'être effectué régulièrement.
Il n'est effectué qu'une fois en phase finale, ce qui rend le processus très lourd pour la moindre modification.
Ici, le client est investit lors de la phase de développement et les remontées sont interceptées sprint par sprint pour fournir une nouvelle version rapidement.
C'est pourquoi nous allons voir le déploiement continue.
Nous allons voir quelques exemples d'outils durant la formation, mais il faudra que vous vous adaptiez par rapport au contexte du projet que vous voulez déployer en continu.
On choisit en fonction de :
Il va de soit que pour déployer en continue efficacement, il faut que la méthodologie de projet soit adaptée.
L'équipe doit l'être également !
(Tout en devant gérer la résistance au changements)
L'équipe se compose de :
DevOps est un mouvement qui a été instauré afin de mieux répondre aux besoins d'agilités et d'évolutivité des projets.
Concrètement, c'est faire sauter la barrière entre les équipes de développement et les équipes opérationnelles et réduire le "Time To Market"
Principes CALMS
Retour au rapport avec l'agilité plus en détails
Le mouvement DevOps a essentiellement été mis en place pour répondre aux besoins des méthodologies agiles.
Le client étant impliqué dans les sprints, souvent à la fin lors de la sprint review, il aime avoir un visu sur l'avancement du projet.
Imaginez, sans DevOps et CI / CD, comment montrer quelque chose de nouveau au client toutes les 2 semaines ?
On souhaite réduire les risques lors des déploiement mais aussi automatiser le déploiement au maximum.
Dev
Ops
Deployer sur les serveurs
Marche à suivre de déploiement
Sans DevOps
Barrière de communication
Dev
Ops
Déploiement automatisé sur les serveurs
Dossier de déploiement
Avec DevOps
Git (Gestionnaire de code source)
Docker, kubernates, ...
Développements, tests, ...
Environnements communs
Nous n'aurons évidemment pas la possibilité de voir tous les éléments de la roadmap du bon DevOps, mais je vous invite à vous y referrer pour progresser, elle est complète et très intéressante sur les notions associées au DevOps.
Un gestionnaire de code source est utilisé afin de pouvoir gérer le code source en :
Systématique pour chaque projet !
Un gestionnaire de code source à de multiples intérêts :
Un serveur conserve les anciennes versions des fichiers et les développeurs s’y connectent pour prendre connaissance des fichiers qui ont été modifiés par d’autres personnes et pour y envoyer leurs modifications.
(CVS, SVN, TFS, Subversion...)
Il n’y a pas de serveur, chacun possède l’historique de l’évolution de chacun des fichiers. Les développeurs se transmettent directement entre eux les modifications.
(Git, mercurial, bazaar,...)
Git est un gestionnaire de code source Open Source très utilisé dans le monde de l'informatique, quelque soit le domaine.
Il a pour objectif de répondre au besoin de versionning des sources et de la gestion des modifications réalisées sur celui-ci tout en gardant l'historique de tout ce qui est effectué et par qui.
Attention de ne pas confondre Git avec GitHub ou avec GitLab que l'on va utiliser durant la formation.
Entièrement gratuit (dans sa version de base)
L'utilisation massive de git a ses raisons...
Open source
Extrêmement rapide
Scalable
Gère les branches et le merging
Afin de comprendre git, il faut assimiler les différentes aires de travail et leurs utilités respectives
Répertoire local
(Workspace)
"Staging area"
Espace intermédiaire
Répertoire distant
(Serveur / Cloud)
Add + Commit
Push
Clone / Pull
Git fonctionne de manière assez linéaire car il lie concrètement des versions créées à un moment T par rapport à une référence effectuée à un moment Y.
Main
Nous allons essentiellement avoir des commits simple pour la formation, gardez bien en tête les bonnes pratiques suivantes pour l'utilisation réelle de git sur un projet
Pour plus d'informations & aller plus loin : https://github.com/angular/angular/blob/master/CONTRIBUTING.md#-commit-message-format
Afin de rendre les messages de commit utiles et faire refléter le contenu qu'ils apporte (ou supprime / modifie) du projet, il existe différentes normes pour les messages de commit.
Voici quelques règles que j'applique sur mes commits :
Vous pouvez maîtriser quels fichiers / dossiers seront pris en compte par votre gestionnaire de code source grâce à un fichier .gitignore à la racine de votre projet git.
Voici un exemple de contenu de fichier .gitignore
Il est donc possible et nécessaire de retirer de son gestionnaire de code sources les éléments qui ne doivent pas être publiés !
Exemple, dépendances, fichier environnement, médias,...
.env
/node_modules/
/uploads/
Nous allons installer git :
Normalement, ça s'adapte à votre OS directement :
Ensuite, nous allons vérifier que l'installation s'est bien passée en utilisant la commande
Si tout est bien installé, votre terminal devrait vous donner la version. Pour ce qui est du terminal, je conseillerai à tous d'installer VSCode, il est très utile et je vais l'utiliser tout au long de la formation.
Du coup, vous pouvez directement ouvrir un terminal dans VSCode pour exécuter cette commande.
git --version
Maintenant que git est installé, on va créer un dossier "formation" quelque part en local.
Ouvrez ce dossier dans VSCode, puis ouvrez un terminal (CTRL+ù ou affichage ==> terminal).
Premièrement, nous devons configurer git à l'aide des deux commandes suivantes
Nous allons initialiser notre projet git en effectuant un
(Assurez vous bien d'être dans le bon dossier)
Ensuite nous allons créer un fichier, par exemple README.md et on va créer une version avec ce fichier.
git config user.name "VotreNom"
git config user.email "votre@email.com"
git init
git add README.md
git commit -m "Message explicatif sur le commit, souvent en anglais"
Nous pouvons accéder au statut d'un repository git avec la commande
git log --oneline --stat --graph
git status
Afin de pouvoir se repérer ce qu'il en est de notre historique de commit, nous pouvons utiliser la commande
A noter que les paramètres sont optionnelles et apportent plus ou moins de précisions dans le rendu de la commande.
Nous allons voir également durant la formation un certain nombre de paramètres pour chaque commande git. Ils ne sont pas tous listés dans ce support. Donc n'hésitez pas à prendre des notes ! Même si j'ai tenté de vous mâcher un peu le travail ICI, l'intégralité des commandes git n'est pas couvrable.
Permet de savoir
les différences entre votre local et votre staging area
Vous allez faire un exercice simple d'utilisation de git sans utiliser github pour l'instant.
Envoyer le fichier Exercice1.md
Nous ferons un corrigé ensemble par la suite.
GIT
Vous allez faire un exercice simple d'utilisation de git sans utiliser github pour l'instant.
Envoyer le fichier Exercice2.md
Nous ferons un corrigé ensemble par la suite.
GIT
La branche est une fonctionnalité de git permettant d'avoir un espace de travail séparé et isolé de la version de code source principale (branche main / master).
Lorsque l'on travail sur une nouvelle feature, on veut pouvoir travailler de manière isolée. Ceci permettant de garder la branche principale dans un état le plus stable possible.
Extrêmement rapide car c'est un simple pointeur vers un commit. (Sous forme de micro fichier)
main
feature
Ce sont donc directement des références vers des commit qui sont utilisées pour pouvoir connaître le contenu d'une branche. Et notre code principal se trouve "toujours" sur la branche main (ou master).
main
feature
HEAD
HEAD
Permet de savoir
sur quelle branche on est placé dans le workspace local
(C'est aussi un micro-fichier)
Quelques règles de nommages peuvent être mises en place pour le nommage et la gestion de vos différentes branches :
Git utilise deux moyens différents pour fusionner le contenu de deux branches : Le fast-forward et le 3-way merge.
Il nous est possible de réaliser des fusions de branches de plusieurs façons.
Fast forward merges
Permet de simplement déplacer le pointeur de commit de la branche main vers le commit voulu de la branche bugfix.
Ceci n'est possible que si la branche de départ n'a pas été modifiée depuis.
main
bugfix
Fast-Forward : On se place sur la branche main puis on déplace le pointeur de main sur le commit de bugfix.
git merge bugfix
3-way merges
Utilise 3 commit pour réaliser un commit de merge permettant de prendre en compte toutes les modifications qui ont été faites sur les deux branches en simultané.
main
bugfix
3-way Merge : 3 commits sont utilisés pour réaliser un commit de merge.
git merge bugfix
main
Merge commit !
M1
B1
B2
M2
M3
MRGC
Squash merging
Le squash merge permet de rendre l'historique plus propre dans le cas où il peut être intéressant de regrouper les commits d'une branche afin d'en faire un seul commit.
main
bugfix
git merge --squash bugfix
main
B1
B2
B1 + B2
La branche peut ensuite être supprimée !
Rebase
La dernière possibilité est le rebase, cette commande git réecrit l'historique de vos commit. Attention lors de son utilisation.
L'intérêt est de changer le commit de base d'une branche afin de pouvoir avoir un ligne directe dans sont historique git.
git switch bugfix
git rebase main
Nous allons voir un exemple, le schéma est très linéaire on démarre de deux branches qui divergent pour finir avec une seule ligne car on modifie le commit de départ avant création de la branche.
main
Nous allons maintenant effectuer le même principe en rajoutant une notion de branche et de fusion de ces branches par la suite.
Nous allons commencer par créer une branche ajouterTexte et nous placer dessus
Réalisez une modification dans le texte du README.md, faites le git add, puis le git commit.
Effectuez un
Vous remarquez que votre branche ajouterTexte est en avance par rapport à votre branche main. On va donc tout simplement se placer sur main, merger notre branche puis la supprimer.
git branch ajouterTexte
git checkout ajouterTexte
git log --graph --oneline
git checkout main
git merge ajouterTexte
git branch -D ajouterTexte
Comment gérer un conflit ?
(Utiliser un 3-way merge)
Nous avons vu un cas simple sans conflit, maintenant nous allons voir comment ça se passe s'il y'a conflit entre les branches que l'on veut fusionner.
On créer une branche conflit. On fait une modification sur README.md, on add, on commit sur la branche conflit.
On git checkout main et on fait une autre modification sur ce même fichier on add et on commit sur main.
Maintenant si on fait un on voit qu'un conflit est détecté par git. En ouvrant le fichier en conflit il propose directement les deux options.
Vous pouvez alors modifier le fichier, sauvegarder et utiliser la commande
git rebase conflit
git rebase --continue
Vous allez faire un exercice simple d'utilisation de git sans utiliser github pour l'instant.
Envoyer le fichier Exercice3.md
(Question 11 optionnelle)
Nous ferons un corrigé ensemble par la suite.
GIT
La commande git reset
Plus les conflits sont nombreux, plus ils sont difficiles à gérer et il arrive souvent que des erreurs de merge provoquent des "catastrophe". Mais ceci est assez aisément inversable.
Répertoire local
(Workspace)
"Staging area"
Espace intermédiaire
Répertoire distant
(Serveur / Cloud)
git reset --hard HEAD~1
git reset --mixed HEAD~1
git reset --soft HEAD~1
Soyez prudent avec cette commande...
La commande git stash
Afin de ne pas être gêné par les développements locaux, il est possible de sauvegarder vos dévs dans un espace particulier, la stash.
Création stash
Réappliquer une stash
Liste des stash
git stash push -m "Stash informations"
git stash list
git stash pop
Supprimer une stash
git stash drop 0
La commande git stash
Si on a le temps, vous pouvez pratiquer ce que l'on a vu avec les jeux éducatifs sur git suivant :
Jusqu'ici, nous n'avons travaillé qu'en local et avec notre staging area, maintenant nous allons faire en sorte que notre répertoire git soit lié à un répertoire distant que l'on pourra partager avec nos collaborateurs.
Répertoire distant
(Serveur / Cloud)
Nous allons faire un petit tour d'horizon de Github et des fonctionnalités proposées.
Utilisation de GitHub pour la création du repository (dépôt distant) :
git clone git@github.com:cbrasseur/Formations.git .
Je vous laisse un peu de temps pour revoir tout ça de votre côté.
Et ça vous permettra de prendre le temps de me poser des questions.
(Pensez à prendre le lien de votre repo sur la commande ci-dessus)
Une bonne pratique et un moyen efficace d'intégrer une revue de code dans votre processus d'intégration continue est d'utiliser les Merge / Pull requests (c'est la même chose, ça dépend juste de l'outil utilisé pour le nom)
Ces dernières permettent de forcer l'attente d'une validation par un ayant droit avant de fusionner quoi que ce soit sur la branche principale.
Voyons rapidement un exemple ensemble sur github.
Petite aparté sur les fork...
Toujours réaliser une revue de code à cette étape !
Github propose la possibilité de reporter un bug ou une demande d'amélioration de votre projet grâce aux issues git.
Ces issues peuvent être directement liés aux pull request afin de clotûrer ces issues.
Nous allons faire un exemple ensemble afin de voir comment pourrait être utilisée cette fonctionnalité.
Créer une issue git
Push un bugfix
Associer la fermeture de l'issue lors de la pull request
Github propose également la possibilité d'ajouter des milestones. Ceci étant une fonctionnalité permettant de regrouper des issues afin de planifier par exemple les travaux restants pour une montée de version.
Il permet de planifier, suivre l'avancement en fonction des issues qui sont fermées, etc...
Voyons un exemple...
Une autre fonctionnalité concerne les tags git, permettant de pointer une version par rapport à un commit.
A cette étape, github génère les sources de notre projet.
Il nous est également possible de générer une realase version de notre projet.
Voyons un exemple...
Et voici un lien contenant les normes pour la gestion des versions
Vous allez faire un exercice simple d'utilisation de git, cette fois-ci, nous allons avoir besoin d'un répertoire distant avec GitHub.
Envoyer le fichier Exercice4.md
Nous ferons un corrigé ensemble par la suite.
GIT
Faisons ensemble un workflow plus complet d'utilisation de git.
Nous allons ajouter la notion de branche develop à notre utilisation de git.
Petite démo + A vous d'appliquer ce que l'on a vu ensemble
(Je n'ai pas encore créé d'exercice guidé sur cette partie, alors on va prendre des notes durant la démo pour vous aider)
Il existe des outils graphiques pour représenter sous forme d'arbres vos projets git.
Par exemple, sourceTree est un des outils les plus utilisés pour utiliser git graphiquement.
Ce type de gestion peut permettre à des développeurs non expérimentés de travailler avec git plus facilement.
Supporte gitflow graphiquement
Cette évaluation sera faite en groupe de 2 ou 3 (Idéalement votre groupe de projet), vous allez devoir développer un jeu au tour par tour.
L'objectif est surtout de mettre en place git, les pull requests, les revues de code et avoir un repo git bien entretenu entre les membres de l'équipe de travail.
Bon courage !
Envoyer Git_eval.md
Votre objectif maintenant est de mettre en place git, si ce n'est pas déjà fait, sur votre projet Cube pour toute votre équipe.
Créez le repository sur GitHub, partagez vous les droits d'accès, faites quelques tests de git sur des commentaires pour vérifier que ça fonctionne comme il faut.
Cette étape ne prend pas énormément de temps mais il faut qu'elle soit faite pour tout le monde donc prenez le temps nécessaire pour faire ça correctement.
Prévenez-moi en cas de difficultés ou pour toute question !
L'intégration continue a pour objectif de faciliter la tâche aux développeurs pour gérer leur code source et réaliser les tâches tout en rajoutant une couche de sureté avec différents tests automatisés lors des merge (push, ...).
Pour notre CI, on va mettre en place un serveur qui va avoir pour objectif d'ajouter des étapes supplémentaires à notre validation de merge :
Si on prend le cycle agile, par sprint l'idée et de pouvoir intégrer du code à notre gestionnaire de code source et réaliser des versions contrôlées de notre applicatif.
Lors de l'opération de merge (ou pull request) on va utiliser les informations mises en évidence dans github pour réaliser une revue de code avant de valider le merge ou le rebase sur la branche principale.
On pourra donc livrer régulièrement des nouvelles versions vérifiées par le "product owner" ou le "tech lead".
Grâce à un fichier .yml contenant les scripts et configurations à exécuter, on peut intégrer en continu les nouvelles sources. Même en cas d'update des dépendances.
L'intégration continue nous permet la gestion du build automatisé et donc mettre à jour les dépendances de la branche principale après un merge / pull request.
Elle permet également la vérification syntaxique (eslint par exemple), fiabilité, qualité et sécurité de votre application.
Si une erreur est détectée, le déploiement n'est pas possible !
Ce que vous devez savoir, c'est qu'aujourd'hui de nombreux templates .yml existent pour toutes sortes de technos. Mais il faut très souvent l'adapter à son contexte.
Cheat Sheet
GitHub Actions
Un petit exemple simple de CI...
Attention,
l'indentation est normée et provoque des erreurs si non respecté
Attention,
l'indentation est normée et provoque des erreurs si non respectée
Attention,
l'indentation est normée et provoque des erreurs si non respecté
on
Défini l'action déclencheur de la CI
Attention,
l'indentation est normée et provoque des erreurs si non respecté
jobs
Défini la plateforme d'exécution et les étapes de la CI
Nous allons voir rapidement comment utiliser GitHub et une CI simple pour analyser du code pour l'instant syntaxiquement, plus tard également en y intégrant des tests automatisés.
Sans rentrer trop dans les détails pour l'instant, c'est de la configuration et du travail de mettre en placer un "linter" efficace.
Prenons l'exemple Sample_Node sur GitHub.
Pour notre intégration continue, il faut également choisir les outils que l'on souhaite utiliser. Il en existe beaucoup trop pour les lister, mais en voici quelques-uns.
L'objectif final de ces tests est qu'ils soient intégrés à notre CI pour qu'ils soient passés automatiquement et nécessairement au vert pour pouvoir merger vers une branche principale.
Workshop guidé (envoyer WS_CI_GitHub_Node.docx)
Avec GitHub et Jest sur un test unitaire extrêmement simple. On en profitera pour linter correctement en même temps.
On va mettre en place la CI complète avec GitHub et les GitHub Actions.
Une des problématique qui se pose avec l'intégration et le déploiement continue, est la gestion des montées de version de vos bases de données.
Comment s'assurer que votre base de données est toujours dans la bonne version par rapport à la merge request en cours d'acceptation ?
Comment fonctionne un outil de gestion de versionning de base de données ?
C'est souvent un projet "console"(où de tests unitaires par exemple), qui va avoir en dépendance l'outil de versionning lui permettant de :
Ceci permettant de mettre à jour la base de données et d'exécuter les scripts en fonction de ce qui passe dans la merge request.
Démo SonarCloud
Réalisez une CI complète (sans linter) sur votre projet de combat "The Greatest Warrior".
Je vous demande de réaliser le démarrage de la CI via une pull request et d'y intégrer une revue de code avec un collègue dans github (au moment de créer la pull request, ajoutez un reviewer).
L'objectif premier de réaliser des tests sur son application est de limité d'envoyer des erreurs en production.
On va donc tester les développements réalisés à chaque changement et surtout avant chaque mise en production, ce qui rend l'application plus robuste mais ne la rend pas infaillible.
Pour choisir quels outils utilisés pour réaliser nos tests, il faut une fois de plus se référer à la technologie et le contexte du projet.
Quelques exemples... (Mais il y'en a trop)
Je vous invite à chercher ceux qui peuvent correspondre à vos technologies habituelles ou d'entreprise.
Il existe de nombreux tests différents, en voici les principaux et ceux que l'on va voir ensemble
Autres types de tests : Tests de montée en charge, tests d'exploitabilité, vérification de disponibilité immédiate…
Un test unitaire est utilisé afin de pouvoir vérifier atomiquement que chaque élément de notre code. On va donc vérifier que le code produit bien le résultat attendu.
A savoir :
Réalisez une CI sur Github
Votre objectif est de mettre en place une TDD afin de pouvoir mettre en place une CI (GitHub Actions recommandé) sur un projet super simple permettant d'afficher le résultats de calculs :
Réalisez le projet en TDD afin de vous assurer des tests unitaires (TDD optionnelle)
Une CI qui va lancer votre build, vos tests ainsi que votre linter !
Donnez-moi un accès (en lecture au moins) au repo github pour que je puisse regarder votre travail
L'idée ici, va être simple, on veut gérer un menu simple
Les tests à effectuer sont les suivants :
Le but est d'abord de réaliser les tests, puis développer notre menu.
Le code corrigé est fait en TDD avec NUnit, nous pourrons prendre le temps de le refaire en TDD ensemble pour appréhender la méthodologie.
Un test d'intégration permet de vérifier qu'il n'y a aucune régression sur l'existant suite aux modifications effectuées. (En termes de dépendances entre les éléments de votre appli)
A savoir :
Concept issu de la POO permettant de limiter les conséquences des interactions entre les éléments de votre projet.
Il en existe 3 types :
La pratique la plus répandue aujourd'hui est de coupler l'injection par interface et l'injection par constructeur.
Les tests d'acception permettent de vérifier que les scénarios utilisateurs définis à l'expression de besoin respectent bien les étapes et le résultat attendu.
A savoir :
Behavior Driven Development
Les tests d'interface vérifient que les développements sont cohérents et fonctionnent sur toutes les plateformes cibles (par exemple, dans le web on vérifie chaque navigateur)
A savoir :
Les tests de performances font exactement ce que leur nom indique, on parle aussi de tests de charge, tests d'usine,...
A savoir :
Les tests sont une part importante des développements dans un projet et également une part importante de sa réussite.
L'estimation moyenne du pourcentage de temps (selon moi, j'ai cherché mais je n'ai pas trouvé d'étude) pris pour réaliser les tests sur un projet est compris entre 30% et 50% du temps !
D'où l'intérêt de la TDD, plus d'aller retour entre les développements et les tests, les tests sont effectués au départ et les développements s'adaptent pour y répondre !
Vous avez beaucoup de travail à réaliser sur les tests pour votre projet Cube. Je vais vous laisser 2 heures pour travailler sur les tests du projet Cube et me poser des questions.
Ajoutez des tests unitaires à votre projet de jeu.
Vous devriez trouver une 10aine de tests à réaliser, si besoin, vous pouvez me demander mais je préfèrerai que vous cherchiez.
Lorsque vos dix tests passent en local, votre objectif est de rajouter une CI complète sur votre projet avec GitHub Actions.
Pensez à l'étape de linting (analyse syntaxique)
N'oubliez pas la notation se fera en partie sur cet exercice
Nous allons prendre le temps de parcourir le corrigé ensemble et je vais vous envoyer le projet et vous laisser un peu de temps pour le regarder, les différents tests etc...
Vous pouvez en profiter pour modifier le comportement du jeu, mais faites le en TDD !
En fonction du temps qu'il nous reste, je vais vous laisser vous regrouper et réfléchir à votre CI du projet Cube.
Vous pouvez commencer à documenter votre CI en expliquant chaque étape rapidement (son utilité et où ça se trouve dans votre script de CI). Cette documentation vous sera utile car elle sera demandée dans le dossier de déploiement / d'exploitation.
Si vous n'avez pas encore mis en place de tests unitaires sur votre projet, c'est le moment ! Faites un test quelconque, intégrez le test à votre CI.
Il vous faut trouver la commande qui exécute les tests selon vos technologies et votre environnement.
Le déploiement est la suite logique de l'intégration continue.
L'objectif est de mettre en production de manière automatisée (ou la plus automatisée possible), monitorer et alerter en continue.
Méthodes agiles VS cycle en V
Différents outils peuvent être utilisés :
Comme expliqué, l'objectif premier est de livrer en production de manière automatisée après que notre CI valide ce qui doit être déployé. On doit également pouvoir monitorer (logger en continue) et alerter en continue.
Objectifs :
Petit exemple de mise en place d'un déploiement continue simple et automatisé avec GitHub Pages.
Voir exemple hello_world.
A vous de faire de même ! Vous devez effectuer la même chose (en js, ou sinon faite une simple page html, sans test tant pi, nous l'avons déjà travaillé !)
Vous pouvez repartir du repo github de la CI en Node.js effectuée précédemment. Ajouter un fichier index.html avec du html dedans et il suffit d'ajouter la partie github pages dans votre fichier .yml afin d'intégrer le déploiement continu.
https://www.youtube.com/watch?v=hNRxn5sKOdE
Exemple de monitoring en continue sur un projet en production (Gallus, sur render).
Exemple de CI que j'utilise aujourd'hui. Exemple avec gallus-app et GitHub Actions. (Celle-ci est propre et réutilisable pour d'autres projet Vue)
Un petit Exemple avec heroku.
Nous allons voir un exemple complet avec Azure DevOps.
CI/CD
Docker est un outil de conteneurisation, adapté à toutes les plateformes, il va permettre d'utiliser la virtualisation afin de créer des conteneurs utilisant des images.
Il nous faut l'installer, ça va prendre un certain temps. Soit Docker Desktop (Windows, Mac) soit Docker via apt-get (Unix). Un outil en ligne existe : play-with-docker
A savoir, WSL a été intégré à Windows et Docker peut utiliser le WSL de Windows (pratique, mais gourmand !!).
L'utilité première est de pouvoir avoir un environnement défini et commun ainsi que pouvoir paramétrer ces environnements de manière sécurisée. On peut facilement simuler l'utilisation d'une machine Ubuntu, avoir un environnement Node, créer un serveur minecraft...
Lister les conteneurs :
docker ps -a
Lister les images :
docker image ls
Builder un container :
docker build -t image-name
Démarrer un conteneur :
docker run -p 8080:2368 ghost
Démarrer un conteneur avec un volume :
docker run -v localFolder:containerFolder containerName
Supprimer un conteneur :
docker rm -f containerName (ou containerId)
Supprimer une image :
docker rmi imageName (ou imageId)
Démarrer une invite de commande dans le conteneur :
docker exec -it containerName bash
Voici une feuille de triche contenant toutes les commandes docker, que ce soit pour du docker simple, du docker-compose ou du dockerfile :
https://dockerlabs.collabnix.com/docker/cheatsheet/
On va faire un exercice ensemble sur Docker pour nous familiariser avec l'outil.
Exemple en workshop guidé avec MySQL.
Utilisation des commandes :
Démarrer un conteneur Mysql
- docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
Lister les conteneurs
- docker ps -a
Entrer en ligne de commande sur le conteneur (containerId est trouvable via la commande précédente)
- docker exec -it containerId mysql -p
Stopper un conteneur
- docker stop some-mysql
Supprimer un conteneur
- docker rm -f containerId
Démarrez par suivre les 4 tutos de docker dans "Learning Center".
Ensuite, faites le tuto par rapport à la technologie de votre choix.
Puis faire l'exercice en ligne de commande suivant.
Envoyer le fichier d'exercice démarrer un conteneur avec docker
Run-a-container.md
Exercice avec ports et mise en place de volume ainsi que copie de fichiers via lignes de commande
Work-with-containers.md
Créer sa propre image en utilisant un Dockerfile.
Ce fichier va permettre d'utiliser une ou plusieurs image pour créer votre propre conteneur.
Builder un conteneur : docker build -t <tag> .
Démarrer un conteneur : docker run <tag>
Réalisons ensemble notre premier container pour lancer un script javascript (supposons que c'est une application simple en js)
Comment réaliser la même chose depuis Docker ?
Ceci se fait en plusieurs étapes, très simples :
Les commandes à lancer : docker build -t nom-image .
& docker run nom-image
Getting started with Docker :
On va clone git@github.com:docker/getting-started.git
Ensuite, on va ouvrir le dossier app avec VSCode.
On va créer un fichier Dockerfile :
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000 (< Exposition port 3000 dans le conteneur, pour le -p 3000:3000)
Puis build le container docker build -t getting-started . (Pensez à être dans le dossier app & n'oubliez pas le . dans la commande)
Et on finit par run le container docker run -p 3000:3000 getting-started Puis on va sur localhost:3000/
Regardez les tests unitaires du projet
Docker compose nous permet d'avoir une CI dans Docker. On commence à savoir ce qu'est une CI, alors prenons directement un exemple.
1. Vérifier que vous possédez docker compose (Inclus avec Docker Desktop, mais à installer manuellement sur Unix)
docker-compose --version
2. Clonez ce repo :
git clone https://github.com/nigelpoulton/counter-app .
3. Utilisez la commande :
docker-compose up
4. Rendez-vous directement sur :
http://localhost:5000/
5. Magique n'est-ce pas ? Rien à faire à part une commande pour démarrer un projet !
Quelques commandes utiles :
Sur ce workshop, je vous demande d'utiliser docker-compose pour mettre en place un conteneur avec :
Vous devez créer le fichier docker-compose.yml permettant de mettre en place un environnement :
C'est pas si facile, mais on corrigera ensemble après ne vous inquiétez pas si vous avez du mal.
Documentation et mise en place d'une CI / CD avec Docker
Suivez la documentation présente ici pour mettre en place un déploiement avec Docker
CI/CD avec docker-compose (& github actions)
Envoyer le workshop WS_CD_Docker_Minecraft.docx
Nous ne ferons pas ce workshop car il est très gourmand en ressources et pose souvent problème, mais on peut regarder rapidement ce qu'il faut mettre en place et je vous donnerai accès au repo de mon corrigé.
Suivre le workshop guidé Deploy_with_render.md
Ces conteneurs sont donc plus facilement réutilisables dans un autre projet.
Voir schéma sur draw.io
Rappelez-moi de vous envoyer le schéma en fin de formation !
Nous mettons en place un déploiement continue lorsque de nombreux déploiement sont à prévoir.
Cette mise en place de CI / CD a un coût, mais il faut aussi savoir que déployer manuellement a également un coût et est source d'erreur. Aujourd'hui, toute application tend à viser le déploiement continue et automatisé.
Les objectifs finaux à retenir sont surtout le monitoring, l'alerte en continue et le paramétrage des données constantes des environnements.
Réalisez un déploiement continu, trouvez un outil adapté à votre projet, essayez de le déployer en continu.
Je ne vais pas cacher que certains auront plus de facilité que d'autres, je saurai en aider certains. Pour d'autres, j'essayerai en tous cas.
A minima, je souhaite avoir la marche à suivre (Les outils, les éléments à remplir etc...) pour réaliser une CD sur votre projet. Expliquer les avantages de ce déploiement continu.
Facilité pour PHP, JS, .Net.
Bon courage !!
N'oubliez pas la notation se fera en partie sur cet exercice
Je vous propose de m'envoyer vos documents que vous utiliserez pour votre soutenance, je vous fait un retour dessus.
Durant ce temps, je vous propose de vous focaliser sur votre projet Cube, c'est la dernière ligne droite pour vous alors prenez le temps de bien faire les choses.
Envoyer Linux-Commands-Cheatsheet-FR.pdf
Un premier exercice vous permettra de travailler les commandes Unix sous forme de jeu.
Envoyer gameshell_Docker.md
Unix
Un second exercice vous permettra de travailler les commandes Unix sous forme de jeu.
Accessible via ce lien :
Unix
Voici un fichier contenant un ensemble de commandes que vous devez trouver !
Un peu moins guidé et plus complexe que les deux exercices précédents
Envoyer Exercices_Shell.md
Unix
Le sysadmin a un rôle critique dans le bon déroulement d'une approche DevOps pour un projet :
Réalise et configure l'infrastructure
Automatisation du processus de déploiement
Monitorer et logger
Sécurité
Collaboration
Cette première étape est primordiale pour le bon fonctionnement d'un projet à moindre coût.
Définir les besoins en infra
Choisir un outil de provisionnement : Terraform, CloudFormation, Ansible,...
Ecrire l'infrastructure as code
Tester et valider l'infra
Configurer
Amélioration continue
L'automatisation des processus est également une grande étape pour le bon fonctionnement DevOps
Jenkins
https://medium.com/@gustavo.guss/quick-tutorial-of-jenkins-b99d5f5889f2
Ansible
https://docs.ansible.com/ansible/latest/getting_started/index.html
https://www.redhat.com/en/interactive-labs/ansible?extIdCarryOver=true&sc_cid=701f2000001OH7YAAW
Exercices et ressources supplémentaires
https://github.com/bregman-arie/devops-exercises/blob/master/topics/ansible/README.md
Nous l'avons déjà vu, mais pour faire du DevOps, il est nécessaire de monitorer et logger le plus de choses possibles afin de suivre la vie du projet
Choisir un outil de monitoring et de logs : Prometheus, ELK stack, Grafana,...
Configurer l'outil
Grafana
Nous l'avons déjà vu, mais pour faire du DevOps, il est nécessaire de tester l'infrastructure du projet afin de s'assurer de son bon fonctionnement
Choisir un outil : Test Kitchen, Serverspec, Packer...
Ecrire les tests
Serverspec
Nous en avons aussi brièvement parlé, mais la sécurité est un aspect primordial pour une application aujourd'hui. DevOps contient cette partie.
Les tests à réaliser : Scanneur de sécurité, système de détection d'intrusion, scanneur de vulnérabilité,...
Sécuriser l'infrastructure : Suivre les bonnes pratiques telles que le renforcement des serveurs (fermé le maximum de choses), chiffrer les données, utiliser des firewalls, mise en place du Secure By Design...
Implémenter des tests de sécurité : Identification des vulnérablités, problèmes de configurations, etc... Par exemple, SonarQube et Checkmarx sont des outils qui peuvent effectuer en partie ces tests de manière automatisée.
Intégrer l'outil dans le process de déploiement : Mise en place de l'outil dans une CI afin de lancer des tests de sécurité.
Monitorer la sécurité en continue
Mise en place d'une analyse sécurité et qualité avec SonarCloud
Le lien suivant contient de nombreux labs permettant de travailler vos compétences de DevOps, une partie gratuite déjà bien fournie vous permettra d'apprendre !
Le lien suivant contient de nombreux exercices sur tout ce que nous avons pu aborder durant la formation et bien plus encore...
Je vous conseil de le garder et d'y passer de temps en temps pour appréhender de nouveaux sujets
Le S-SDLC concerne à la fois les manageurs et les développeurs dans une entreprise. Ce procédé n'est pas encore très répandu dans les entreprises, bien qu'il soit très efficace. Nous allons survoler les différentes étapes de mise en place d'un S-SDLC (méthodes agiles).
les développeurs
Exigences : phase importante où l'on défini les besoins en sécurité de l'organisation ainsi que l'élaboration du plan d'action et l'analyse de coût de la mise en place d'un S-SDLC
Conception : cartographie de l'architecture autour de l'application pour en modéliser les menaces. On va anticiper pour réduire les menaces potentielles.
Mieux vaut prévenir que guérir ! "
Code : Déterminer les règles de développement à suivre et penser à effectuer une analyse de code statique !
Ces règles devront être respectées par toutes les parties prenantes de votre projet.
Test : S'assure de la sécurité de manière dynamique avec l'utilisation de scans de vulnérabilités (dynamique), tests de fuzzing, ou tests de pénétrations.
Permet l'analyse des écarts entre les principes définis lors de l'étape 2 et la réalité du code applicatif de notre application.
On réalise également un plan de réponse aux incidents (écarts), puis on réalise une revue finale de sécurité.
Normalement, vous avez eu une journée de formation sur le dossier d'exploitation alors ça sera uniquement un rappel. Si ce n'est pas le cas, on va voir ça ensemble.
Pour le dossier d'exploitation
Pour la maintenance
Ce qu'il vous faut absolument pour votre projet Cube
Pour le plan de déploiement, il faut :
Ce qu'il vous faut pour votre projet fil rouge (DFS MNS)
La maintenance vise à vérifier, entretenir l'application ou son infrastructure.
Le rôle du contrat est d’englober le mode et le périmètre d’intervention de l'entreprise ainsi que le niveau de responsabilité qui lui revient.
Il y'a plusieurs types de maintenance :
Vous allez devoir mettre une Tierce Maintenance Applicative qui respecte le Service Level Agreement et l'Operating Level Agreement.
Oui, là on va s'ennuyer sévère mais c'est important pour rentabiliser un projet sur le long terme.
Ce que doit préciser un SLA :
On l'évalue selon sa disponibilité, sa fiabilité, la fonctionnalité à réaliser, les temps de réponse, la degré de satisfaction...
Une TMA plus en détail :
https://docplayer.fr/1804563-Tierce-maintenance-applicative.html
Exemple de document :
https://docplayer.fr/2426163-Contrat-de-maintenance-applicative.html
Envoyer fichier deployment_theory.docx
Worskhop d'une demi-journée de mise en place d'une CI / CD avec les technologies de votre choix.
L'idée est d'avoir une CI / CD complète et un environnement complètement automatisé avec tout ce que l'on a vu.
Envoyer le sujet WS_CI_CD_Full.docx
BON COURAGE !
(après c'est fini)
Evaluation
Tests & CI
Pour PhoneNumber, la classe a un constructeur privé et l'objet s'instancie via la méthode Parse
PhoneNumber phoneNumber = PhoneNumber.Parse("0123456789");
// phoneNumber est un objet instancié de type PhoneNumber si pas d'erreur
// Donc vous pouvez accéder aux propriétés Area, Minor et Major via phoneNumber.Area ou phoneNumber.Minor ou phoneNumber.Major