<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
  <title>Lucas Videlaine – Articles</title>
  <subtitle>Consultant &amp; Auditeur Sécurité. Audits techniques (pentest web, pentest SI interne, audit d&#39;architecture, audit CI/CD) et organisationnels (NIST CSF, hygiène ANSSI, ISO 27001, OWASP SAMM). Conseil : RSSI as a Service, formations, sensibilisations et rédaction de corpus documentaires SSI.</subtitle>
  <link href="https://www.videlaine.fr/feed.xml" rel="self"/>
  <link href="https://www.videlaine.fr/"/>
  <updated>2025-07-29T11:00:00Z</updated>
  <id>https://www.videlaine.fr/</id>
  <author>
    <name>Lucas Videlaine</name>
    <uri>https://www.videlaine.fr/</uri>
  </author>
  <entry>
    <title>Découvrir la CI : Comment build mon SaaS en 3 minutes pour la prod ? 📦</title>
    <link href="https://www.videlaine.fr/posts/discover-continuous-integration/"/>
    <updated>2025-07-29T11:00:00Z</updated>
    <id>https://www.videlaine.fr/posts/discover-continuous-integration/</id>
    <summary>Découvrez la CI avec GitLab : build automatisé de votre SaaS en 3 min. Un guide clair pour débutants en DevOps, Git, Docker et GitLab-CI.</summary>
    <content xml:lang="fr" type="html">&lt;h2 id=&quot;%F0%9F%93%9A-sommaire&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%93%9A-sommaire&quot;&gt;#&lt;/a&gt; 📚 Sommaire&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#1.-introduction-%3A-une-s%C3%A9rie-ci%2Fcd-pour-les-devs-press%C3%A9s&quot;&gt;1. Introduction : Une série CI/CD pour les devs pressés&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#2.-c%E2%80%99est-quoi-la-ci-%3F-(int%C3%A9gration-continue)&quot;&gt;2. C’est quoi la CI ? (&lt;em&gt;Intégration Continue&lt;/em&gt;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#3.-outils-utilis%C3%A9s-pour-notre-pipeline&quot;&gt;3. Outils utilisés pour notre pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#4.-docker-%3A-l%E2%80%99alli%C3%A9-discret-de-tout-bon-saas&quot;&gt;4. Docker : l’allié discret de tout bon SaaS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#5.-une-pipeline-ci-%22plug-%26-play%22&quot;&gt;5. Un pipeline CI &amp;quot;plug &amp;amp; play&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#6.-tester-et-adapter-le-pipeline&quot;&gt;6. Tester et adapter le pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#7.-conclusion-%3A-ton-build-est-pr%C3%AAt-!&quot;&gt;7. Conclusion : ton build est prêt !&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1.-introduction-%3A-une-s%C3%A9rie-ci%2Fcd-pour-les-devs-press%C3%A9s&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#1.-introduction-%3A-une-s%C3%A9rie-ci%2Fcd-pour-les-devs-press%C3%A9s&quot;&gt;#&lt;/a&gt; 1. Introduction : Une série CI/CD pour les devs pressés&lt;/h2&gt;
&lt;p&gt;Bienvenue dans cette série de &lt;strong&gt;deux articles&lt;/strong&gt; dédiée à l’automatisation du cycle de vie d’un projet SaaS grâce à la &lt;strong&gt;CI/CD&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Que tu sois &lt;strong&gt;développeur freelance&lt;/strong&gt;, &lt;strong&gt;étudiant&lt;/strong&gt;, ou en train de lancer ton propre &lt;strong&gt;SaaS&lt;/strong&gt;, cette série te montrera comment automatiser rapidement — et proprement — ton processus de &lt;em&gt;build&lt;/em&gt; et de déploiement.&lt;/p&gt;
&lt;p&gt;🎯 &lt;strong&gt;Objectif&lt;/strong&gt; : à la fin de cet article, tu sauras comment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;builder automatiquement ton application,&lt;/li&gt;
&lt;li&gt;puis la déployer en production dès que ton code est prêt.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%A7%B1-ce-qu%E2%80%99on-va-faire-ensemble&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%A7%B1-ce-qu%E2%80%99on-va-faire-ensemble&quot;&gt;#&lt;/a&gt; 🧱 Ce qu’on va faire ensemble&lt;/h3&gt;
&lt;p&gt;Dans ce &lt;strong&gt;premier article&lt;/strong&gt;, on se concentre sur la &lt;strong&gt;CI — Continuous Integration — l’Intégration Continue&lt;/strong&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🔧 Automatiser le &lt;strong&gt;build&lt;/strong&gt; de ton application à chaque push de code.&lt;br /&gt;
✨ ​En bonus, on va même voir comment scanner ton code source à la recherche de vulnérabilités !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans le &lt;a href=&quot;https://www.videlaine.fr/posts/discover-continuous-deployment/&quot;&gt;&lt;strong&gt;prochain article&lt;/strong&gt;&lt;/a&gt;, on abordera la &lt;strong&gt;CD — Continuous Deployment — le Déploiement Continu&lt;/strong&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🚀 Envoyer automatiquement ton build en &lt;strong&gt;production&lt;/strong&gt;, sans manip manuelle.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%92%A1-contexte-du-use-case-%E2%80%94-notre-fil-rouge&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%92%A1-contexte-du-use-case-%E2%80%94-notre-fil-rouge&quot;&gt;#&lt;/a&gt; 💡 Contexte du use-case — notre fil rouge&lt;/h3&gt;
&lt;p&gt;Imaginons, tu as développé un &lt;strong&gt;site vitrine avec React JS&lt;/strong&gt; pour présenter ton futur service SaaS (ou tout autre webapp, mais prenons un exemple simple et concret !)&lt;br /&gt;
Tu veux maintenant que chaque modification du code que tu push sur ton repository Git :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;soit automatiquement &lt;strong&gt;scannée et buildée&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;soit &lt;strong&gt;prête à être déployée&lt;/strong&gt; sans intervention manuelle.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nous allons utiliser une stack simple et accessible :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitLab&lt;/strong&gt; pour héberger ton code et l&#39;image du conteneur qui sera buildé,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitLab-CI&lt;/strong&gt; pour automatiser le scan et la construction de l&#39;iamge,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt; pour packagé et alléger au maximum ton &lt;em&gt;build&lt;/em&gt; (tu n&#39;es pas complétement à l&#39;aise avec Docker ? Pas de problème : &lt;a href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/&quot;&gt;&lt;strong&gt;un article sur les commandes de base t&#39;attend déjà&lt;/strong&gt;&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Pas besoin d’infrastructure complexe ni de configuration obscure&lt;/strong&gt; : on va droit au but.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;🎯 &lt;strong&gt;Résultat à la fin de cet article&lt;/strong&gt; :&lt;br /&gt;
Un &lt;strong&gt;build automatisé&lt;/strong&gt; à chaque commit, prêt à être déployé sereinement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Parfait ! Voici la &lt;strong&gt;partie 2 – C’est quoi la CI ?&lt;/strong&gt;, toujours au format Markdown, clair et pédagogique :&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2.-c%E2%80%99est-quoi-la-ci-%3F-(int%C3%A9gration-continue)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#2.-c%E2%80%99est-quoi-la-ci-%3F-(int%C3%A9gration-continue)&quot;&gt;#&lt;/a&gt; 2. C’est quoi la CI ? &lt;em&gt;(Intégration Continue)&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;L’&lt;strong&gt;Intégration Continue&lt;/strong&gt; (ou &lt;em&gt;Continuous Integration&lt;/em&gt;, CI) est une pratique clé du DevOps moderne. Elle consiste à &lt;strong&gt;automatiser l’exécution de tests, le build et la validation de ton code&lt;/strong&gt; dès qu’un changement est poussé dans ton dépôt Git.&lt;/p&gt;
&lt;p&gt;Dit autrement :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🛠️ &lt;strong&gt;Tu écris du code → tu pushes → ton projet est automatiquement construit et vérifié.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%E2%9C%85-une-d%C3%A9finition-simple&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%E2%9C%85-une-d%C3%A9finition-simple&quot;&gt;#&lt;/a&gt; ✅ Une définition simple&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CI = un script qui vérifie et construit ton code à chaque commit, sans que tu aies besoin d’y penser.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Plus concrètement, une pipeline CI peut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;installer les dépendances de ton projet,&lt;/li&gt;
&lt;li&gt;exécuter des tests unitaires ou de qualité de code,&lt;/li&gt;
&lt;li&gt;compiler, builder ou packager ton app,&lt;/li&gt;
&lt;li&gt;produire des fichiers prêts pour la production (par ex. un dossier &lt;code&gt;dist/&lt;/code&gt; ou &lt;code&gt;build/&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aujourd&#39;hui, Docker est largement employé dans les pipelines CI. Il permet à la pipeline de construire une image de conteneur, objet léger et simple à stocker pour les étapes suivantes du cycle vie logicielle (CD, etc.).&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%A4%9D-la-ci-dans-une-d%C3%A9marche-devops&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%A4%9D-la-ci-dans-une-d%C3%A9marche-devops&quot;&gt;#&lt;/a&gt; 🤝 La CI dans une démarche DevOps&lt;/h3&gt;
&lt;p&gt;La CI est l’un des premiers pas vers une démarche &lt;strong&gt;DevOps&lt;/strong&gt;. Elle favorise :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la &lt;strong&gt;collaboration&lt;/strong&gt; : tout le monde travaille sur une base de code testée et fonctionnelle,&lt;/li&gt;
&lt;li&gt;la &lt;strong&gt;détection rapide des erreurs&lt;/strong&gt; : un bug dans la branche ? Tu le sais dès le commit,&lt;/li&gt;
&lt;li&gt;la &lt;strong&gt;réduction du temps de mise en production&lt;/strong&gt; : pas besoin de tout refaire à la main.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;🔁 La CI élimine les phases de “ça marche chez moi”, “je rebuild vite fait avant de pousser” et autres sources de friction.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%92%A1-pourquoi-utiliser-la-ci-pour-mon-saas-%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%92%A1-pourquoi-utiliser-la-ci-pour-mon-saas-%3F&quot;&gt;#&lt;/a&gt; 💡 Pourquoi utiliser la CI pour mon SaaS ?&lt;/h3&gt;
&lt;p&gt;Tu pourrais penser : &lt;em&gt;“Mais je suis seul sur ce projet, j’ai besoin de tout ça ?”&lt;/em&gt;&lt;br /&gt;
La réponse est : &lt;strong&gt;oui, surtout&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Voici pourquoi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tu gagnes du temps&lt;/strong&gt; : pas besoin de répéter manuellement les builds à chaque changement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ton code est toujours prêt pour la prod&lt;/strong&gt; : pas de mauvaise surprise à la dernière minute.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tu fiabilises ton projet&lt;/strong&gt; : moins de risques d’introduire un bug ou de casser quelque chose.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;Astuce&lt;/strong&gt; : Tu veux t’entraîner à la CI ? Notre projet React vitrine est un excellent terrain de jeu !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Très bien, voici la &lt;strong&gt;partie 3 – Outils utilisés pour notre pipeline&lt;/strong&gt;, toujours en Markdown, avec un ton pédagogique et accessible :&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3.-outils-utilis%C3%A9s-pour-notre-pipeline&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#3.-outils-utilis%C3%A9s-pour-notre-pipeline&quot;&gt;#&lt;/a&gt; 3. Outils utilisés pour notre pipeline&lt;/h2&gt;
&lt;p&gt;Pour automatiser le &lt;em&gt;build&lt;/em&gt; de notre site React, on va s’appuyer sur des outils modernes, simples à prendre en main, et largement utilisés dans l’écosystème Dev et DevOps.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%97%82%EF%B8%8F-git-%E2%80%93-la-base-de-ton-projet&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%97%82%EF%B8%8F-git-%E2%80%93-la-base-de-ton-projet&quot;&gt;#&lt;/a&gt; 🗂️ Git – La base de ton projet&lt;/h3&gt;
&lt;p&gt;Si tu lis cet article, tu utilises très probablement &lt;strong&gt;Git&lt;/strong&gt; pour versionner ton code.&lt;br /&gt;
La CI va justement s’appuyer sur ton dépôt Git pour savoir &lt;strong&gt;quoi builder, quand et comment&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Chaque fois que tu fais un &lt;strong&gt;commit&lt;/strong&gt; et que tu le &lt;strong&gt;pushes&lt;/strong&gt;, Git déclenche une nouvelle version du code à analyser. C’est là que la magie de la CI entre en jeu.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%A6%8A-gitlab-%E2%80%93-le-hub-de-ton-projet&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%A6%8A-gitlab-%E2%80%93-le-hub-de-ton-projet&quot;&gt;#&lt;/a&gt; 🦊 GitLab – Le hub de ton projet&lt;/h3&gt;
&lt;p&gt;Dans cette série, nous allons utiliser &lt;strong&gt;GitLab&lt;/strong&gt;, un service de gestion de code source qui inclut &lt;strong&gt;nativement un système CI/CD intégré&lt;/strong&gt; (contrairement à GitHub qui nécessite des actions externes, ou des outils comme GitHub Actions ou CircleCI).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Pourquoi GitLab ?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pas besoin d’installer ou connecter un outil externe,&lt;/li&gt;
&lt;li&gt;La CI/CD est &lt;strong&gt;native&lt;/strong&gt;, simple et efficace,&lt;/li&gt;
&lt;li&gt;Tu peux héberger ton dépôt en &lt;strong&gt;cloud&lt;/strong&gt; (&lt;em&gt;&lt;a href=&quot;http://gitlab.com/&quot;&gt;gitlab.com&lt;/a&gt;&lt;/em&gt;) ou &lt;strong&gt;on-premise&lt;/strong&gt; (&lt;em&gt;GitLab CE&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%94%81-gitlab-ci-%E2%80%93-le-moteur-du-pipeline&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%94%81-gitlab-ci-%E2%80%93-le-moteur-du-pipeline&quot;&gt;#&lt;/a&gt; 🔁 GitLab-CI – Le moteur du pipeline&lt;/h3&gt;
&lt;p&gt;GitLab-CI est le &lt;strong&gt;moteur qui exécute ton pipeline&lt;/strong&gt;. Il lit un fichier de configuration &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; placé à la racine de ton projet, et déclenche automatiquement les étapes que tu y définis (scan, build, test, déploiement, etc.).&lt;/p&gt;
&lt;p&gt;Ce fichier te permet de dire à GitLab :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;quelles étapes à réaliser,&lt;/li&gt;
&lt;li&gt;quelles commandes exécuter,&lt;/li&gt;
&lt;li&gt;quoi garder comme résultat (les &lt;em&gt;artifacts&lt;/em&gt;),&lt;/li&gt;
&lt;li&gt;dans quels cas exécuter chaque étape (branches, conditions, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;📁 &lt;strong&gt;Un seul fichier &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; = toute la logique de ton pipeline&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%E2%9A%A0%EF%B8%8F-pr%C3%A9requis-%3A-ton-projet-doit-%C3%AAtre-h%C3%A9berg%C3%A9-sur-gitlab.com&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%E2%9A%A0%EF%B8%8F-pr%C3%A9requis-%3A-ton-projet-doit-%C3%AAtre-h%C3%A9berg%C3%A9-sur-gitlab.com&quot;&gt;#&lt;/a&gt; ⚠️ Prérequis : Ton projet doit être hébergé sur &lt;a href=&quot;http://gitlab.com/&quot;&gt;GitLab.com&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Pour suivre les exemples de cette série :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;crée un compte gratuitement sur &lt;a href=&quot;https://gitlab.com/&quot;&gt;gitlab.com&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;pousse ton dépôt (React) sur un nouveau projet (public ou privé, comme tu préfères),&lt;/li&gt;
&lt;li&gt;assure-toi que ton fichier &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; est bien à la racine du dépôt.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;Astuce&lt;/strong&gt; : Tu peux tester ton fichier &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; dans l’UI GitLab avant même de le &lt;em&gt;pusher&lt;/em&gt;, via l’outil &lt;a href=&quot;https://gitlab.com/-/ci/lint&quot;&gt;CI Lint&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4.-docker-%3A-l%E2%80%99alli%C3%A9-discret-de-tout-bon-saas&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#4.-docker-%3A-l%E2%80%99alli%C3%A9-discret-de-tout-bon-saas&quot;&gt;#&lt;/a&gt; 4. Docker : l’allié discret de tout bon SaaS&lt;/h2&gt;
&lt;p&gt;Pour que ta pipeline CI fonctionne de manière fiable, reproductible, et indépendante de l’environnement de la machine qui l’exécute, on utilise &lt;strong&gt;Docker&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Même si ce n’est pas un article dédié à Docker, il est important de comprendre &lt;strong&gt;son rôle dans la CI&lt;/strong&gt;, car GitLab-CI repose fortement dessus.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%9B%A0%EF%B8%8F-quel-rapport-avec-la-ci-%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%9B%A0%EF%B8%8F-quel-rapport-avec-la-ci-%3F&quot;&gt;#&lt;/a&gt; 🛠️ Quel rapport avec la CI ?&lt;/h3&gt;
&lt;p&gt;Dans un pipeline GitLab-CI, &lt;strong&gt;chaque job s’exécute dans un conteneur Docker&lt;/strong&gt;.&lt;br /&gt;
Tu peux choisir l’image Docker à utiliser pour ton projet en fonction de ta stack, mais dans notre cas nous allons utiliser une image générique afin de s&#39;adapter à tous les scénarios possibles.&lt;/p&gt;
&lt;p&gt;Pour cela, on utilise par exemple l’image docker permettant de faire du Docker-in-Docker &amp;quot;dind&amp;quot; :&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; docker&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;24.0.2&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;dind&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cela signifie : &amp;quot;GitLab, pour ce job, utilise telle image Docker dans telle version&amp;quot;. Pour toutes les images et leurs versions (qu&#39;on appelle &amp;quot;tag&amp;quot;), je t&#39;invite à te rendre sur &lt;a href=&quot;https://hub.docker.com/&quot;&gt;Docker Hub&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%93%A6-le-dockerfile&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%93%A6-le-dockerfile&quot;&gt;#&lt;/a&gt; 📦 Le &lt;code&gt;Dockerfile&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Tu peux ensuite créer ton propre &lt;strong&gt;Dockerfile&lt;/strong&gt; pour décrire les besoins de ton app.&lt;br /&gt;
Pour un projet React standard, voici une base que tu peux utiliser et ajuster selon tes envies :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt; :&lt;/p&gt;
&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Dockerfile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;FROM node&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;alpine3.22 AS build&lt;br /&gt;&lt;br /&gt;WORKDIR /app&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;# Copy package files and install dependencies&lt;/span&gt;&lt;br /&gt;COPY package&lt;span class=&quot;token important&quot;&gt;*.json&lt;/span&gt; ./&lt;br /&gt;RUN npm install&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;# Copy project files&lt;/span&gt;&lt;br /&gt;COPY . .&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;# Build the application&lt;/span&gt;&lt;br /&gt;RUN npm run build&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;# Production stage&lt;/span&gt;&lt;br /&gt;FROM nginx&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;alpine&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;# Copy built assets from build stage&lt;/span&gt;&lt;br /&gt;COPY &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;from=build /app/_site /usr/share/nginx/html&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;# Copy nginx configuration&lt;/span&gt;&lt;br /&gt;COPY nginx.conf /etc/nginx/conf.d/default.conf&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token comment&quot;&gt;# Expose port 80&lt;/span&gt;&lt;br /&gt;EXPOSE 80&lt;br /&gt;&lt;br /&gt;CMD &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;nginx&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;-g&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;daemon off;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le fichier &lt;strong&gt;nginx.conf&lt;/strong&gt; :&lt;/p&gt;
&lt;pre class=&quot;language-yml&quot;&gt;&lt;code class=&quot;language-yml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# nginx.conf&lt;/span&gt;&lt;br /&gt;server &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;    listen 80;&lt;br /&gt;    server_name localhost;&lt;br /&gt;&lt;br /&gt;    root /usr/share/nginx/html;&lt;br /&gt;    index index.html;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;# Gzip compression&lt;/span&gt;&lt;br /&gt;    gzip on;&lt;br /&gt;    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;# Security headers&lt;/span&gt;&lt;br /&gt;    add_header X&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Frame&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Options &quot;SAMEORIGIN&quot;;&lt;br /&gt;    add_header X&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;XSS&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Protection &quot;1; mode=block&quot;;&lt;br /&gt;    add_header X&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Content&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Type&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Options &quot;nosniff&quot;;&lt;br /&gt;    add_header Strict&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Transport&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Security &quot;max&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;age=31536000; includeSubDomains&quot; always;&lt;br /&gt;&lt;br /&gt;    &lt;span class=&quot;token comment&quot;&gt;# Cache static assets&lt;/span&gt;&lt;br /&gt;    location /static/ &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br /&gt;        expires 1y;&lt;br /&gt;        add_header Cache&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Control &quot;public&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; no&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;transform&quot;;&lt;br /&gt;    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour tester ton Dockerfile, rien de plus simple :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;docker build --tag &#39;mon-saas:1.0&#39; ./Dockerfile&lt;br /&gt;
docker run --detach -p 8080:80 &#39;mon-saas:1.0&#39;&lt;br /&gt;
curl localhost:8080&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%92%AC-en-r%C3%A9sum%C3%A9&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%92%AC-en-r%C3%A9sum%C3%A9&quot;&gt;#&lt;/a&gt; 💬 En résumé&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Docker permet à GitLab CI de builder ton projet dans un environnement propre, contrôlé et réutilisable.&lt;br /&gt;
Tu n’as rien à installer sur ta machine : tout est exécuté dans le cloud, à chaque commit. Pour autant je t&#39;encourage vivement à l&#39;utiliser aussi localement afin de tester ton app dans conteneur est assurer son fonctionnement agnostic !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5.-une-pipeline-ci-%22plug-%26-play%22&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#5.-une-pipeline-ci-%22plug-%26-play%22&quot;&gt;#&lt;/a&gt; 5. Une pipeline CI &amp;quot;plug &amp;amp; play&amp;quot;&lt;/h2&gt;
&lt;p&gt;Maintenant que tu comprends les bases de la CI et le rôle de Docker, passons à la &lt;strong&gt;mise en pratique&lt;/strong&gt;.&lt;br /&gt;
L’objectif : te fournir un pipeline &lt;strong&gt;clé en main&lt;/strong&gt; que tu peux coller dans ton dépôt GitLab pour builder automatiquement ton SaaS à chaque push.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%E2%9A%99%EF%B8%8F-un-fichier-.gitlab-ci.yml-simple-et-efficace&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%E2%9A%99%EF%B8%8F-un-fichier-.gitlab-ci.yml-simple-et-efficace&quot;&gt;#&lt;/a&gt; ⚙️ Un fichier &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; simple et efficace&lt;/h3&gt;
&lt;p&gt;Voici un pipeline CI complet, prêt à l’emploi, intégrant les bonnes pratiques DevSecOps dès le départ, et qui s&#39;adaptera à tous tes projets :&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# .gitlab-ci.yml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; docker&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;29&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; docker&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;29&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;dind&lt;br /&gt;    &lt;span class=&quot;token key atrule&quot;&gt;entrypoint&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;env&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;-u&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;DOCKER_HOST&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br /&gt;    &lt;span class=&quot;token key atrule&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;dockerd-entrypoint.sh&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token key atrule&quot;&gt;variables&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;DOCKER_HOST&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; tcp&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//docker&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;2375/&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;DOCKER_DRIVER&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; overlay2&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;REGISTRY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $CI_REGISTRY&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;REPOSITORY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $CI_PROJECT_NAMESPACE&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;IMAGE_NAME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $CI_PROJECT_NAME&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token key atrule&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Security/SAST.gitlab&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ci.yml&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Security/SAST&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;IaC.latest.gitlab&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ci.yml&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Security/Secret&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Detection.gitlab&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ci.yml&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Jobs/Container&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;Scanning.gitlab&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;ci.yml&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token key atrule&quot;&gt;stages&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; test&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; build&lt;br /&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; scan&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token key atrule&quot;&gt;sast&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; test&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token key atrule&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; build&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;before_script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; echo &quot;$CI_REGISTRY_PASSWORD&quot; &lt;span class=&quot;token punctuation&quot;&gt;|&lt;/span&gt; docker login $CI_REGISTRY &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;u $CI_REGISTRY_USER &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;password&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;stdin&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; IMAGE_NAME=&quot;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;IMAGE_NAME//./&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&quot;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;&lt;br /&gt;      if [ &quot;$CI_COMMIT_REF_NAME&quot; = &quot;main&quot; ]; then&lt;br /&gt;        IMAGE_TAG=&quot;$CI_COMMIT_SHORT_SHA&quot;&lt;br /&gt;      else&lt;br /&gt;        IMAGE_TAG=&quot;$CI_COMMIT_SHORT_SHA-dev&quot;&lt;br /&gt;      fi&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; docker build &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;t $REGISTRY/$REPOSITORY/$IMAGE_NAME&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;$IMAGE_TAG .&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; docker push $REGISTRY/$REPOSITORY/$IMAGE_NAME&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;$IMAGE_TAG&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;after_script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; docker logout $REGISTRY&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;token key atrule&quot;&gt;container_scanning&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;stage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; scan&lt;br /&gt;  &lt;span class=&quot;token key atrule&quot;&gt;before_script&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; IMAGE_NAME=&quot;$&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;IMAGE_NAME//./&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&quot;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token scalar string&quot;&gt;&lt;br /&gt;      if [ &quot;$CI_COMMIT_REF_NAME&quot; = &quot;main&quot; ]; then&lt;br /&gt;        IMAGE_TAG=&quot;$CI_COMMIT_SHORT_SHA$&quot;&lt;br /&gt;      else&lt;br /&gt;        IMAGE_TAG=&quot;$CI_COMMIT_SHORT_SHA-dev&quot;&lt;br /&gt;      fi&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; export CS_IMAGE=&quot;$REGISTRY/$REPOSITORY/$IMAGE_NAME&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;$IMAGE_TAG&quot;  &lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%A7%A0-d%C3%A9chiffrons-ce-pipeline&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%A7%A0-d%C3%A9chiffrons-ce-pipeline&quot;&gt;#&lt;/a&gt; 🧠 Déchiffrons ce pipeline&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Élément&lt;/th&gt;
&lt;th&gt;Rôle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image: docker:29&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Utilise Docker pour permettre de builder et pousser une image de conteneur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;services: docker:29-dind&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lance un démon Docker-in-Docker pour exécuter des builds dans le conteneur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;variables:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Déclare les variables d’environnement liées au registre d’images GitLab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Intègre des templates de sécurité fournis par GitLab (SAST, IaC, secrets, scan d’image)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stages:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Définit les étapes du pipeline : test, build, scan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sast:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Active les tests SAST (analyse de code statique)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;build:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Build et push l’image Docker de ton projet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;container_scanning:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lance une analyse de sécurité sur l’image buildée&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%94%90-ce-pipeline-fait-bien-plus-que-builder&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%94%90-ce-pipeline-fait-bien-plus-que-builder&quot;&gt;#&lt;/a&gt; 🔐 Ce pipeline fait bien plus que builder&lt;/h3&gt;
&lt;p&gt;Ce fichier &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; te donne un pipeline DevSecOps &lt;strong&gt;complet dès le départ&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;📦 Il &lt;strong&gt;build&lt;/strong&gt; ton projet dans une image Docker&lt;/li&gt;
&lt;li&gt;🚀 Il &lt;strong&gt;push&lt;/strong&gt; cette image dans le registre GitLab&lt;/li&gt;
&lt;li&gt;🛡️ Il &lt;strong&gt;scanne&lt;/strong&gt; ton code source, tes secrets, ton infra-as-code et ton image Docker&lt;/li&gt;
&lt;li&gt;🔒 Il te signale toute vulnérabilité potentielle avant même que tu déploies&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pas besoin d’installer quoi que ce soit :&lt;/strong&gt; GitLab fournit tous les outils intégrés. Tu n’as qu’à pousser ton &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%8E%AF-r%C3%A9sultat&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%8E%AF-r%C3%A9sultat&quot;&gt;#&lt;/a&gt; 🎯 Résultat&lt;/h3&gt;
&lt;p&gt;À chaque push :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ton code est scanné pour détecter des vulnérabilités ou fuites de secrets.&lt;/li&gt;
&lt;li&gt;Ton image Docker est construite et envoyée dans le registre GitLab.&lt;/li&gt;
&lt;li&gt;Ton image est scannée pour vérifier qu’elle est propre et sûre.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Ton build est propre, sécurisé et prêt à être déployé&lt;/strong&gt; (spoiler : c’est pour le prochain article 😉).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6.-tester-et-adapter-le-pipeline&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#6.-tester-et-adapter-le-pipeline&quot;&gt;#&lt;/a&gt; 6. Tester et adapter le pipeline&lt;/h2&gt;
&lt;p&gt;Tu as ton fichier &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; prêt ? Parfait. Voyons &lt;strong&gt;où le placer&lt;/strong&gt;, comment &lt;strong&gt;lancer ton premier pipeline&lt;/strong&gt;, et surtout &lt;strong&gt;comment vérifier que tout fonctionne correctement&lt;/strong&gt;, étape par étape.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%93%81-o%C3%B9-placer-les-fichiers-dans-ton-d%C3%A9p%C3%B4t-%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%93%81-o%C3%B9-placer-les-fichiers-dans-ton-d%C3%A9p%C3%B4t-%3F&quot;&gt;#&lt;/a&gt; 📁 Où placer les fichiers dans ton dépôt ?&lt;/h3&gt;
&lt;p&gt;Voici une arborescence typique d’un projet React prêt pour la CI :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mon-saas-vitrine/
├── public/
├── src/
├── .gitignore
├── Dockerfile
├── package.json
├── package-lock.json
├── README.md
├── .gitlab-ci.yml      👈 à la racine du projet
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ Le fichier &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; &lt;strong&gt;doit être à la racine du dépôt GitLab&lt;/strong&gt; pour être détecté automatiquement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;📦 N’oublie pas ton &lt;code&gt;Dockerfile&lt;/code&gt; à la racine aussi, sinon ça ne fonctionnera pas !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%9A%80-pousser-ton-code-et-d%C3%A9clencher-le-pipeline&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%9A%80-pousser-ton-code-et-d%C3%A9clencher-le-pipeline&quot;&gt;#&lt;/a&gt; 🚀 Pousser ton code et déclencher le pipeline&lt;/h3&gt;
&lt;p&gt;Une fois ton projet sur GitLab :&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; commit &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Ajout du pipeline CI + Dockerfile&quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push origin main&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GitLab va automatiquement détecter le fichier &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; et déclencher le pipeline.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.videlaine.fr/assets/img/Ou2Pr4DgIj-250.webp 250w, https://www.videlaine.fr/assets/img/Ou2Pr4DgIj-316.webp 316w, https://www.videlaine.fr/assets/img/Ou2Pr4DgIj-426.webp 426w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://www.videlaine.fr/assets/img/Ou2Pr4DgIj-250.jpeg 250w, https://www.videlaine.fr/assets/img/Ou2Pr4DgIj-316.jpeg 316w, https://www.videlaine.fr/assets/img/Ou2Pr4DgIj-426.jpeg 426w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Pipelines menu on GitLab repo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.videlaine.fr/assets/img/Ou2Pr4DgIj-426.jpeg&quot; width=&quot;426&quot; height=&quot;355&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.videlaine.fr/assets/img/kRCtqAqvKX-250.webp 250w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-316.webp 316w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-426.webp 426w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-460.webp 460w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-500.webp 500w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-580.webp 580w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-632.webp 632w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-768.webp 768w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-852.webp 852w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-920.webp 920w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-1160.webp 1160w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://www.videlaine.fr/assets/img/kRCtqAqvKX-250.jpeg 250w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-316.jpeg 316w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-426.jpeg 426w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-460.jpeg 460w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-500.jpeg 500w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-580.jpeg 580w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-632.jpeg 632w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-768.jpeg 768w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-852.jpeg 852w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-920.jpeg 920w, https://www.videlaine.fr/assets/img/kRCtqAqvKX-1160.jpeg 1160w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Pipeline result status&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.videlaine.fr/assets/img/kRCtqAqvKX-1160.jpeg&quot; width=&quot;1160&quot; height=&quot;126&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.videlaine.fr/assets/img/QNNK-pHC5e-250.webp 250w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-316.webp 316w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-426.webp 426w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-460.webp 460w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-500.webp 500w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-580.webp 580w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-632.webp 632w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-768.webp 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://www.videlaine.fr/assets/img/QNNK-pHC5e-250.jpeg 250w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-316.jpeg 316w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-426.jpeg 426w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-460.jpeg 460w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-500.jpeg 500w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-580.jpeg 580w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-632.jpeg 632w, https://www.videlaine.fr/assets/img/QNNK-pHC5e-768.jpeg 768w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Pipeline result status&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.videlaine.fr/assets/img/QNNK-pHC5e-768.jpeg&quot; width=&quot;768&quot; height=&quot;348&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;On peut confirmer ainsi que les 3 étapes de notre pipeline ont été réalisées avec succès !&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%94%8D-v%C3%A9rifier-l%E2%80%99ex%C3%A9cution-de-chaque-%C3%A9tape&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%94%8D-v%C3%A9rifier-l%E2%80%99ex%C3%A9cution-de-chaque-%C3%A9tape&quot;&gt;#&lt;/a&gt; 🔍 Vérifier l’exécution de chaque étape&lt;/h3&gt;
&lt;h4 id=&quot;%E2%9C%85-1.-%C3%A9tape-test-(sast%2C-secret-detection-et-iac)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%E2%9C%85-1.-%C3%A9tape-test-(sast%2C-secret-detection-et-iac)&quot;&gt;#&lt;/a&gt; ✅ 1. Étape &lt;code&gt;test&lt;/code&gt; &lt;em&gt;(&lt;code&gt;sast&lt;/code&gt;, &lt;code&gt;secret-detection&lt;/code&gt; et &lt;code&gt;IaC&lt;/code&gt;)&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Ces étapes scannent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ton code source JS/TS pour détecter les vulnérabilités connues (XSS, injections, etc.)&lt;/li&gt;
&lt;li&gt;Les fichiers versionnés pour repérer des secrets accidentellement committés (tokens, clés privées, etc.)&lt;/li&gt;
&lt;li&gt;Les fichiers &lt;em&gt;Infrastructure as Code&lt;/em&gt; (ex : Dockerfile)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Les rapports détaillés des scans sont visibles en téléchargeant les &amp;quot;artefacts&amp;quot; dans l’interface &amp;quot;Jobs&amp;quot; :&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.videlaine.fr/assets/img/Pry1FkeIwh-250.webp 250w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-316.webp 316w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-426.webp 426w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-460.webp 460w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-500.webp 500w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-580.webp 580w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-632.webp 632w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-768.webp 768w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-852.webp 852w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-920.webp 920w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-1160.webp 1160w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-1536.webp 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://www.videlaine.fr/assets/img/Pry1FkeIwh-250.jpeg 250w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-316.jpeg 316w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-426.jpeg 426w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-460.jpeg 460w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-500.jpeg 500w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-580.jpeg 580w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-632.jpeg 632w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-768.jpeg 768w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-852.jpeg 852w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-920.jpeg 920w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-1160.jpeg 1160w, https://www.videlaine.fr/assets/img/Pry1FkeIwh-1536.jpeg 1536w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Pipeline jobs&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.videlaine.fr/assets/img/Pry1FkeIwh-1160.jpeg&quot; width=&quot;1160&quot; height=&quot;408&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Point d&#39;attention ici, ce n&#39;est pas parce que les étapes sont &amp;quot;&lt;em&gt;Passed&lt;/em&gt;&amp;quot; que tout est OK pour autant !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;ℹ️​​ Si tu prends le temps de télécharger et parcourir les rapports de vulnérabilités, tu te rendras compte que tu peux largement améliorer la sécurité de ton app.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;❇️​ Cette pipeline est dédiée pour des SaaS au stade MVP, donc je n&#39;ai pas souhaité la rendre trop &lt;em&gt;bloquante&lt;/em&gt;, même si des vulnérabilités sont détéctées, le build s&#39;effectura.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h4 id=&quot;%E2%9C%85-2.-%C3%A9tape-build&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%E2%9C%85-2.-%C3%A9tape-build&quot;&gt;#&lt;/a&gt; ✅ 2. Étape &lt;code&gt;build&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Cette étape build une image Docker avec ton application&lt;/li&gt;
&lt;li&gt;Puis elle la push dans le registre de ton projet GitLab&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.videlaine.fr/assets/img/ADEKv59unt-250.webp 250w, https://www.videlaine.fr/assets/img/ADEKv59unt-316.webp 316w, https://www.videlaine.fr/assets/img/ADEKv59unt-426.webp 426w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;source type=&quot;image/jpeg&quot; srcset=&quot;https://www.videlaine.fr/assets/img/ADEKv59unt-250.jpeg 250w, https://www.videlaine.fr/assets/img/ADEKv59unt-316.jpeg 316w, https://www.videlaine.fr/assets/img/ADEKv59unt-426.jpeg 426w&quot; sizes=&quot;(max-width: 768px) 100vw, 768px&quot; /&gt;&lt;img alt=&quot;Pipeline jobs&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.videlaine.fr/assets/img/ADEKv59unt-426.jpeg&quot; width=&quot;426&quot; height=&quot;429&quot; /&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;Astuce&lt;/strong&gt; : Si tu veux inspecter l’image, tu peux la &lt;em&gt;pull&lt;/em&gt; en local :&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; login registry.gitlab.com&lt;br /&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; pull registry.gitlab.com/namespace/projet/image:latest&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h4 id=&quot;%E2%9C%85-3.-%C3%A9tape-container_scanning&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%E2%9C%85-3.-%C3%A9tape-container_scanning&quot;&gt;#&lt;/a&gt; ✅ 3. Étape &lt;code&gt;container_scanning&lt;/code&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Analyse l’image Docker générée : OS, librairies, dépendances&lt;/li&gt;
&lt;li&gt;Rapporte les CVE critiques ou connues&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Même méthode que pour le &lt;code&gt;sast&lt;/code&gt;, &lt;code&gt;secret-detection&lt;/code&gt; et &lt;code&gt;IaC&lt;/code&gt; : dans Build/Jobs tu retrouveras le rapport de scan complet de l&#39;image nouvellement construite. A toi de prendre le temps de la lire, de la comprendre, et de corriger ce que tu juges important pour ton SaaS !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%E2%9A%A0%EF%B8%8F-si-le-pipeline-%C3%A9choue&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%E2%9A%A0%EF%B8%8F-si-le-pipeline-%C3%A9choue&quot;&gt;#&lt;/a&gt; ⚠️ Si le pipeline échoue&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;🧩 GitLab t’indique clairement quelle étape a échoué, et pourquoi.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Clique sur le nom du job concerné dans l’UI du pipeline&lt;/li&gt;
&lt;li&gt;Inspecte les logs complets pour corriger le problème&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Astuce&lt;/strong&gt; : Active les &lt;strong&gt;&amp;quot;failures notifications&amp;quot;&lt;/strong&gt; dans les paramètres pour être alerté par e-mail ou via intégration Slack.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7.-conclusion-%3A-ton-build-est-pr%C3%AAt-!&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#7.-conclusion-%3A-ton-build-est-pr%C3%AAt-!&quot;&gt;#&lt;/a&gt; 7. Conclusion : ton build est prêt !&lt;/h2&gt;
&lt;p&gt;Félicitations ! 🎉 Tu viens de mettre en place un pipeline CI &lt;strong&gt;complet, sécurisé et automatisé&lt;/strong&gt; pour ton projet SaaS.&lt;br /&gt;
En quelques minutes, tu as posé les bases d’un cycle de développement professionnel, fiable et prêt pour la production.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%E2%9C%85-ce-que-tu-as-accompli&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%E2%9C%85-ce-que-tu-as-accompli&quot;&gt;#&lt;/a&gt; ✅ Ce que tu as accompli&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Compris les &lt;strong&gt;fondamentaux de la CI&lt;/strong&gt; et son rôle dans une démarche DevOps&lt;/li&gt;
&lt;li&gt;Utilisé &lt;strong&gt;GitLab-CI&lt;/strong&gt; pour automatiser ton processus de build&lt;/li&gt;
&lt;li&gt;Intégré &lt;strong&gt;Docker&lt;/strong&gt; pour fiabiliser ton environnement d’exécution&lt;/li&gt;
&lt;li&gt;Ajouté des &lt;strong&gt;scans de sécurité&lt;/strong&gt; (SAST, secrets, container scanning) sans effort&lt;/li&gt;
&lt;li&gt;Préparé ton projet pour le &lt;strong&gt;déploiement continu&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%9A%A7-ce-qu%E2%80%99il-reste-%C3%A0-faire-%3F-le-d%C3%A9ploiement-!&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%9A%A7-ce-qu%E2%80%99il-reste-%C3%A0-faire-%3F-le-d%C3%A9ploiement-!&quot;&gt;#&lt;/a&gt; 🚧 Ce qu’il reste à faire ? Le déploiement !&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Ton build est prêt, propre, versionné…&lt;br /&gt;
&lt;strong&gt;Il ne reste plus qu’à l’envoyer en production.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et ça tombe bien : c’est &lt;strong&gt;l’objet du prochain article&lt;/strong&gt; de cette série 👇&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;%F0%9F%94%9C-%5B%C3%A0-venir%5D-partie-2-%E2%80%93-d%C3%A9couvrir-la-cd-%3A-comment-d%C3%A9ployer-mon-build-en-prod-en-3-minutes-%3F&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/discover-continuous-integration/#%F0%9F%94%9C-%5B%C3%A0-venir%5D-partie-2-%E2%80%93-d%C3%A9couvrir-la-cd-%3A-comment-d%C3%A9ployer-mon-build-en-prod-en-3-minutes-%3F&quot;&gt;#&lt;/a&gt; 🔜 [À venir] Partie 2 – Découvrir la CD : &lt;em&gt;Comment déployer mon build en prod en 3 minutes ?&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;Tu y apprendras à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Déployer ton image Docker automatiquement sur un VPS&lt;/li&gt;
&lt;li&gt;Mettre en place et configurer un &lt;em&gt;modern reverse proxy&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Automatiser les redéploiements avec Docker Compose&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;En résumé :&lt;/strong&gt; tu viens de franchir une étape clé dans l’industrialisation de ton projet.&lt;br /&gt;
Même en solo, tu utilises les &lt;strong&gt;mêmes outils&lt;/strong&gt; que dans les grandes équipes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;Merci pour ta lecture 🙌&lt;br /&gt;
N’hésite pas à partager cet article ou me faire part de tes retours, idées d&#39;amélioration ou suggestions d’articles !&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Le Contrôle face au Libéralisme au sein du Cyberespace 🌌</title>
    <link href="https://www.videlaine.fr/posts/control-vs-liberalism-in-cyberspace/"/>
    <updated>2022-09-24T12:00:00Z</updated>
    <id>https://www.videlaine.fr/posts/control-vs-liberalism-in-cyberspace/</id>
    <summary>Dissertation rédigée à TalTech (Legal Aspects of Cyber Security) : contrôle ou liberté dans le cyberespace, réflexion éthique sur son avenir et celui de l&#39;IA.</summary>
    <content xml:lang="fr" type="html">&lt;p&gt;Dans le cadre de mes études à TalTech - Université de Technologie de Tallinn, j&#39;ai été amené à rédiger une dissertation répondant à la problématique &amp;quot;Control VS. Liberation in the Cyberspace&amp;quot;. Cette réflexion prend place à l&#39;occasion du module &amp;quot;Legal Aspects of Cyber Security&amp;quot; mais est davantage une approche éthique et documentée du sujet.&lt;br /&gt;
Représentant quelques heures de recherche et de rédaction, &lt;a href=&quot;https://www.videlaine.fr/assets/docs/law-essay.pdf&quot; target=&quot;_blank&quot;&gt;je partage ici mon écrit&lt;/a&gt; afin d&#39;ouvrir le débat plus largement avec vous. N&#39;hésitez pas à me donner votre avis sur le sujet, ou encore un retour constructif relatif à la rédaction globale du document, via &lt;a href=&quot;https://twitter.com/LucasVidelaine&quot; target=&quot;_blank&quot;&gt;Twitter par exemple&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Le MFA dans les solutions de nomadisme 🔒</title>
    <link href="https://www.videlaine.fr/posts/mutlifactor-authentication-solutions-in-mobility/"/>
    <updated>2022-09-20T12:00:00Z</updated>
    <id>https://www.videlaine.fr/posts/mutlifactor-authentication-solutions-in-mobility/</id>
    <summary>MFA et nomadisme : définitions (2FA, MFA, OTP), risques à contenir, recommandations ANSSI pour la PSSI et panorama des principaux fournisseurs de solutions.</summary>
    <content xml:lang="fr" type="html">&lt;p&gt;Le MFA est aujourd&#39;hui un sujet majeur au sein des organisations, particulièrement lorsque ces dernières évoluent vers la tendance nomade. Vous en entendez parler régulièrement mais ne savez pas de quoi il s&#39;agit exactement ? Vous aimeriez en savoir davantage ? Vous êtes au bon endroit, puisqu&#39;au sein de ce petit article de vulgarisation, nous allons définir les principes et enjeux liés au MFA, notamment dans le contexte du nomadisme.&lt;/p&gt;
&lt;h2 id=&quot;les-termes-et-concepts-cl%C3%A9s&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/mutlifactor-authentication-solutions-in-mobility/#les-termes-et-concepts-cl%C3%A9s&quot;&gt;#&lt;/a&gt; Les termes et concepts clés&lt;/h2&gt;
&lt;p&gt;Commençons par un tour d&#39;horizon du vocabulaire existant, afin de pouvoir mieux apprécier la suite !&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nomadisme numérique :&lt;/strong&gt; Le nomadisme numérique désigne toute forme d’utilisation des technologies de l’information permettant à un utilisateur d’accéder au SI de son entreprise/organisation d’appartenance ou d’emploi, depuis des lieux distants, ces lieux n’étant pas maîtrisés par l’entité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2FA - Two-Factor Authentication :&lt;/strong&gt; Le nomadisme numérique désigne toute forme d’utilisation des technologies de l’information permettant à un utilisateur d’accéder au SI de son entreprise/organisation d’appartenance ou d’emploi, depuis des lieux distants, ces lieux n’étant pas maîtrisés par l’entité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MFA - Multiple Factor Authentication :&lt;/strong&gt; L&#39;authentification multifacteur (MFA) est un processus de sécurité qui nécessite plus de deux facteurs de vérification pour prouver l&#39;identité d&#39;un utilisateur. Il peut s’agir de facteur biométrique (reconnaissance faciale, digitale, etc), de code unique transmis par SMS ou email, de code unique généré par application dédiée, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OTP - One-Time Password :&lt;/strong&gt; L&#39;authentification multifacteur (MFA) est un processus de sécurité qui nécessite plus de deux facteurs de vérification pour prouver l&#39;identité d&#39;un utilisateur. Il peut s’agir de facteur biométrique (reconnaissance faciale, digitale, etc), de code unique transmis par SMS ou email, de code unique généré par application dédiée, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Point de vigilance :&lt;/strong&gt; Depuis 2021, l’ANSSI, Agence Nationale de la Sécurité des Systèmes d’Information, distingue l’authentification forte de l’authentification multifacteur : l’authentification forte, dans cette définition, repose sur des mécanismes cryptographiques jugés forts mais pas nécessairement sur plusieurs facteurs d’authentification.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;les-enjeux&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/mutlifactor-authentication-solutions-in-mobility/#les-enjeux&quot;&gt;#&lt;/a&gt; Les enjeux&lt;/h2&gt;
&lt;p&gt;Nous pouvons définir deux objectifs essentiels du MFA au sein du nomadisme, chacun pouvant être dérivé selon les contextes applicables.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Calculer et réduire&lt;/strong&gt; le degré d’exposition de l’information :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Durant un déplacement professionnel (à l’hôtel, chez un client)&lt;/li&gt;
&lt;li&gt;Durant un déplacement domicile-travail (dans les transports en commun)&lt;/li&gt;
&lt;li&gt;Dans des lieux publics (dans les espaces de coworking, aéroports, gares)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Contenir&lt;/strong&gt; les risques :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;De perte ou de vol de matériel&lt;/li&gt;
&lt;li&gt;De compromission des informations contenues dans le matériel perdu/volé&lt;/li&gt;
&lt;li&gt;De compromission du matériel (absence de l’utilisateur avec poste ouvert)&lt;/li&gt;
&lt;li&gt;D’accès illégitime au SI&lt;/li&gt;
&lt;li&gt;D’interception/d’altération des informations (confidentialité/intégrité des données)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;L’objectif d’un SI nomadisme est de réussir à tendre vers un niveau de sécurité le plus 	proche possible de celui du SI interne, en répondant aux risques d’exposition les plus forts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;les-%C3%A9volutions-de-la-r%C3%A9glementation&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/mutlifactor-authentication-solutions-in-mobility/#les-%C3%A9volutions-de-la-r%C3%A9glementation&quot;&gt;#&lt;/a&gt; Les évolutions de la réglementation&lt;/h2&gt;
&lt;p&gt;Afin de prévenir les risques liés au nomadisme et de réguler les utilisations, il est important d’intégrer le nomadisme dans la PSSI – Politique de Sécurité du Système d’Information de l’entité :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Identifier les métiers éligibles au nomadisme et au télétravail
&lt;ul&gt;
&lt;li&gt;Établir le niveau de sensibilité des données et de l’activité&lt;/li&gt;
&lt;li&gt;Établir les contraintes réglementaires&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Assurer la bonne maitrise des utilisateurs nomades
&lt;ul&gt;
&lt;li&gt;Assurer la gestion et la révocation des comptes et des droits des utilisateurs nomades&lt;/li&gt;
&lt;li&gt;Assurer la gestion des équipements mobiles nomades&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sensibiliser et former les utilisateurs nomades
&lt;ul&gt;
&lt;li&gt;Avertir sur les risques liés au vol ou la compromission du matériel informatique&lt;/li&gt;
&lt;li&gt;Avertir sur les fuites d’informations et autres indiscrétions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dédier l’équipement d’accès à un utilisateur nomade identifié
&lt;ul&gt;
&lt;li&gt;Lier chaque équipement à un utilisateur nomade identifié et référencé&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;les-principaux-fournisseurs&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/mutlifactor-authentication-solutions-in-mobility/#les-principaux-fournisseurs&quot;&gt;#&lt;/a&gt; Les principaux fournisseurs&lt;/h2&gt;
&lt;p&gt;Le marché des solutions MFA est assez vaste. Nous pouvons rapidement répertorier les leaders du domaine, mais aussi quelques produits ciblant également des PME.&lt;br /&gt;
Chaque constructeur propose une solution qui lui est propre, et qui s’intègre plus ou moins facilement dans un SI existant, en étant on-premise et/ou SaaS.&lt;/p&gt;
&lt;p&gt;Nous pouvons donc retrouver :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft MFA&lt;/li&gt;
&lt;li&gt;Thales SafeNet Trusted Access&lt;/li&gt;
&lt;li&gt;Okta MFA&lt;/li&gt;
&lt;li&gt;OneLogin MFA&lt;/li&gt;
&lt;li&gt;Cisco Duo MFA&lt;/li&gt;
&lt;li&gt;Ping Identity&lt;/li&gt;
&lt;li&gt;Fortinet FortiToken&lt;/li&gt;
&lt;li&gt;inWebo MFA&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ressources-associ%C3%A9es&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/mutlifactor-authentication-solutions-in-mobility/#ressources-associ%C3%A9es&quot;&gt;#&lt;/a&gt; Ressources associées&lt;/h2&gt;
&lt;p&gt;Les &lt;a href=&quot;https://www.ssi.gouv.fr/guide/recommandations-sur-le-nomadisme-numerique/&quot; target=&quot;_blank&quot;&gt;Recommandations sur le nomadisme numérique&lt;/a&gt; de l&#39;ANSSI.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Des hackers au secours d’un chantage à la sextape 🕵️</title>
    <link href="https://www.videlaine.fr/posts/hackers-blackmail-sextape/"/>
    <updated>2022-08-31T11:00:00Z</updated>
    <id>https://www.videlaine.fr/posts/hackers-blackmail-sextape/</id>
    <summary>Retour d&#39;expérience : comment nous avons fait échouer un chantage à la sextape mené via un compte Messenger volé, sans payer, et les bons réflexes à retenir.</summary>
    <content xml:lang="fr" type="html">&lt;p&gt;Nous sommes un vendredi soir de novembre lorsque je reçois l&#39;appel à l&#39;aide d&#39;une mère de famille, sous le joug d&#39;un odieux chantage. Laure, comme nous l’appellerons pour protéger son identité, a reçu mon contact par l&#39;un de ses amis avec qui j&#39;ai déjà eu l&#39;occasion de travailler, elle me joint alors pour que je puisse tenter de contrôler la fâcheuse situation.&lt;/p&gt;
&lt;p&gt;En parallèle de mes études d&#39;ingénieur à l&#39;ENSIBS, je développe une activité entrepreneuriale de services et conseils en cybersécurité, mais cette situation est pour moi une première ! Non pas moins motivé et particulièrement déterminé à renverser ce méprisable chantage, je prends connaissance de la situation, commence à établir un contexte et dresse les prémisses d&#39;un plan d&#39;action : nous ne céderons pas, nous ne paierons pas, et nous empêcherons la publication des contenus volés ✊&lt;/p&gt;
&lt;p&gt;Le fauteur de troubles relance régulièrement ses intimidations grâce au compte Messenger volé du compagnon de Laure, au sein duquel se trouve des photos et vidéos que le couple se partage.&lt;br /&gt;
Après plusieurs échanges, j&#39;en conclue qu&#39;il n&#39;est qu&#39;un opportuniste, et qu&#39;il a profité du mot de passe faible du compte pour mettre en place sa demande de rançon. Tout en gagnant du temps auprès de l&#39;attaquant, nous terminons les démarches de clôture de compte Facebook.&lt;/p&gt;
&lt;p&gt;Fort de mes expériences en gestion de crise, je conseille Laure pendant plus d&#39;une semaine tout en la rassurant, je suis pleinement conscient du stress permanent qu&#39;elle subit et me tiens à son écoute : l&#39;humain est ma priorité.&lt;br /&gt;
Quelques jours plus tard c&#39;est le soulagement, le compte a été supprimé par le support de Facebook, et l&#39;attaquant n&#39;a plus accès aux contenus échangés. Ce dernier, opérant certainement depuis un Cybercafé, n&#39;a pas pris le temps de sauvegarder son unique moyen de pression.&lt;/p&gt;
&lt;p&gt;La mission est un succès ! 🔥 Encore sous le choc de cette histoire, Laure et son compagnon m&#39;interrogent longuement sur les bonnes habitudes à suivre pour ne plus revivre cela :&lt;/p&gt;
&lt;p&gt;✔️ Utiliser des mots de passe suffisamment longs, intégrant majuscules, minuscules, chiffres et caractères spéciaux.&lt;br /&gt;
✔️ Utiliser un mot de passe différent pour chacun de vos comptes (aidez-vous d&#39;un gestionnaire de mot de passe tels que KeePass, Dashlane, ou 1Password).&lt;br /&gt;
✔️ Activer et configurer l&#39;authentification multifacteur lorsque cela est possible.&lt;br /&gt;
✔️ Favoriser l&#39;usage d&#39;applications de messagerie sécurisées telle que Signal.&lt;/p&gt;
&lt;h2 id=&quot;ressources-associ%C3%A9es&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/hackers-blackmail-sextape/#ressources-associ%C3%A9es&quot;&gt;#&lt;/a&gt; Ressources associées&lt;/h2&gt;
&lt;p&gt;Le dossier complet &lt;a href=&quot;https://www.videlaine.fr/assets/docs/hackers-rennais.pdf&quot; target=&quot;_blank&quot;&gt;Hackers Rennais&lt;/a&gt; au format PDF.&lt;br /&gt;
&lt;a href=&quot;https://www.videlaine.fr/assets/docs/des-hackers-au-secours-d-un-chantage-a-la-sextape.pdf&quot; target=&quot;_blank&quot;&gt;L&#39;article dans Le Télégramme&lt;/a&gt; au format PDF.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Mémo - Commandes Docker 🐳</title>
    <link href="https://www.videlaine.fr/posts/memo-docker-commands/"/>
    <updated>2022-07-28T00:00:00Z</updated>
    <id>https://www.videlaine.fr/posts/memo-docker-commands/</id>
    <summary>Mémo Docker : vocabulaire (conteneurs, images, Dockerfile, Compose, volumes) et commandes indispensables pour créer, lancer, lister et supprimer vos conteneurs.</summary>
    <content xml:lang="fr" type="html">&lt;p&gt;Docker est une logiciel libre permettant de lancer des applications dans des conteneurs logiciels.&lt;br /&gt;
Il ne s&#39;agit pas de virtualisation, mais de conteneurisation, une forme plus légère qui s&#39;appuie sur certaines parties de la machine hôte pour son fonctionnement. Cette approche permet d&#39;accroître la flexibilité et la portabilité d’exécution d&#39;une application, laquelle va pouvoir tourner de façon fiable et prévisible sur une grande variété de machines hôtes, que ce soit sur la machine locale, un cloud privé ou public, une machine nue, etc.&lt;br /&gt;
Techniquement, Docker étend le format de conteneur Linux standard, LXC, avec une API de haut niveau fournissant une solution pratique de virtualisation qui exécute les processus de façon isolée. Pour ce faire, Docker utilise entre autres LXC, cgroups et le noyau Linux lui-même. Contrairement aux machines virtuelles traditionnelles, un conteneur Docker n&#39;inclut pas de système d&#39;exploitation, mais s&#39;appuie au contraire sur les fonctionnalités du système d’exploitation fournies par la machine hôte.&lt;/p&gt;
&lt;h2 id=&quot;d%C3%A9finition-du-vocabulaire&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#d%C3%A9finition-du-vocabulaire&quot;&gt;#&lt;/a&gt; Définition du vocabulaire&lt;/h2&gt;
&lt;h3 id=&quot;containers&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#containers&quot;&gt;#&lt;/a&gt; Containers&lt;/h3&gt;
&lt;p&gt;Un container Docker, à l’opposé des machines virtuelles traditionnelles, n&#39;embarque pas de système d&#39;exploitation invité. En effet, il s’appuie sur les fonctionnalités du noyau hôte et exploite de l’isolation de ressources (CPU, mémoire, I/O, connexions réseau, etc).&lt;/p&gt;
&lt;h3 id=&quot;images&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#images&quot;&gt;#&lt;/a&gt; Images&lt;/h3&gt;
&lt;p&gt;Une image Docker représente le système de fichiers, sans les processus. Elle contient tout ce que vous avez décidé d’y installer tels qu&#39;un système de base de données, un serveur web, une application python, etc. Les images sont créées à partir de fichiers de configuration, nommés « Dockerfiles », qui décrivent exactement ce qui doit être installé dans le container. Un conteneur correspond donc à l’exécution d’une image spécifique.&lt;/p&gt;
&lt;h3 id=&quot;dockerfiles&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#dockerfiles&quot;&gt;#&lt;/a&gt; Dockerfiles&lt;/h3&gt;
&lt;p&gt;Le Dockerfile est votre fichier source qui permet la construction d&#39;une image. Un Dockerfile peut être inclus dans d’autres Dockerfile, et être à la base de plusieurs images différentes. Vous pouvez choisir d’utiliser des images officielles, des images modifiées, que vous trouvez sur &lt;a href=&quot;https://hub.docker.com/&quot;&gt;Docker Hub&lt;/a&gt; ou autres répertoires d&#39;images, mais vous pouvez aussi choisir de personnaliser vos propres images en écrivant un Dockerfile.&lt;/p&gt;
&lt;h3 id=&quot;compose&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#compose&quot;&gt;#&lt;/a&gt; Compose&lt;/h3&gt;
&lt;p&gt;Compose est un outil pour définir et exécuter des applications multi-conteneurs. Les conteneurs étant idéaux pour des applications basées sur des microservices, il devient nécessaire de gérer les différents containers ainsi que leurs interconnexions.&lt;/p&gt;
&lt;h3 id=&quot;volumes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#volumes&quot;&gt;#&lt;/a&gt; Volumes&lt;/h3&gt;
&lt;p&gt;Les volumes sont un mécanisme permettant la persistance des données générées par et utilisées par les conteneurs Docker. Les volumes Docker ont de nombreux avantages, tels qu’une grande simplicité de sauvegarde et de migration ou encore leur gestion facilité grâce aux outils et commandes Docker.&lt;/p&gt;
&lt;h3 id=&quot;kubernetes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#kubernetes&quot;&gt;#&lt;/a&gt; Kubernetes&lt;/h3&gt;
&lt;p&gt;Kubernetes est un système open source qui vise à fournir une plateforme permettant d&#39;automatiser le déploiement, la montée en charge et la mise en œuvre de conteneurs.&lt;/p&gt;
&lt;h2 id=&quot;commandes-indispensables&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#commandes-indispensables&quot;&gt;#&lt;/a&gt; Commandes indispensables&lt;/h2&gt;
&lt;h3 id=&quot;informations-diverses-sur-docker&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#informations-diverses-sur-docker&quot;&gt;#&lt;/a&gt; Informations diverses sur Docker&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker info
docker version
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;cr%C3%A9er-et-d%C3%A9marrer-un-container&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#cr%C3%A9er-et-d%C3%A9marrer-un-container&quot;&gt;#&lt;/a&gt; Créer et démarrer un container&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker run [image_name]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;arr%C3%AAter-un-container&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#arr%C3%AAter-un-container&quot;&gt;#&lt;/a&gt; Arrêter un container&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker stop [container_id]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;d%C3%A9marrer-un-container&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#d%C3%A9marrer-un-container&quot;&gt;#&lt;/a&gt; Démarrer un container&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker start [container_id]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;supprimer-un-container&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#supprimer-un-container&quot;&gt;#&lt;/a&gt; Supprimer un container&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker rm [container_id]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;lister-les-containers-d%C3%A9marr%C3%A9s-et-lister-tous-les-containers&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#lister-les-containers-d%C3%A9marr%C3%A9s-et-lister-tous-les-containers&quot;&gt;#&lt;/a&gt; Lister les containers démarrés et lister tous les containers&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker ps 
docker ps -a
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;arr%C3%AAter-tous-les-containers&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#arr%C3%AAter-tous-les-containers&quot;&gt;#&lt;/a&gt; Arrêter tous les containers&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker stop $(docker  ps -a -q)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;d%C3%A9marrer-tous-les-containers&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#d%C3%A9marrer-tous-les-containers&quot;&gt;#&lt;/a&gt; Démarrer tous les containers&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker start $(docker ps -a -q)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;supprimer-tous-les-containers-(apr%C3%A8s-les-avoir-arr%C3%AAt%C3%A9s)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#supprimer-tous-les-containers-(apr%C3%A8s-les-avoir-arr%C3%AAt%C3%A9s)&quot;&gt;#&lt;/a&gt; Supprimer tous les containers (après les avoir arrêtés)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker rm $(docker  ps -a -q)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;lister-les-images-locales-(t%C3%A9l%C3%A9charg%C3%A9es-ou-construites)&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#lister-les-images-locales-(t%C3%A9l%C3%A9charg%C3%A9es-ou-construites)&quot;&gt;#&lt;/a&gt; Lister les images locales (téléchargées ou construites)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker images
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;supprimer-une-ou-des-images&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#supprimer-une-ou-des-images&quot;&gt;#&lt;/a&gt; Supprimer une ou des images&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker rmi [container_id] [container_id] ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;construire-une-image-%C3%A0-partir-d&#39;un-dockerfile&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#construire-une-image-%C3%A0-partir-d&#39;un-dockerfile&quot;&gt;#&lt;/a&gt; Construire une image à partir d&#39;un Dockerfile&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker build -t [wanted_image_name] -f [path_to_dockerfile]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ex%C3%A9cuter-un-fichier-docker-compose-en-mode-d%C3%A9tach%C3%A9&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#ex%C3%A9cuter-un-fichier-docker-compose-en-mode-d%C3%A9tach%C3%A9&quot;&gt;#&lt;/a&gt; Exécuter un fichier docker-compose en mode détaché&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker-compose -d -f [path_to_docker-compose-file]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ex%C3%A9cuter-une-commande-au-sein-d&#39;un-container&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#ex%C3%A9cuter-une-commande-au-sein-d&#39;un-container&quot;&gt;#&lt;/a&gt; Exécuter une commande au sein d&#39;un container&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker exec -it [container_id] [command]
docker exec -it [container_id] bash
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;afficher-les-journaux-de-logs-d&#39;un-container&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#afficher-les-journaux-de-logs-d&#39;un-container&quot;&gt;#&lt;/a&gt; Afficher les journaux de logs d&#39;un container&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker logs [container_id]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;sources&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;https://www.videlaine.fr/posts/memo-docker-commands/#sources&quot;&gt;#&lt;/a&gt; Sources&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.docker.com/engine/reference/commandline/docker/&quot; target=&quot;_blank&quot;&gt;Documentation officielle&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://lucasvidelaine.wordpress.com/2018/01/26/memo-commandes-docker/&quot; target=&quot;_blank&quot;&gt;Article initial de 2018&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
</feed>
