﻿<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
	<channel>
		<title>Cloud en français</title>
		<link>/</link>
		<description>Parlons du «cloud computing» en français</description>
		<copyright>Copyright © 2026</copyright>
		<pubDate>Thu, 29 Jan 2026 21:04:22 GMT</pubDate>
		<lastBuildDate>Thu, 29 Jan 2026 21:04:22 GMT</lastBuildDate>
		<item>
			<title>Créez automatiquement des clips IA avec ce template n8n</title>
			<link>/posts/2026-01-27-n8n-ai-creez-clip-auto.html</link>
			<description>Parlons du «cloud computing» en français</description>
			<enclosure url="/content/images/Cloudenfrancais-logo3.png" length="0" type="image" />
			<guid isPermaLink="false">/posts/2026-01-27-n8n-ai-creez-clip-auto.html</guid>
			<pubDate>Thu, 29 Jan 2026 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h1 id="creez-automatiquement-des-clips-ia-avec-ce-template-n8n"&gt;Créez automatiquement des clips IA avec ce template n8n&lt;/h1&gt;
&lt;p&gt;&lt;img src="/content/images/2026/01/cover_n8n_api_template_800.png" alt="Nouveau template n8n de découpage Reka"&gt;&lt;/p&gt;
&lt;p&gt;Je suis ravi de partager que mon nouveau template n8n a été approuvé et est maintenant disponible pour tout le monde! Ce template automatise le processus de création de clips vidéo générés par AI à partir de vidéos YouTube et envoie des notifications directement dans votre boîte courriel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Essayez le template ici:&lt;/strong&gt; &lt;a href="https://link.reka.ai/n8n-template-api"&gt;https://link.reka.ai/n8n-template-api&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="quest-ce-que-ce-template-fait"&gt;Qu'est-ce que ce template fait?&lt;/h2&gt;
&lt;p&gt;Si vous avez toujours voulu créer automatiquement des courts clips à partir de longues vidéos YouTube, ce template est pour vous. Il surveille une chaîne YouTube de votre choix, et chaque fois qu'une nouvelle vidéo est publiée, il utilise l'AI pour générer des courts clips engageants parfaits pour les médias sociaux. Vous recevez une notification par courriel lorsque votre clip est prêt à télécharger.&lt;/p&gt;
&lt;h2 id="comment-ca-fonctionne"&gt;Comment ça fonctionne&lt;/h2&gt;
&lt;p&gt;Le flux de travail est simple et s'exécute complètement en pilote automatique:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Surveiller les chaînes YouTube&lt;/strong&gt; - Le template surveille le flux RSS de n'importe quelle chaîne YouTube que vous spécifiez. Lorsqu'une nouvelle vidéo apparaît, l'automation se déclenche.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Demander la génération de clip AI&lt;/strong&gt; - En utilisant l'API Vision de Reka, le flux de travail envoie la vidéo pour traitement AI. Vous avez le contrôle complet sur la sortie:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rédigez une instruction personnalisée pour guider l'AI sur le type de clip à créer&lt;/li&gt;
&lt;li&gt;Choisissez d'inclure ou non des sous-titres&lt;/li&gt;
&lt;li&gt;Définissez la durée minimale et maximale du clip&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vérification intelligente du statut&lt;/strong&gt; - Lorsque les clips sont prêts, vous recevez un courriel de succès avec votre lien de téléchargement. Comme mesure de sécurité, si la tâche prend trop de temps, vous recevrez plutôt une notification d'erreur.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="demarrer-est-facile"&gt;Démarrer est facile&lt;/h2&gt;
&lt;p&gt;Le meilleur? Vous pouvez installer ce template en un seul clic depuis la &lt;a href="https://link.reka.ai/n8n-template-api"&gt;page des templates n8n&lt;/a&gt;. Aucune configuration complexe requise!&lt;/p&gt;
&lt;p&gt;Après l'installation, vous n'aurez besoin que de deux choses rapides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une clé API Reka AI gratuite (&lt;a href="https://link.reka.ai/free"&gt;obtenez la vôtre chez Reka&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Un compte Gmail (ou utilisez n'importe quel fournisseur de courriel que vous aimez)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est tout! Le template est prêt à utiliser. Ajoutez simplement le flux RSS de votre chaîne YouTube, connectez votre clé API, et vous êtes prêt à commencer à générer des clips automatiquement. La configuration complète ne prend que quelques minutes.&lt;/p&gt;
&lt;p&gt;Si vous avez des questions ou voulez partager ce que vous avez créé, rejoignez la &lt;a href="https://link.reka.ai/discord"&gt;communauté Discord de Reka&lt;/a&gt;. J'aimerais beaucoup savoir comment vous utilisez ce template!&lt;/p&gt;
&lt;h2 id="regardez-le-en-action"&gt;Regardez-le en action&lt;/h2&gt;
&lt;p&gt;Dans cette vidéo rapide, je vous montre comment installer et configurer le template n8n pour créer automatiquement le template n8n.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/SGAltjnBaF4?si=42-EpCEnra6Xwk8r" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""&gt;&lt;/iframe&gt;
&lt;p&gt;Bon clipping!&lt;/p&gt;
</content:encoded>
			<comments xmlns="http://purl.org/rss/1.0/modules/slash/">0</comments>
		</item>
		<item>
			<title>De zéro à n8n: créer son premier node personnalisé</title>
			<link>/posts/2026-01-20-de-zero-a-n8n-noeud-personnalise.html</link>
			<description>Parlons du «cloud computing» en français</description>
			<enclosure url="/content/images/Cloudenfrancais-logo3.png" length="0" type="image" />
			<guid isPermaLink="false">/posts/2026-01-20-de-zero-a-n8n-noeud-personnalise.html</guid>
			<pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h1 id="de-zero-a-n8n-creer-son-premier-nud-personnalise"&gt;De zéro à n8n : créer son premier nœud personnalisé&lt;/h1&gt;
&lt;p&gt;Récemment, j'ai décidé de créer un cutom node pour &lt;a href="https://n8n.io/"&gt;n8n&lt;/a&gt;, l'outil d'automatisation de flux de travail que j'utilise. Je ne suis pas un expert en développement Node.js, mais je voulais comprendre comment les node n8n fonctionnent sous le capot. Cet article partage mon parcours et les étapes qui ont réellement fonctionné pour moi.&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2026/01/n8n-node-build-successful_600.png" alt="n8n node build successful"&gt;&lt;/p&gt;
&lt;h2 id="pourquoi-jai-fait-ca"&gt;Pourquoi j'ai fait ça&lt;/h2&gt;
&lt;p&gt;Avant de commencer ce projet, j'étais curieux de savoir comment les node n8n sont construits. La meilleure façon d'apprendre quelque chose est de le faire, alors j'ai décidé de créer un cutom node simple en suivant le tutoriel officiel de n8n. Maintenant que je comprends les bases, je prévois construire un node plus complexe avec des capacités d'IA Vision, mais c'est pour un autre billet sur ce blogue!&lt;/p&gt;
&lt;h2 id="le-defi"&gt;Le défi&lt;/h2&gt;
&lt;p&gt;J'ai commencé avec le tutoriel officiel de n8n: &lt;a href="https://docs.n8n.io/integrations/creating-nodes/build/declarative-style-node/"&gt;Build a declarative-style node&lt;/a&gt;. Bien que le tutoriel soit bien écrit, j'ai rencontré quelques problèmes en cours de route. Les étapes ne fonctionnaient pas exactement comme décrit, alors j'ai dû comprendre ce qui manquait. Cet article documente ce qui a réellement fonctionné pour moi, au cas où vous feriez face à des défis similaires. J'ai déjà une instance de n8n qui roule dans un conteneur. À l'&lt;strong&gt;étape 8&lt;/strong&gt;, j'expliquerai comment j'exécute une deuxième instance pour des fins de développement.&lt;/p&gt;
&lt;h2 id="prerequis"&gt;Prérequis&lt;/h2&gt;
&lt;p&gt;Avant de commencer, vous aurez besoin de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Node.js et npm&lt;/strong&gt; - J'ai utilisé Node.js version 24.12.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compréhension de base de JavaScript/TypeScript&lt;/strong&gt; - vous n'avez pas besoin d'être un expert&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="etape-1-corriger-les-prerequis-manquants"&gt;Étape 1 : Corriger les prérequis manquants&lt;/h2&gt;
&lt;p&gt;Je n'avais pas Node.js installé sur ma machine, donc ma première étape a été de régler ça. Au lieu d'installer Node.js directement, j'ai utilisé &lt;strong&gt;nvm&lt;/strong&gt; (Node Version Manager), qui facilite la gestion de différentes versions de Node.js. Les détails d'installation sont disponibles sur le &lt;a href="https://github.com/nvm-sh/nvm"&gt;dépôt GitHub de nvm&lt;/a&gt;. Une fois nvm configuré, j'ai installé Node.js version 24.12.0.&lt;/p&gt;
&lt;p&gt;La plupart du temps, j'utilise VS Code comme éditeur de code. J'ai créé un nouveau profil et utilisé le modèle pour le développement Node.js afin d'obtenir les bonnes extensions et paramètres.&lt;/p&gt;
&lt;h2 id="etape-2-cloner-le-depot-de-demarrage"&gt;Étape 2 : Cloner le dépôt de démarrage&lt;/h2&gt;
&lt;p&gt;n8n fournit un &lt;a href="https://github.com/n8n-io/n8n-nodes-starter"&gt;n8n-nodes-starter sur GitHub&lt;/a&gt; qui inclut tous les fichiers de base et les dépendances dont vous avez besoin. Vous pouvez le cloner ou l'utiliser comme modèle pour votre propre projet. Puisque c'était seleument un « exercice d'apprentissage » pour moi, j'ai cloné le dépôt directement :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;git clone https://github.com/n8n-io/n8n-nodes-starter
cd n8n-nodes-starter
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="etape-3-commencer-avec-le-tutoriel"&gt;Étape 3 : Commencer avec le tutoriel&lt;/h2&gt;
&lt;p&gt;Je ne répéterai pas le tutoriel complet ici; il est assez clair, mais je soulignerai quelques détails en cours de route que j'ai trouvés utiles.&lt;/p&gt;
&lt;p&gt;Le tutoriel vous fait créer un node « NasaPics » et fournit un logo pour celui-ci. C'est super, mais je suggère d'utiliser vos propres images de logo et d'avoir des versions claires et sombres. Ajoutez les deux images dans un nouveau dossier &lt;code&gt;icons&lt;/code&gt; (au même niveau que les dossiers &lt;code&gt;nodes&lt;/code&gt; et &lt;code&gt;credentials&lt;/code&gt;). Avoir deux versions du logo rendra votre node plus beau, peu importe le thème que l'utilisateur utilise dans n8n (clair ou sombre). Le tutoriel ajoute seulement le logo dans &lt;code&gt;NasaPics.node.ts&lt;/code&gt;, mais j'ai trouvé que l'ajouter aussi dans le fichier de credentials &lt;code&gt;NasaPicsApi.credentials.ts&lt;/code&gt; rend le node plus cohérent.&lt;/p&gt;
&lt;p&gt;Remplacez ou ajoutez la ligne du logo avec ceci, et ajoutez &lt;code&gt;Icon&lt;/code&gt; à la déclaration d'importation en haut du fichier :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;icon: Icon = { light: 'file:MyLogo-dark.svg', dark: 'file:MyLogo-light.svg' };
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Note : le logo plus foncé devrait être utilisé en mode clair, et vice versa.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="etape-4-suivre-le-tutoriel-avec-ajustements"&gt;Étape 4 : Suivre le tutoriel (avec ajustements)&lt;/h2&gt;
&lt;p&gt;C'est là que les choses sont devenues intéressantes. J'ai suivi le tutoriel officiel pour créer les fichiers de node, mais j'ai dû faire quelques ajustements qui n'étaient pas mentionnés dans la documentation.&lt;/p&gt;
&lt;h3 id="ajustement-1-rendre-le-node-utilisable-comme-outil"&gt;Ajustement 1 : Rendre le node utilisable comme outil&lt;/h3&gt;
&lt;p&gt;Dans le fichier &lt;code&gt;NasaPics.node.ts&lt;/code&gt;, j'ai ajouté cette ligne juste avant le tableau &lt;code&gt;properties&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;requestDefaults: {
      baseURL: 'https://api.nasa.gov',
      headers: {
         Accept: 'application/json',
         'Content-Type': 'application/json',
      },
   },
   usableAsTool: true, // &amp;lt;-- Ajouté cette ligne
   properties: [
      // Resources and operations will go here
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce paramètre permet au node d'être utilisé comme outil dans les flux de travail n8n et corrige aussi les avertissements de l'outil de lint.&lt;/p&gt;
&lt;h3 id="ajustement-2-securiser-le-champ-de-cle-api"&gt;Ajustement 2 : Sécuriser le champ de clé API&lt;/h3&gt;
&lt;p&gt;Dans le fichier &lt;code&gt;NasaPicsApi.credentials.ts&lt;/code&gt;, j'ai ajouté un &lt;code&gt;typeOptions&lt;/code&gt; pour faire du champ de clé API un champ de mot de passe. Cela garantit que la clé API est cachée lorsque les utilisateurs la saisissent, ce qui est une bonne pratique de sécurité.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;properties: INodeProperties[] = [
   {
      displayName: 'API Key',
      name: 'apiKey',
      type: 'string',
      typeOptions: { password: true }, // &amp;lt;-- Ajouté cette ligne
      default: '',
   },
];
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="une-note-sur-les-erreurs"&gt;Une note sur les erreurs&lt;/h3&gt;
&lt;p&gt;J'ai remarqué qu'il y avait quelques autres erreurs qui apparaissaient dans le fichier de credentials. Si vous lisez le message d'erreur, vous verrez qu'il se plaint de propriétés &lt;code&gt;test&lt;/code&gt; manquantes. Pour corriger cela, j'ai ajouté une propriété &lt;code&gt;test&lt;/code&gt; à la fin de la classe qui implémente &lt;code&gt;ICredentialTestRequest&lt;/code&gt;. J'ai aussi ajouté l'importation de l'interface en haut du fichier.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-typescript"&gt;authenticate: IAuthenticateGeneric = {
   type: 'generic',
   properties: {
      qs: {
         api_key: '={{$credentials.apiKey}}',
      },
   },
};

// Ajoutez ceci à la fin de la classe
test: ICredentialTestRequest = {
   request: {
      baseURL: 'https://api.nasa.gov/',
      url: '/user',
      method: 'GET',
   },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="etape-5-construire-et-lier-le-paquet"&gt;Étape 5 : Construire et lier le paquet&lt;/h2&gt;
&lt;p&gt;Une fois que j'avais tous mes fichiers prêts, il était temps de construire le node. Depuis la racine du dossier de mon projet de node, j'ai exécuté :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;npm i
npm run build
npm link
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pendant le processus de construction, faites attention au nom du paquet qui est généré. Dans mon cas, c'était &lt;code&gt;n8n-nodes-nasapics&lt;/code&gt;. Vous aurez besoin de ce nom dans les prochaines étapes.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;&amp;gt; n8n-nodes-nasapics@0.1.0 build
&amp;gt; n8n-node build

┌   n8n-node build
│
◓  Building TypeScript files│
◇  TypeScript build successful
│
◇  Copied static files
│
└  ✓ Build successful
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="etape-6-configurer-le-dossier-personnalise-de-n8n"&gt;Étape 6 : Configurer le dossier personnalisé de n8n&lt;/h2&gt;
&lt;p&gt;n8n cherche les node personnalisés dans un emplacement spécifique : &lt;code&gt;~/.n8n/custom/&lt;/code&gt;. Si ce dossier n'existe pas, vous devez le créer :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;mkdir -p ~/.n8n/custom
cd ~/.n8n/custom
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ensuite, initialisez un nouveau paquet npm dans ce dossier : exécutez &lt;code&gt;npm init&lt;/code&gt; et appuyez sur Entrée pour accepter tous les défauts.&lt;/p&gt;
&lt;h2 id="etape-7-lier-votre-node-a-n8n"&gt;Étape 7 : Lier votre node à n8n&lt;/h2&gt;
&lt;p&gt;Maintenant vient la partie magique - lier votre cutom node pour que n8n puisse le trouver. Remplacez &lt;code&gt;n8n-nodes-nasapics&lt;/code&gt; par le nom de votre paquet. Depuis le dossier &lt;code&gt;~/.n8n/custom&lt;/code&gt;, exécutez :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;npm link n8n-nodes-nasapics
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="etape-8-executer-n8n"&gt;Étape 8 : Exécuter n8n&lt;/h2&gt;
&lt;p&gt;C'est ici que ma configuration diffère du tutoriel standard. Comme mentionné au début, j'ai déjà une instance de n8n qui roule dans un conteneur et je ne voulais pas l'installer. Alors j'ai décidé d'exécuter un deuxième conteneur en utilisant un port différent. Voici la commande que j'ai utilisée :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;docker run -d --name n8n-DEV -p 5680:5678 \
  -e N8N_COMMUNITY_PACKAGES_ENABLED=true \
  -v ~/.n8n/custom/node_modules/n8n-nodes-nasapics:/home/node/.n8n/custom/node_modules/n8n-nodes-nasapics \
  n8nio/n8n
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Laissez-moi expliquer ce que cette commande fait :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; : Exécute le conteneur en mode détaché (en arrière-plan)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--name n8n-DEV&lt;/code&gt; : Nomme le conteneur pour une référence facile&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p 5680:5678&lt;/code&gt; : Mappe le port 5678 du conteneur au port 5680 sur ma machine pour qu'il n'entre pas en conflit avec mon instance existante de n8n&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e N8N_COMMUNITY_PACKAGES_ENABLED=true&lt;/code&gt; : Active les paquets communautaires — vous en avez besoin pour utiliser des node personnalisés&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v&lt;/code&gt; : Monte mon dossier de cutom node dans le conteneur, ce qui me permet d'essayer mon cutom node sans avoir à le publier.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;n8nio/n8n&lt;/code&gt; : L'image de conteneur officielle de n8n&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous exécutez n8n directement sur votre machine (pas dans un conteneur), vous pouvez simplement le démarrer.&lt;/p&gt;
&lt;h2 id="etape-9-tester-votre-node"&gt;Étape 9 : Tester votre node&lt;/h2&gt;
&lt;p&gt;Une fois que &lt;strong&gt;n8n-DEV&lt;/strong&gt; roule, ouvrez votre navigateur et naviguez vers celui-ci. Créez un nouveau flux de travail et recherchez votre node. Dans mon cas, j'ai cherché « NasaPics » et mon cutom node est apparu!&lt;/p&gt;
&lt;p&gt;Pour le tester :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ajoutez votre node au flux de travail&lt;/li&gt;
&lt;li&gt;Configurez les credentials avec une clé API de la NASA (vous pouvez en obtenir une gratuitement sur &lt;a href="https://api.nasa.gov/"&gt;api.nasa.gov&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Exécutez le node&lt;/li&gt;
&lt;li&gt;Vérifiez si les données sont récupérées correctement&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="mettre-a-jour-votre-node"&gt;Mettre à jour votre node&lt;/h2&gt;
&lt;p&gt;Pendant le développement, vous devrez probablement apporter des modifications à votre code (aka node). Une fois terminé, vous devez reconstruire &lt;code&gt;npm run build&lt;/code&gt; et redémarrer le conteneur n8n &lt;code&gt;docker restart n8n-DEV&lt;/code&gt; pour voir les changements.&lt;/p&gt;
&lt;h2 id="quelle-est-la-suite"&gt;Quelle est la suite?&lt;/h2&gt;
&lt;p&gt;Maintenant que je comprends les bases de la construction de node personnalisés n8n, je suis prêt à m'attaquer à quelque chose de plus ambitieux. Mon prochain projet sera de créer un node qui utilise des capacités d'IA Vision. Alerte au spoiler : C'est fait et je partagerai les détails dans un prochain article de blogue!&lt;/p&gt;
&lt;p&gt;Si vous êtes intéressé à créer vos propres node personnalisés, je vous encourage à essayer. Commencez avec quelque chose de simple, comme je l'ai fait, et construisez à partir de là. N'ayez pas peur d'expérimenter et de faire des erreurs, c'est comme ça qu'on apprend!&lt;/p&gt;
&lt;h4 id="ressources"&gt;Ressources&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/"&gt;Documentation officielle de n8n&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/integrations/creating-nodes/build/declarative-style-node/"&gt;Tutoriel Build a declarative-style node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/n8n-io/n8n-nodes-starter"&gt;Dépôt n8n-nodes-starter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/nvm-sh/nvm"&gt;nvm (Node Version Manager)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.n8n.io/"&gt;Forum communautaire de n8n&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
			<comments xmlns="http://purl.org/rss/1.0/modules/slash/">0</comments>
		</item>
		<item>
			<title>Exposer des conteneurs d'un homelab avec Traefik et Cloudflare Tunnel</title>
			<link>/posts/2026-01-07-treafik-cloudflare-setup-fr.html</link>
			<description>Parlons du «cloud computing» en français</description>
			<enclosure url="/content/images/Cloudenfrancais-logo3.png" length="0" type="image" />
			<guid isPermaLink="false">/posts/2026-01-07-treafik-cloudflare-setup-fr.html</guid>
			<pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;J'adore le cloud, en fait la plupart des gens me connaissent probablement grâce à mon contenu partagé à ce sujet. Mais parfois, nos applications n'ont pas besoin de mise à l'échelle ou de redondance. Parfois, on veut simplement les héberger quelque part.&lt;/p&gt;
&lt;p&gt;C'était les vacances, et pendant mon congé, j'ai travaillé sur quelques petits projets personnels. Je les ai empaquetés dans des conteneurs pour faciliter le déploiement n'importe où. Je les ai déployés sur un mini PC que j'ai à la maison et c'est génial... tant que je reste à la maison. Mais que faire si je veux y accéder depuis ailleurs (ex. : la maison de mes beaux parents) ?&lt;/p&gt;
&lt;p&gt;J'ai configuré un beau tunnel Cloudflare vers un conteneur Traefik qui achemine le trafic vers le bon conteneur selon le préfixe ou le domaine de second niveau. Donc &lt;code&gt;dev.c5m.ca&lt;/code&gt; va au conteneur X et &lt;code&gt;test.c5m.ca&lt;/code&gt; va au conteneur Y. Dans ce billet, je voulais partager comment je l'ai fait (et aussi l'avoir quelque part pour moi au cas où j'aurais besoin de le refaire 😉). C'est simple une fois qu'on sait comment toutes les pièces fonctionnent ensemble.&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2026/01/brick-container-light_800.jpeg" alt="exposer un conteneur"&gt;&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;i&gt;&lt;span style="color: #999999;"&gt;generated by Microsoft designer&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;h2 id="la-configuration"&gt;La configuration&lt;/h2&gt;
&lt;p&gt;L'architecture est simple : Cloudflare Tunnel crée une connexion sécurisée de mon réseau domestique vers le réseau périphérique de Cloudflare, et Traefik agit comme un proxy inverse qui route dynamiquement les requêtes entrantes vers le conteneur approprié selon le sous-domaine. De cette façon, je peux accéder à plusieurs services via différents sous-domaines sans exposer mon réseau domestique directement à Internet.&lt;/p&gt;
&lt;h2 id="etape-1-cloudflare-tunnel"&gt;Étape 1 : Cloudflare Tunnel&lt;/h2&gt;
&lt;p&gt;D'abord, en supposant que vous possédez déjà un nom de domaine, vous devrez créer un tunnel Cloudflare. Vous pouvez le faire via le tableau de bord Cloudflare sous Zero Trust → Networks → Tunnels. Une fois créé, vous obtiendrez un jeton de tunnel que vous utiliserez dans la configuration.&lt;/p&gt;
&lt;p&gt;Voici mon &lt;code&gt;cloudflare-docker-compose.yaml&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;name: cloudflare-tunnel

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    env_file:
      - .env
    environment:
      - TUNNEL_TOKEN=${TUNNEL_TOKEN}
    command: ["tunnel", "--no-autoupdate", "run", "--token", "${TUNNEL_TOKEN}"]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le jeton de tunnel est stocké dans un fichier &lt;code&gt;.env&lt;/code&gt; pour la sécurité. Le drapeau &lt;code&gt;--no-autoupdate&lt;/code&gt; empêche le conteneur d'essayer de se mettre à jour automatiquement, ce qui est utile dans un environnement contrôlé.&lt;/p&gt;
&lt;h2 id="etape-2-configuration-dns"&gt;Étape 2 : Configuration DNS&lt;/h2&gt;
&lt;p&gt;Dans le tableau de bord Cloudflare, créez un enregistrement &lt;code&gt;CNAME&lt;/code&gt; avec un caractère générique &lt;code&gt;*.c5m.ca&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="etape-3-configuration-traefik"&gt;Étape 3 : Configuration Traefik&lt;/h2&gt;
&lt;p&gt;Traefik est le proxy inverse qui routera le trafic vers vos conteneurs. J'ai deux fichiers de configuration : un pour Traefik lui-même et un pour la configuration Docker Compose.&lt;/p&gt;
&lt;p&gt;Voici mon &lt;code&gt;traefik.yaml&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;global:
  checkNewVersion: false
  sendAnonymousUsage: false

api:
  dashboard: false #true
  insecure: true

entryPoints:
  web:
    address: :8082
  websecure:
    address: :8043

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;J'ai configuré deux points d'entrée : &lt;code&gt;web&lt;/code&gt; sur le port 8082 (HTTP) et &lt;code&gt;websecure&lt;/code&gt; sur le port 8043 (HTTPS). Je l'ai fait ainsi parce que les ports par défaut 80 et 443 étaient déjà pris. Le fournisseur Docker surveille les conteneurs avec des étiquettes Traefik et configure automatiquement le routage. &lt;code&gt;exposedByDefault: false&lt;/code&gt; signifie que les conteneurs ne seront pas exposés à moins d'être explicitement activés avec des étiquettes. Vous n'aurez pas à modifier la configuration Traefik pour ajouter plus de conteneurs, tout est dynamique.&lt;/p&gt;
&lt;p&gt;Et voici le &lt;code&gt;traefik-docker-compose.yaml&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;name: traefik

services:
  traefik:
    image: "traefik:v3.4"
    container_name: "traefik-app"
    restart: unless-stopped
    networks:
      - proxy

    ports:
      - "8888:8080" # Dashboard port
      - "8082:8082"
      - "8043:8043" # remap 443
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./config/traefik.yaml:/etc/traefik/traefik.yaml:ro"

networks:
  proxy:
    name: proxy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les points clés ici :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Traefik est connecté à un réseau Docker appelé &lt;code&gt;proxy&lt;/code&gt; qui sera partagé avec d'autres conteneurs. Vous pouvez le nommer comme vous voulez.&lt;/li&gt;
&lt;li&gt;Le port 8888 mappe au tableau de bord de Traefik (actuellement désactivé dans la config)&lt;/li&gt;
&lt;li&gt;Les ports 8082 et 8043 sont exposés pour le trafic HTTP et HTTPS&lt;/li&gt;
&lt;li&gt;La socket Docker est montée en lecture seule pour que Traefik puisse découvrir les conteneurs&lt;/li&gt;
&lt;li&gt;Le fichier de configuration est monté depuis &lt;code&gt;./config/traefik.yaml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="etape-4-configuration-des-services"&gt;Étape 4 : Configuration des services&lt;/h2&gt;
&lt;p&gt;Maintenant, tout conteneur que vous voulez exposer via Traefik doit :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Être sur le même réseau &lt;code&gt;proxy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Avoir des étiquettes Traefik configurées&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voici un exemple simple avec un conteneur nginx (&lt;code&gt;nginx-docker-compose.yaml&lt;/code&gt;) :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;name: "test-tools"

services:
  nginx:
    image: "nginx:latest"
    container_name: "nginx-test"
    restart: unless-stopped
    networks:
      - proxy
    volumes:
      - "./html:/usr/share/nginx/html:ro"
      
    labels:
      - traefik.enable=true
      - traefik.http.routers.nginxtest.rule=Host(`test.c5m.ca`) 
      - traefik.http.routers.nginxtest.entrypoints=web

networks:
  proxy:
    external: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les étiquettes indiquent à Traefik :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;traefik.enable=true&lt;/code&gt; : Ce conteneur devrait être exposé&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nginxtest&lt;/code&gt; est le nom &lt;strong&gt;unique&lt;/strong&gt; pour router ce conteneur.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;traefik.http.routers.nginxtest.rule=Host(...)&lt;/code&gt; : Router les requêtes pour &lt;code&gt;test.c5m.ca&lt;/code&gt; vers ce conteneur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;traefik.http.routers.nginxtest.entrypoints=web&lt;/code&gt; : Utiliser le point d'entrée &lt;code&gt;web&lt;/code&gt; (port 8082)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bonus-un-exemple-plus-complexe"&gt;Bonus : Un exemple plus complexe&lt;/h2&gt;
&lt;p&gt;Pour un scénario plus réaliste, partageons comment je pourrais exposer &lt;a href="https://github.com/FBoucher/2d6-dungeon-app"&gt;2D6 Dungeon App&lt;/a&gt;. C'est un projet qui utilise Aspire, donc c'est facile à déployer comme on veut, où on veut.
Voici une version simplifiée de mon &lt;code&gt;2d6-docker-compose.yaml&lt;/code&gt; qui inclut une application multi-conteneurs :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;name: 2d6-dungeon

services:
  database:
    container_name: 2d6_db
    ports:
      - "${MYSQL_PORT:-3306}:3306"
    networks:
      - proxy
    ...

  dab:
    container_name: 2d6_dab
    ...
    depends_on:
      database:
        condition: service_healthy
    ports:
      - "${DAB_PORT:-5000}:5000"
    networks:
      - proxy

  webapp:
    container_name: 2d6_app
    depends_on:
      - dab
    environment:
      ConnectionStrings__dab: http://dab:5000
      services__dab__http__0: http://dab:5000

    labels:
      - traefik.enable=true
      - traefik.http.routers.twodsix.rule=Host(`2d6.c5m.ca`)
      - traefik.http.routers.twodsix.entrypoints=web,websecure
      - traefik.http.services.twodsix.loadbalancer.server.port=${WEBAPP_PORT:-8080}

    networks:
      - proxy

    ports:
      - "${WEBAPP_PORT:-8080}:${WEBAPP_PORT:-8080}"

networks:
  proxy:
    external: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cet exemple montre :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plusieurs services qui fonctionnent ensemble (base de données, API, application web)&lt;/li&gt;
&lt;li&gt;Seule l'application web est exposée via Traefik (la base de données et l'API sont internes)&lt;/li&gt;
&lt;li&gt;L'application web utilise les deux points d'entrée &lt;code&gt;web&lt;/code&gt; et &lt;code&gt;websecure&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Note importante ici : les conteneurs faisant partie du même réseau peuvent utiliser leur port interne (ex. : 5000 pour DAB, 3306 pour MySQL)&lt;/li&gt;
&lt;li&gt;Le réseau externe est le &lt;code&gt;proxy&lt;/code&gt; créé précédemment&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuration-du-tunnel-cloudflare"&gt;Configuration du tunnel Cloudflare&lt;/h2&gt;
&lt;p&gt;Dans votre tableau de bord Cloudflare, vous devrez configurer le tunnel pour acheminer le trafic vers Traefik. Créez un nom d'hôte public pointant vers &lt;code&gt;http://&amp;lt;ip-locale&amp;gt;:8082&lt;/code&gt;. Utilisez l'adresse IP locale de votre serveur, quelque chose comme "192.168.1.123". Vous pouvez utiliser des caractères génériques comme &lt;code&gt;*.c5m.ca&lt;/code&gt; pour acheminer tous les sous-domaines vers Traefik, qui gérera ensuite le routage selon le nom d'hôte.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;C'est tout ! Une fois que tout est configuré :&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2026/01/cloudflare-traefik.png" alt="diagramme cloudflare traefik homeserver"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Le tunnel Cloudflare crée une connexion sécurisée de votre domicile vers Cloudflare&lt;/li&gt;
&lt;li&gt;Le trafic arrive via Cloudflare et est routé vers Traefik&lt;/li&gt;
&lt;li&gt;Traefik lit le nom d'hôte et route vers le conteneur approprié&lt;/li&gt;
&lt;li&gt;Chaque service peut être accessible via son propre sous-domaine&lt;/li&gt;
&lt;li&gt;Seuls les conteneurs avec les étiquettes Traefik sont accessibles depuis l'extérieur de mon réseau&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C'est une configuration simple qui fonctionne très bien pour les projets personnels. Le meilleur aspect est que vous n'avez pas besoin d'exposer de ports sur votre routeur ou de gérer le DNS dynamique, Cloudflare s'occupe de tout ça.&lt;/p&gt;
&lt;p&gt;La prochaine étape sera d'ajouter de l'authentification et de l'autorisation (ex. : en utilisant Keycloak), mais c'est pour un autre billet. Pour l'instant, cela me donne un moyen d'accéder à mes services hébergés à la maison depuis n'importe où, et j'ai pensé que ça pourrait être utile à partager.&lt;/p&gt;
</content:encoded>
			<comments xmlns="http://purl.org/rss/1.0/modules/slash/">0</comments>
		</item>
		<item>
			<title>D'heures à minutes: Construire une IA qui trouve des événements techno pour vous</title>
			<link>/posts/2026-01-05-event-finder.html</link>
			<description>Parlons du «cloud computing» en français</description>
			<enclosure url="/content/images/Cloudenfrancais-logo3.png" length="0" type="image" />
			<guid isPermaLink="false">/posts/2026-01-05-event-finder.html</guid>
			<pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h1 id="dheures-a-minutes-une-ia-qui-trouve-des-evenements-techno-pour-vous"&gt;D'heures à minutes: une IA qui trouve des événements techno pour vous&lt;/h1&gt;
&lt;h4 id="tldr"&gt;TL;DR&lt;/h4&gt;
&lt;p&gt;J'ai construit un agent de recherche IA qui navigue réellement le web en direct et trouve des événements techno—aucune boucle de recherche, aucune logique de réessai, aucune hallucination. Posez simplement une question et obtenez un JSON structuré avec les étapes de raisonnement incluses. Le secret? Une API qui gère automatiquement la recherche en plusieurs étapes. Construit avec .NET/Blazor en une fin de semaine. &lt;a href="https://www.youtube.com/watch?v=ML-9SrQm2Dk"&gt;Regardez la video&lt;/a&gt; | &lt;a href="https://link.reka.ai/event-finder-dotnet"&gt;Obtenez le code&lt;/a&gt; | &lt;a href="https://link.reka.ai/free"&gt;Clé API gratuite&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bonne année! Je voulais partager quelque chose que j'ai récemment présenté à la conférence AI Agents 2025: comment construire des assistants de recherche intelligents qui peuvent chercher sur le web en direct et retourner des résultats structurés et fiables.&lt;/p&gt;
&lt;p&gt;En revenant des vacances, je suis rappelé d'un problème universel: la surcharge d'informations. Que ce soit pour trouver des conférences techno pertinentes, rattraper les nouvelles de l'industrie, ou parcourir des piles de documentation accumulée pendant le congé, nous avons tous besoin d'outils qui peuvent rapidement rechercher et synthétiser l'information pour nous. C'est ce que fait Reka Research—c'est une IA agentique qui navigue le web (ou vos documents privés), répond à des questions complexes, et transforme des heures de recherche en minutes. J'ai construit une démo pratique pour montrer cela en action: un chercheur d'événements qui recherche sur internet en direct les prochaines conférences techno.&lt;/p&gt;
&lt;p&gt;La présentation complète est disponible sur YouTube si vous voulez suivre: &lt;a href="https://www.youtube.com/watch?v=ML-9SrQm2Dk"&gt;How to Build Agentic Web Research Assistants&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="le-probleme-trouver-des-evenements-nest-pas-quune-simple-recherche"&gt;Le problème: Trouver des événements n'est pas qu'une simple recherche&lt;/h2&gt;
&lt;p&gt;Laissez-moi vous dresser le tableau. Vous voulez trouver des conférences techno sur l'IA dans votre région (ou ailleur). Vous avez besoin d'informations spécifiques: le nom de l'événement, les dates de début et de fin, l'emplacement, et surtout, l'URL d'inscription.&lt;/p&gt;
&lt;p&gt;Une simple recherche web ou requête LLM de base ne suffit pas parce que:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vous pourriez obtenir des informations dépassées&lt;/li&gt;
&lt;li&gt;Le premier résultat de recherche contient rarement tous les détails requis&lt;/li&gt;
&lt;li&gt;Vous devez croiser plusieurs sources&lt;/li&gt;
&lt;li&gt;Sans structure, les données sont difficiles à utiliser dans une application&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est là que l'API Research de Reka brille. Elle ne fait pas que chercher—elle raisonne à travers plusieurs étapes, agrège l'information, et retourne des résultats structurés et fondés.&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2026/01/events_finder.png" alt="Interface du chercheur d'événements"&gt;&lt;/p&gt;
&lt;h2 id="la-solution-une-recherche-en-plusieurs-etapes-qui-fonctionne-reellement"&gt;La solution: Une recherche en plusieurs étapes qui fonctionne réellement&lt;/h2&gt;
&lt;p&gt;L'innovation centrale ici est l'ancrage en plusieurs étapes. Au lieu de faire une seule requête en espérant pour le mieux, l'API Research agit comme un chercheur humain diligent:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Elle fait une recherche initiale basée sur votre requête&lt;/li&gt;
&lt;li&gt;Vérifie quelle information manque&lt;/li&gt;
&lt;li&gt;Effectue des recherches ciblées additionnelles&lt;/li&gt;
&lt;li&gt;Agrège et valide les données&lt;/li&gt;
&lt;li&gt;Retourne une réponse complète et structurée&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En tant que développeur, vous envoyez simplement votre question, et l'API gère l'itération complexe. Pas besoin de construire vos propres boucles de recherche ou logique de réessai.&lt;/p&gt;
&lt;h2 id="comment-ca-fonctionne-lexperience-developpeur"&gt;Comment ça fonctionne: L'expérience développeur&lt;/h2&gt;
&lt;p&gt;Voici ce qui m'a le plus surpris: la simplicité. Vous définissez votre structure de données, posez une question, et l'API gère toute l'orchestration de recherche complexe. Aucune logique de réessai, aucune gestion de boucle de recherche.&lt;/p&gt;
&lt;p&gt;La clé est la sortie structurée. Au lieu d'analyser du texte désordonné, vous dites exactement à l'API quel schéma JSON vous voulez:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;public class TechEvent
{
    public string? Name { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public string? City { get; set; }
    public string? Country { get; set; }
    public string? Url { get; set; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ensuite, vous envoyez votre requête avec le schéma, et elle retourne des données parfaitement structurées à chaque fois. L'API utilise un format compatible OpenAI, donc si vous avez travaillé avec l'API de ChatGPT, ça vous semblera instantanément familier.&lt;/p&gt;
&lt;p&gt;La vraie magie? Vous obtenez aussi les étapes de raisonnement en retour—les recherches web réelles qu'elle a effectuées et comment elle est arrivée à la réponse. Parfait pour déboguer et comprendre le processus de pensée de l'agent.&lt;/p&gt;
&lt;p&gt;Je parcours l'implémentation complète, incluant le filtrage de domaine, la recherche géolocalisée, et la gestion des appels de recherche asynchrones dans la &lt;a href="https://www.youtube.com/watch?v=ML-9SrQm2Dk"&gt;vidéo&lt;/a&gt;. Le &lt;a href="https://link.reka.ai/event-finder-dotnet"&gt;code source complet&lt;/a&gt; est sur GitHub si vous voulez approfondir.&lt;/p&gt;
&lt;h2 id="essayez-le-vous-meme"&gt;Essayez-le vous-même&lt;/h2&gt;
&lt;p&gt;Le &lt;a href="https://link.reka.ai/event-finder-dotnet"&gt;code source complet&lt;/a&gt; est sur GitHub. Clonez-le, obtenez une &lt;a href="https://link.reka.ai/free"&gt;clé API gratuite&lt;/a&gt;, et vous l'aurez en fonction en moins de 5 minutes.&lt;/p&gt;
&lt;p&gt;Je suis curieux de voir ce que vous allez construire avec ceci. Des agents de recherche qui surveillent les nouvelles? Des outils de comparaison de produits? Des synthétiseurs de documentation? L'API fonctionne pour n'importe quelle tâche de recherche web. Si vous construisez quelque chose, identifiez-moi—j'aimerais le voir.&lt;/p&gt;
&lt;p&gt;Bonne année! 🎉&lt;/p&gt;
</content:encoded>
			<comments xmlns="http://purl.org/rss/1.0/modules/slash/">0</comments>
		</item>
		<item>
			<title>Automatiser le clipping vidéo YouTube avec l'IA et n8n</title>
			<link>/posts/2025-12-18-automatiser-le-clipping-video.html</link>
			<description>Parlons du «cloud computing» en français</description>
			<enclosure url="/content/images/Cloudenfrancais-logo3.png" length="0" type="image" />
			<guid isPermaLink="false">/posts/2025-12-18-automatiser-le-clipping-video.html</guid>
			<pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h1 id="automatiser-le-clipping-video-youtube-avec-lia-et-n8n"&gt;Automatiser le clipping vidéo YouTube avec l'IA et n8n&lt;/h1&gt;
&lt;p&gt;Vous êtes créateur de contenu ou fan de shorts vidéo? Vous avez sûrement déjà vécu cette situation : une vidéo sort, vous repérez LE moment parfait à clipper, mais quand vous vous mettez au travail, 50 personnes l'ont déjà fait. La course contre la montre, on connaît tous.&lt;/p&gt;
&lt;p&gt;Annie, une collègue passionnée de clipping, vivait ça quotidiennement. Je me suis donc posé la question: pourquoi ne pas laisser l'IA faire ce boulot dès qu'une vidéo est publiée?&lt;/p&gt;
&lt;p&gt;Spoiler : ça fonctionne. Et je vous montre comment reproduire ce système gratuitement.&lt;/p&gt;
&lt;h2 id="le-concept"&gt;Le concept&lt;/h2&gt;
&lt;p&gt;L'idée est simple : un flow surveille votre chaîne YouTube favorite, détecte les nouvelles vidéos, et génère automatiquement des clips optimisés pour les réseaux sociaux. Sans intervention humaine.&lt;/p&gt;
&lt;p&gt;Le système repose sur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;n8n&lt;/strong&gt; : une plateforme d'automatisation open-source (gratuite)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reka AI&lt;/strong&gt; : leur API Clips qui analyse et découpe les vidéos intelligemment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Votre boîte mail&lt;/strong&gt; : pour recevoir les clips prêts à poster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Trois étapes, zéro effort manuel, 100% gratuit.&lt;/p&gt;
&lt;h2 id="larchitecture-technique"&gt;L'architecture technique&lt;/h2&gt;
&lt;p&gt;Le système se compose de deux workflows n8n complémentaires. Pensez-y comme deux employés qui bossent en tandem.&lt;/p&gt;
&lt;h3 id="premier-workflow-le-detecteur"&gt;Premier workflow : Le détecteur&lt;/h3&gt;
&lt;p&gt;&lt;img src="/content/images/2025/12/flow_create-clip-job.png" alt="n8n workflow creation"&gt;&lt;/p&gt;
&lt;p&gt;Son job? Être à l'affût. Il scrute le flux RSS d'une chaîne YouTube. Nouvelle vidéo détectée? Il déclenche le processus :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extraction de l'URL&lt;/li&gt;
&lt;li&gt;Appel à l'API Reka avec vos instructions personnalisées&lt;/li&gt;
&lt;li&gt;Récupération d'un identifiant de tâche&lt;/li&gt;
&lt;li&gt;Stockage des infos dans une table n8n&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La beauté de cette solution? Tout est paramétrable. Format vertical pour Instagram et TikTok, horizontal pour YouTube Shorts, carré pour d'autres plateformes. Sous-titres activés ou non. Durée du clip modulable de 0 à 30 secondes. Vous contrôlez tout via une simple
Vous pouvez personnaliser la façon dont les clips sont créés. Vous voulez des vidéos verticales pour TikTok? C'est fait. Besoin de sous-titres? Pas de problème. Vous pouvez définir la durée du clip entre 0 et 30 secondes. Tout est dans la configuration JSON.
Exemple de configuration :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-json"&gt;{
  "video_urls": ["{{ $json.link }}"],
  "prompt": "Identifie et extrait les passages les plus percutants de cette vidéo",
  "generation_config": {
    "template": "moments",
    "num_generations": 1,
    "min_duration_seconds": 0,
    "max_duration_seconds": 30
  },
  "rendering_config": {
    "subtitles": true,
    "aspect_ratio": "9:16"
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="second-workflow-le-verificateur"&gt;Second workflow : Le vérificateur&lt;/h3&gt;
&lt;p&gt;&lt;img src="/content/images/2025/12/flow_check-status.png" alt="n8n workflow status"&gt;&lt;/p&gt;
&lt;p&gt;Pendant que l'IA travaille (l'analyse peut prendre de quelques minutes à plus longtemps selon la vidéo), ce workflow vérifie l'avancement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consultation régulière de la base de données pour les tâches en cours&lt;/li&gt;
&lt;li&gt;Interrogation de l'API : "C'est prêt?"&lt;/li&gt;
&lt;li&gt;Envoi d'un email dès qu'un clip est disponible&lt;/li&gt;
&lt;li&gt;Mise à jour du statut pour éviter les vérifications inutiles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personnellement, je lance cette vérification toutes les 20 minutes. Inutile de harceler l'API toutes les 2 minutes—la patience est une vertu, même en automatisation.&lt;/p&gt;
&lt;h2 id="mise-en-place-pas-a-pas"&gt;Mise en place pas à pas&lt;/h2&gt;
&lt;p&gt;La configuration prend moins de 10 minutes. Vraiment. Annie l'a testée en direct lors de notre session d'enregistrement, et tout était opérationnel avant même qu'on finisse nos cafés.&lt;/p&gt;
&lt;h3 id="premiere-etape-preparez-votre-base-de-donnees"&gt;Première étape : Préparez votre base de données&lt;/h3&gt;
&lt;p&gt;Direction n8n, créez une table de données. Petit piège à éviter : n'utilisez pas "videos" comme nom (vous me remercierez plus tard). Optez pour "clip_jobs", "youtube_reels" ou autre chose de descriptif.&lt;/p&gt;
&lt;p&gt;Structure de la table - 4 colonnes (format texte) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;video_title&lt;/code&gt; : titre de la vidéo YouTube&lt;/li&gt;
&lt;li&gt;&lt;code&gt;video_url&lt;/code&gt; : lien direct&lt;/li&gt;
&lt;li&gt;&lt;code&gt;job_id&lt;/code&gt; : identifiant fourni par Reka&lt;/li&gt;
&lt;li&gt;&lt;code&gt;job_status&lt;/code&gt; : état d'avancement queued, processing, completed..&lt;/li&gt;
&lt;li&gt;&lt;code&gt;job_id&lt;/code&gt; - L'ID que Reka nous donne pour suivre le clip&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="deuxieme-etape-import-des-workflows"&gt;Deuxième étape : Import des workflows&lt;/h3&gt;
&lt;p&gt;Récupérez les deux templates JSON sur GitHub, puis importez-les dans n8n. Normal qu'ils affichent des erreurs initialement—ils attendent d'être paramétrés.&lt;/p&gt;
&lt;h3 id="troisieme-etape-parametrage-du-detecteur"&gt;Troisième étape : Paramétrage du détecteur&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Flux RSS&lt;/strong&gt; : Indiquez l'ID de la chaîne YouTube à surveiller (trouvable dans l'URL de n'importe quelle chaîne).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Authentification API&lt;/strong&gt; : Rendez-vous sur &lt;a href="https://link.reka.ai/free"&gt;platform.reka.ai&lt;/a&gt; pour obtenir votre clé gratuite. Collez-la dans le champ Bearer Auth. Nommez-la explicitement pour vous y retrouver.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Instructions pour l'IA&lt;/strong&gt; : Définissez vos critères de clipping. Par défaut, vous obtenez du 9:16 (format vertical) de 30 secondes max avec sous-titres. Mais modifiez selon vos besoins :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rédigez votre propre prompt&lt;/li&gt;
&lt;li&gt;Ajustez la durée minimale et maximale&lt;/li&gt;
&lt;li&gt;Choisissez le format (1:1, 9:16, 16:9...)&lt;/li&gt;
&lt;li&gt;Activez/désactivez les sous-titres&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Connexion base de données&lt;/strong&gt; : Liez ce workflow à votre table créée précédemment.&lt;/p&gt;
&lt;h3 id="quatrieme-etape-parametrage-du-verificateur"&gt;Quatrième étape : Paramétrage du vérificateur&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Déclencheur&lt;/strong&gt; : Testez d'abord manuellement. Une fois validé, programmez des vérifications automatiques (intervalle recommandé : 15-30 minutes).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Authentification&lt;/strong&gt; : Même clé API Reka que précédemment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notification&lt;/strong&gt; : Configurez le nœud email avec votre adresse. Le template par défaut est efficace, mais personnalisez si vous le souhaitez.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Base de données&lt;/strong&gt; : Vérifiez que tous les nœuds référencent bien votre tablesi vous voulez, mais celui par défaut fonctionne très bien.&lt;/p&gt;
&lt;h2 id="demonstration-video"&gt;Démonstration vidéo&lt;/h2&gt;
&lt;p&gt;Toute la procédure est filmée avec Annie qui configure le système en temps réel. Chaque clic, chaque paramètre, même nos petites galères—tout est dedans. C'est brut, c'est authentique, et ça montre que vraiment, n'importe qui peut le faire. La vidéo est en anglais, n'hésitez pas à partager vos questions en commantaires, s'il y a de l'intérêt je ferai une version française.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/6YV6K94m_FA?si=USYShbAkB-upT12I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""&gt;&lt;/iframe&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Cet outil fonctionne à merveille, que vous soyez un passionné de clipping ou un créateur de contenu qui veut générer des clips pour sa propre chaîne. Une fois configuré, ça roule tout seul. Une nouvelle vidéo sort à 3h du matin? Votre clip est déjà en traitement. Vous vous réveillez avec un lien de téléchargement dans votre boîte de réception.&lt;/p&gt;
&lt;p&gt;C'est open source et gratuit. Prenez-le, personnalisez-le, faites-en votre affaire. Et si vous avez des améliorations ou des idées, j'adorerais en entendre parler. Partagez vos mises à jour sur &lt;a href="https://link.reka.ai/n8n-clip"&gt;GitHub&lt;/a&gt; ou rejoignez la conversation sur le &lt;a href="https://link.reka.ai/discord"&gt;Discord de la communauté Reka&lt;/a&gt; .Ou contactez-moi directement, je réponds toujours.&lt;/p&gt;
&lt;h2 id="ressources-et-liens-utiles"&gt;Ressources et liens utiles&lt;/h2&gt;
&lt;p&gt;Pour démarrer immédiatement :&lt;/p&gt;
&lt;p&gt;🔗 &lt;a href="https://link.reka.ai/n8n-clip"&gt;Templates n8n sur GitHub&lt;/a&gt;&lt;br&gt;
🔗 &lt;a href="https://link.reka.ai/free"&gt;Clé API Reka (gratuite)&lt;/a&gt;&lt;/p&gt;
</content:encoded>
			<comments xmlns="http://purl.org/rss/1.0/modules/slash/">0</comments>
		</item>
		<item>
			<title>Pourquoi votre badge de "Code Coverage" .NET affiche "Unknown" dans GitLab (et comment le réparer)</title>
			<link>/posts/2025-07-17-dotnet-code-coverage-on-gitlab.html</link>
			<description>Parlons du «cloud computing» en français</description>
			<enclosure url="/content/images/Cloudenfrancais-logo3.png" length="0" type="image" />
			<guid isPermaLink="false">/posts/2025-07-17-dotnet-code-coverage-on-gitlab.html</guid>
			<pubDate>Thu, 17 Jul 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;Dans un récent &lt;a href="https://www.cloudenfrancais.com/posts/2025-07-07-comment-avoir-un-cicd-pour-aspire-sur-gitlab.html"&gt;blog post&lt;/a&gt;, j'ai partagé comment configurer un pipeline CI/CD pour un projet .NET Aspire sur GitLab. Le pipeline inclut des tests unitaires, une analyse de sécurité, et la détection de secrets, et si l'un de ces éléments échoue, le pipeline échouerait. Super, mais qu'en est-il de la couverture de code (Code Coverage) pour les tests unitaires ? Le pipeline incluait des commandes de couverture de code, mais la couverture n'était pas visible dans l'interface GitLab. Réglons ça.&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2025/07/coverage-unknown.png" alt="Badge sur GitLab montrant couverture inconnue"&gt;&lt;/p&gt;
&lt;h2 id="le-probleme"&gt;Le problème&lt;/h2&gt;
&lt;p&gt;Une chose que j'ai d'abord pensé c'est que le regex utilisé pour extraire la couverture était incorrect. Le regex utilisé dans le pipeline était:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;coverage: '/Total\s*\|\s*(\d+(?:\.\d+)?)%/'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce regex venait directement de la &lt;a href="https://docs.gitlab.com/ci/testing/code_coverage/#coverage-regex-patterns"&gt;documentation GitLab&lt;/a&gt;, alors je pensais qu'il devrait fonctionner correctement. Cependant, la couverture n'était toujours pas visible dans l'interface GitLab.&lt;/p&gt;
&lt;p&gt;Alors avec l'aide de GitHub Copilot, j'ai écrit quelques commandes pour valider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Que le &lt;code&gt;coverage.cobertura.xml&lt;/code&gt; était dans un emplacement cohérent (au lieu d'être dans un dossier avec un nom GUID)&lt;/li&gt;
&lt;li&gt;Que le fichier &lt;code&gt;coverage.cobertura.xml&lt;/code&gt; était dans un format valide&lt;/li&gt;
&lt;li&gt;Ce que le regex cherchait exactement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tout était correct, alors pourquoi la couverture n'était-elle pas visible?&lt;/p&gt;
&lt;h2 id="la-solution"&gt;La solution&lt;/h2&gt;
&lt;p&gt;Il s'avère que la commande &lt;code&gt;coverage&lt;/code&gt; avec l'expression regex scanne le output console et non le fichier &lt;code&gt;coverage.cobertura.xml&lt;/code&gt;. Aha ! Une solution était d'installer d'autre &lt;code&gt;dotnet-tools&lt;/code&gt; pour changer où les résultats de test étaient persistés; vers la console au lieu du fichier XML, mais j'ai préféré garder l'environnement .NET inchangé.&lt;/p&gt;
&lt;p&gt;La solution que j'ai fini par implémenter était d'exécuter une commande &lt;code&gt;grep&lt;/code&gt; pour extraire la couverture du fichier &lt;code&gt;coverage.cobertura.xml&lt;/code&gt; et ensuite l'afficher dans la console. Voici à quoi ça ressemble:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;- COVERAGE=$(grep -o 'line-rate="[0-9.]*"' TestResults/coverage.cobertura.xml | head -1 | grep -o '[0-9.]*' | awk '{printf "%.1f", $1*100}')
- echo "Total | ${COVERAGE}%"
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="resultats"&gt;Résultats&lt;/h2&gt;
&lt;p&gt;Et maintenant quand le pipeline s'exécute, la couverture est visible dans le pipeline GitLab!&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2025/07/coverage-pipeline.png" alt="Couverture visible dans le pipeline GitLab"&gt;&lt;/p&gt;
&lt;p&gt;Et le badge est mis à jour pour afficher le pourcentage de couverture.&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2025/07/coverage-works.png" alt="Badge de couverture montrant le pourcentage"&gt;&lt;/p&gt;
&lt;h2 id="configuration-complete"&gt;Configuration complète&lt;/h2&gt;
&lt;p&gt;Voici la configuration complète du job de test. Bien sûr, le fichier &lt;a href="https://gitlab.com/cloud5mins/aspire-template"&gt;.gitlab-ci.yml&lt;/a&gt; complet est disponible dans le dépôt GitLab.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;test:
  stage: test
  image: mcr.microsoft.com/dotnet/sdk:9.0
  &amp;lt;&amp;lt;: *dotnet_cache
  dependencies:
    - build
  script:
    - dotnet test $SOLUTION_FILE --configuration Release --logger "junit;LogFilePath=$CI_PROJECT_DIR/TestResults/test-results.xml" --logger "console;verbosity=detailed" --collect:"XPlat Code Coverage" --results-directory $CI_PROJECT_DIR/TestResults
    - find TestResults -name "coverage.cobertura.xml" -exec cp {} TestResults/coverage.cobertura.xml \;
    - COVERAGE=$(grep -o 'line-rate="[0-9.]*"' TestResults/coverage.cobertura.xml | head -1 | grep -o '[0-9.]*' | awk '{printf "%.1f", $1*100}')
    - echo "Total | ${COVERAGE}%"
  artifacts:
    when: always
    reports:
      junit: "TestResults/test-results.xml"
      coverage_report:
        coverage_format: cobertura
        path: "TestResults/coverage.cobertura.xml"
    paths:
      - TestResults/
    expire_in: 1 week
  coverage: '/Total\s*\|\s*(\d+(?:\.\d+)?)%/'
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;J'espère que ce post aidera d'autres personnes à sauver du temps lors de la configuration de la couverture de code pour leurs projets .NET sur GitLab. L'idée clé c'est que le regex de couverture de GitLab fonctionne sur la sortie console, pas sur les fichiers (XML ou autres formats).&lt;/p&gt;
&lt;p&gt;Si vous avez des questions ou des suggestions, n'hésitez pas à me contacter !&lt;/p&gt;
</content:encoded>
			<comments xmlns="http://purl.org/rss/1.0/modules/slash/">0</comments>
		</item>
		<item>
			<title>Comment avoir un CI/CD GitLab pour un projet .NET Aspire</title>
			<link>/posts/2025-07-07-comment-avoir-un-cicd-pour-aspire-sur-gitlab.html</link>
			<description>Parlons du «cloud computing» en français</description>
			<enclosure url="/content/images/2025/07/aspire_template.png" length="0" type="image" />
			<guid isPermaLink="false">/posts/2025-07-07-comment-avoir-un-cicd-pour-aspire-sur-gitlab.html</guid>
			<pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;Obtenir un pipeline CI/CD complet pour votre solution .NET Aspire n'a pas besoin d'être compliqué. J'ai créé un template qui vous donne tout ce dont vous avez besoin pour commencer en quelques minutes.&lt;/p&gt;
&lt;h2 id="partie-1-le-template-pret-a-utiliser"&gt;Partie 1 : Le template prêt à utiliser&lt;/h2&gt;
&lt;p&gt;J'ai créé un template .NET Aspire qui vient avec tout configuré et prêt à utiliser. Voici ce que vous obtenez :&lt;/p&gt;
&lt;h3 id="ce-qui-est-inclus"&gt;Ce qui est inclus&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Un projet .NET Aspire Starter classique (API et frontend)&lt;/li&gt;
&lt;li&gt;Tests unitaires utilisant xUnit (facilement adaptable à d'autres frameworks de test)&lt;/li&gt;
&lt;li&gt;Configuration complète du pipeline &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Analyse de sécurité et détection de secrets&lt;/li&gt;
&lt;li&gt;Toute la documentation dont vous avez besoin&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ce-que-fait-le-pipeline"&gt;Ce que fait le pipeline&lt;/h3&gt;
&lt;p&gt;Le pipeline exécute deux jobs principaux automatiquement :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Build&lt;/strong&gt; : Compile votre code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test&lt;/strong&gt; : Exécute tous les tests unitaires, analyse les vulnérabilités, et vérifie les secrets accidentellement committés (clés API, mots de passe, etc.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Vous pouvez voir tous les résultats de tests directement dans l'interface de GitLab, ce qui facilite le suivi de la santé de votre projet.&lt;/p&gt;
&lt;h3 id="comment-commencer"&gt;Comment commencer&lt;/h3&gt;
&lt;p&gt;C'est simple :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clonez le repository template : &lt;a href="https://gitlab.com/cloud5mins/aspire-template"&gt;cloud5mins/aspire-template&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Remplacez le projet exemple avec votre propre code .NET Aspire&lt;/li&gt;
&lt;li&gt;Poussez vers votre repository GitLab&lt;/li&gt;
&lt;li&gt;Regardez votre pipeline CI/CD s'exécuter automatiquement&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C'est tout ! Vous obtenez immédiatement des builds automatisés, des tests, et de l'analyse de sécurité.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Conseil de pro&lt;/strong&gt; : Le meilleur moment pour configurer le CI/CD c'est quand vous commencez tout juste votre projet parce que tout est encore simple.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="partie-2-construire-le-template-avec-gitlab-duo"&gt;Partie 2 : Construire le template avec GitLab Duo&lt;/h2&gt;
&lt;p&gt;Maintenant laissez-moi partager mon expérience de création de ce template en utilisant l'assistant IA de GitLab, &lt;a href="https://about.gitlab.com/gitlab-duo/"&gt;GitLab Duo&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="commencer-simple-grandir-intelligemment"&gt;Commencer simple, grandir intelligemment&lt;/h3&gt;
&lt;p&gt;Je n'ai pas construit ce pipeline complexe d'un coup. J'ai commencé avec quelque chose de très basique et j'ai utilisé GitLab Duo pour graduellement ajouter des fonctionnalités. L'IA m'a aidé à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter la détection de secrets quand j'ai demandé : "Comment puis-je analyser les secrets accidentellement committés ?"&lt;/li&gt;
&lt;li&gt;Corriger les problèmes d'exécution de tests quand mes tests unitaires ne roulaient pas correctement&lt;/li&gt;
&lt;li&gt;Optimiser la structure du pipeline pour une meilleure performance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="/content/images/2025/07/duo_sast.png" alt="capture d'écran dans VSCode utilisant GitLab Duo pour changer l'emplacement par défaut du job SAST"&gt;&lt;/p&gt;
&lt;h3 id="travailler-avec-gitlab-dans-vs-code"&gt;Travailler avec GitLab dans VS Code&lt;/h3&gt;
&lt;p&gt;Bien que vous puissiez éditer les fichiers &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; directement dans l'interface web de GitLab, je préfère VS Code. Voici ma configuration :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Installez l'extension officielle &lt;strong&gt;GitLab&lt;/strong&gt; du marketplace VS Code&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Une fois connecté, cette extension vous donne :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accès direct aux issues GitLab et items de travail&lt;/li&gt;
&lt;li&gt;Chat alimenté par l'IA avec GitLab Duo&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="gitlab-duo-en-action"&gt;GitLab Duo en action&lt;/h3&gt;
&lt;p&gt;GitLab Duo est devenu mon partenaire de programmation en paire. Voici comment je l'ai utilisé :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comprendre le code&lt;/strong&gt; : Je pouvais taper &lt;code&gt;/explain&lt;/code&gt; et demander à Duo d'expliquer ce que n'importe quelle partie de ma configuration de pipeline fait en surlignant cette section.&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2025/07/duo_explain.png" alt="capture d'écran dans VSCode utilisant GitLab Duo pour expliquer une partie du code"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Résoudre des problèmes&lt;/strong&gt; : Quand la solution ne compilait pas, j'ai décrit le problème à Duo et j'ai obtenu des suggestions spécifiques. Par exemple, ça m'a aidé à réaliser que certains projets n'étaient pas en .NET 9 parce que dotnet build nécessitait la charge de travail Aspire. Je pouvais soit garder mon projet en .NET 8 et ajouter une instruction before_script pour installer la charge de travail, soit faire la mise à niveau vers .NET 9; j'ai choisi la dernière option.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ajouter des fonctionnalités&lt;/strong&gt; : J'ai commencé avec juste build et test, puis j'ai demandé de façon incrémentale à Duo de m'aider à ajouter l'analyse de sécurité, la détection de secrets, et une meilleure gestion d'erreurs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ajouter du contexte&lt;/strong&gt; : Utiliser &lt;code&gt;/include&lt;/code&gt; pour ajouter le fichier projet ou le fichier &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; en posant des questions a aidé Duo à mieux comprendre le contexte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apprendre plus avec la doc&lt;/strong&gt; : Durant mon parcours, je savais que Duo n'inventait pas des affaires puisqu'il référençait la documentation. Je pouvais continuer mon apprentissage là-bas et lire plus d'exemples de comment &lt;code&gt;before_script&lt;/code&gt; est utilisé dans différents contextes.&lt;/p&gt;
&lt;h3 id="lexperience-de-developpement-assistee-par-ia"&gt;L'expérience de développement assistée par IA&lt;/h3&gt;
&lt;p&gt;Ce qui m'a le plus impressionné c'est comment GitLab Duo m'a aidé à apprendre en construisant. Au lieu de juste copier des configurations de la documentation, chaque conversation m'a appris quelque chose de nouveau sur les meilleures pratiques GitLab CI/CD.&lt;/p&gt;
&lt;h2 id="regardez-la-video-en-anglais"&gt;Regardez la vidéo (en anglais)&lt;/h2&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/COWLi_OxOh4?si=29I5wD_FoQ4e2MCy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""&gt;&lt;/iframe&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Je pense que ce template peut être utile pour quiconque commence un projet .NET Aspire. Prêt à l'essayer ? Clonez le template à &lt;a href="https://gitlab.com/cloud5mins/aspire-template"&gt;cloud5mins/aspire-template&lt;/a&gt; et commencez à construire en toute confiance.&lt;/p&gt;
&lt;p&gt;Que vous soyez nouveau à .NET Aspire ou au CI/CD, ce template vous donne une bonne fondation. Et si vous voulez le personnaliser davantage, GitLab Duo est là pour vous aider à comprendre et modifier la configuration.&lt;/p&gt;
&lt;p&gt;Si vous pensez qu'on devrait ajouter plus de fonctionnalités ou améliorer le template, n'hésitez pas à ouvrir une issue dans le repository. Vos commentaires sont toujours les bienvenus !&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2025/07/aspire_template.png" alt="Capture d'écran du projet template Aspire sur GitLab"&gt;&lt;/p&gt;
&lt;p&gt;Merci à &lt;a href="https://bsky.app/profile/davidfowl.com/post/3ltiwbulr222r"&gt;David Fowler&lt;/a&gt; pour son feedback!&lt;/p&gt;
</content:encoded>
			<comments xmlns="http://purl.org/rss/1.0/modules/slash/">0</comments>
		</item>
		<item>
			<title>Comment convertir du code avec GitHub Copilot, l'IA peut-elle vraiment aider ?</title>
			<link>/posts/2025-07-01-convert-code-with-github-copilot-fr.html</link>
			<description>Parlons du «cloud computing» en français</description>
			<enclosure url="/content/images/Cloudenfrancais-logo3.png" length="0" type="image" />
			<guid isPermaLink="false">/posts/2025-07-01-convert-code-with-github-copilot-fr.html</guid>
			<pubDate>Tue, 01 Jul 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;Récemment, quelqu'un m'a posé une question intéressante: &amp;quot;GitHub Copilot ou l'IA peuvent-ils m'aider à convertir une application d'un langage à un autre ?&amp;quot; Ma réponse était un oui catégorique! L'IA peut non seulement aider à écrire du code dans un nouveau langage, mais elle peut aussi améliorer la collaboration en équipe et combler le manque d'expérience des développeurs qui connaissent différents langages de programmation.&lt;/p&gt;
&lt;h2 id="configuration-de-lenvironnement"&gt;Configuration de l'environnement&lt;/h2&gt;
&lt;p&gt;Pour démontrer cette capacité, j'ai décidé de convertir une application COBOL en Java. Un cas de test parfait puisque je ne connais bien aucun de ces deux langages, ce qui signifie que j'avais vraiment besoin de GitHub Copilot pour faire le gros du travail. Tout le code est disponible sur &lt;a href="https://github.com/FBoucher/hello_business/tree/demo"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La première étape était de configurer un environnement de développement approprié. J'ai utilisé un &lt;a href="https://github.com/FBoucher/hello_business/tree/demo/.devcontainer"&gt;dev container&lt;/a&gt; et j'ai demandé à Copilot de m'aider à le construire. J'ai aussi demandé des recommandations sur les &lt;a href="https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack"&gt;meilleures extensions VS Code pour le développement Java&lt;/a&gt;. En quelques minutes seulement, j'avais un environnement entièrement configuré et prêt pour le développement Java.&lt;/p&gt;
&lt;h2 id="choisir-le-bon-agent-copilot"&gt;Choisir le bon agent Copilot&lt;/h2&gt;
&lt;p&gt;Lorsque vous travaillez avec GitHub Copilot pour la conversion de code, vous avez différents mode parmi lesquels choisir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ask&lt;/strong&gt; : Excellent pour les questions générales (comme demander des extensions Java)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edit&lt;/strong&gt; : Parfait pour l'édition simple de documents (comme modifier le code généré)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent&lt;/strong&gt; : Le plus puissant pour les tâches complexes impliquant plusieurs fichiers, imports et changements structurels&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour les projets de conversion de code, l'Agent est votre meilleur ami. Il peut examiner différents fichiers sources, comprendre la structure du projet, éditer le code et même créer de nouveaux fichiers pour vous.&lt;/p&gt;
&lt;h2 id="le-processus-de-conversion"&gt;Le processus de conversion&lt;/h2&gt;
&lt;p&gt;J'ai utilisé Claude 3.5 Sonnet pour cette conversion. Voici la simple instruction que j'ai utilisée :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Convertis cette application COBOL hello business en Java&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Copilot n'a pas seulement converti le code, il a aussi fourni des informations détaillées sur comment exécuter l'application Java, ce qui était inestimable puisque je n'avais aucune expérience en Java.&lt;/p&gt;
&lt;p&gt;Les résultats variaient selon le modèle d'IA utilisé (Claude, GPT, Gemini, etc.), mais la fonctionnalité de base restait cohérente à travers différentes tentatives. Comme l'application originale était simple, je l'ai convertie plusieurs fois en utilisant différentes instructions et modèles pour tester la cohérence. Parfois, il générait un seul fichier, d'autres fois il créait plusieurs fichiers : une application principale et une classe Employee (qui n'était pas dans ma version COBOL originale). Parfois, il mettait à jour le &lt;code&gt;Makefile&lt;/code&gt; pour permettre la compilation et l'exécution en utilisant &lt;code&gt;make&lt;/code&gt;, tandis que d'autres fois il fournissait des instructions pour utiliser directement les commandes &lt;code&gt;javac&lt;/code&gt; et &lt;code&gt;java&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cette variabilité est attendue avec l'IA générative—les résultats diffèrent entre les exécutions, mais la fonctionnalité de base reste fiable.&lt;/p&gt;
&lt;h2 id="defis-du-monde-reel"&gt;Défis du monde réel&lt;/h2&gt;
&lt;p&gt;Bien sûr, la conversion n'était pas parfaite du premier coup. Par exemple, j'ai rencontré des erreurs d'exécution lors du lancement de l'application. Le problème était avec le format des données—le fichier original utilisait un format de fichier plat avec des enregistrements de longueur fixe (19 caractères par enregistrement) et sans saut de ligne.&lt;/p&gt;
&lt;p&gt;Je suis retourné vers Copilot, j'ai mis en évidence le message d'erreur du terminal, et j'ai fourni un contexte supplémentaire sur le format d'enregistrement de 19 caractères. Cette approche itérative est la clé du succès de la conversion assistée par IA.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Ça ne fonctionne pas comme prévu, vérifie l'erreur dans #terminalSelection. Les enregistrements ont une longueur fixe de 19 caractères sans saut de ligne. Ajuste le code pour gérer ce format&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="les-resultats"&gt;Les résultats&lt;/h2&gt;
&lt;p&gt;Après les améliorations itératives, mon application Java a réussi à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compiler sans erreurs&lt;/li&gt;
&lt;li&gt;Traiter tous les enregistrements d'employés&lt;/li&gt;
&lt;li&gt;Générer un rapport avec les données des employés&lt;/li&gt;
&lt;li&gt;Calculer le salaire total (un ajout sympa qui n'était pas dans l'original)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bien que le format de sortie ne soit pas identique à la version COBOL originale (zéros de tête manquants, espacement de ligne différent), la fonctionnalité de base était préservée.&lt;/p&gt;
&lt;h2 id="demonstration-video"&gt;Démonstration vidéo&lt;/h2&gt;
&lt;p&gt;Regardez le processus de conversion complet en action (vidéo en anglais) :&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/i5RdOPA-waQ?si=wjyvYF_HQ44MMIz3" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id="meilleures-pratiques-pour-la-conversion-de-code-assistee-par-ia"&gt;Meilleures pratiques pour la conversion de code assistée par IA&lt;/h2&gt;
&lt;p&gt;Basé sur cette expérience, voici mes recommandations :&lt;/p&gt;
&lt;h3 id="commencer-par-de-petits-morceaux"&gt;1. Commencer par de petits morceaux&lt;/h3&gt;
&lt;p&gt;N'essayez pas de convertir des milliers de lignes d'un coup. Divisez votre conversion en modules ou fonctions gérables.&lt;/p&gt;
&lt;h3 id="etablir-des-standards-de-projet"&gt;2. Établir des standards de projet&lt;/h3&gt;
&lt;p&gt;Considérez créer un dossier &lt;code&gt;.github&lt;/code&gt; à la racine de votre projet avec un fichier &lt;code&gt;instructions.md&lt;/code&gt; contenant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les meilleures pratiques pour votre langage cible&lt;/li&gt;
&lt;li&gt;Les modèles et outils à utiliser&lt;/li&gt;
&lt;li&gt;Les versions et frameworks spécifiques&lt;/li&gt;
&lt;li&gt;Les standards d'entreprise à suivre&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rester-implique-dans-le-processus"&gt;3. Rester impliqué dans le processus&lt;/h3&gt;
&lt;p&gt;Vous n'êtes pas seulement un spectateur - vous êtes un participant actif. Révisez les changements, testez la sortie, et fournissez des commentaires quand les choses ne fonctionnent pas comme prévu.&lt;/p&gt;
&lt;h3 id="iterer-et-ameliorer"&gt;4. Itérer et améliorer&lt;/h3&gt;
&lt;p&gt;N'attendez pas la perfection du premier coup. Dans mon cas, l'application convertie fonctionnait mais produisait un formatage de sortie légèrement différent. C'est normal et attendu, après tout vous convertissez entre deux langages différents avec des conventions et styles différents.&lt;/p&gt;
&lt;h2 id="lia-peut-elle-vraiment-aider-avec-la-conversion-de-code"&gt;L'IA peut-elle vraiment aider avec la conversion de code ?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Absolument, oui !&lt;/strong&gt; GitHub Copilot peut significativement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accélérer le processus de conversion&lt;/li&gt;
&lt;li&gt;Aider avec la syntaxe et les modèles spécifiques au langage&lt;/li&gt;
&lt;li&gt;Fournir des conseils sur l'exécution et la compilation du langage cible&lt;/li&gt;
&lt;li&gt;Combler les lacunes de connaissances entre les membres de l'équipe&lt;/li&gt;
&lt;li&gt;Générer des fichiers de support et de la documentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cependant, rappelez-vous que c'est de l'IA générative, les résultats varieront entre les exécutions, et vous ne devriez pas vous attendre à une sortie identique à chaque fois.&lt;/p&gt;
&lt;h2 id="reflexions-finales"&gt;Réflexions finales&lt;/h2&gt;
&lt;p&gt;GitHub Copilot est définitivement un outil dont vous avez besoin dans votre boîte à outils pour les projets de conversion. Il ne remplacera pas le besoin de supervision humaine et de tests, mais il accélérera dramatiquement le processus et aidera les équipes à collaborer plus efficacement à travers différents langages de programmation.&lt;/p&gt;
&lt;p&gt;La clé est d'aborder cela comme un processus collaboratif où l'IA fait le gros du travail pendant que vous fournissez des conseils, du contexte et l'assurance qualité. Commencez petit, itérez souvent, et n'ayez pas peur de demander des clarifications ou des corrections quand la sortie n'est pas tout à fait correcte.&lt;/p&gt;
&lt;p&gt;Avez-vous essayé d'utiliser l'IA pour la conversion de code ? J'aimerais entendre parler de vos expériences dans les commentaires ci-dessous !&lt;/p&gt;
&lt;h4 id="references"&gt;Références&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.visualstudio.com/docs/devcontainers/tutorial"&gt;Tutoriel Dev Containers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/copilot/how-tos/custom-instructions/adding-repository-custom-instructions-for-github-copilot"&gt;Ajouter des instructions personnalisées de dépôt pour GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
			<comments xmlns="http://purl.org/rss/1.0/modules/slash/">0</comments>
		</item>
		<item>
			<title>Arrêtez d'écrire des commits Git : Comment GitKraken CLI avec IA accélère votre développement</title>
			<link>/posts/2025-06-11-arretez-ecrire-des-commits-git.html</link>
			<description>Parlons du «cloud computing» en français</description>
			<enclosure url="/content/images/Cloudenfrancais-logo3.png" length="0" type="image" />
			<guid isPermaLink="false">/posts/2025-06-11-arretez-ecrire-des-commits-git.html</guid>
			<pubDate>Wed, 11 Jun 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;En tant que développeurs, nous cherchons constamment des outils qui peuvent nous aider à rester dans le flux et à être plus productifs. Aujourd'hui, je veux partager un outil puissant qui gagne en popularité dans la communauté des développeurs: &lt;strong&gt;GitKraken CLI&lt;/strong&gt;. Cette interface en ligne de commande rassemble plusieurs fonctionnalités clés que les développeurs modernes adorent - elle est alimentée par l'IA, basée sur le terminal, et incroyablement efficace pour gérer les flux de travail Git.&lt;/p&gt;
&lt;h2 id="ce-qui-rend-gitkraken-cli-special"&gt;Ce qui rend GitKraken CLI spécial&lt;/h2&gt;
&lt;p&gt;GitKraken CLI (accessible via la commande &lt;code&gt;gk&lt;/code&gt;) se démarque parce qu'elle simplifie les flux de travail Git complexes tout en ajoutant une automatisation intelligente. Contrairement aux commandes Git traditionnelles, elle fournit un système de gestion de flux de travail plus intuitif qui peut gérer plusieurs dépôts simultanément.&lt;/p&gt;
&lt;h2 id="pour-commencer"&gt;Pour commencer&lt;/h2&gt;
&lt;p&gt;L'installation est simple. Sur Windows, vous pouvez l'installer en utilisant :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-powershell"&gt;winget install gitkraken.cli
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Une fois installé, vous aurez accès à la commande &lt;code&gt;gk&lt;/code&gt;, qui devient votre passerelle vers des opérations Git rationalisées.&lt;/p&gt;
&lt;h2 id="le-flux-de-travail-en-action"&gt;Le flux de travail en action&lt;/h2&gt;
&lt;p&gt;Passons en revue une session de développement typique en utilisant GitKraken CLI :&lt;/p&gt;
&lt;h3 id="demarrer-une-session-de-travail"&gt;1. Démarrer une session de travail&lt;/h3&gt;
&lt;p&gt;Au lieu de créer manuellement des branches et de changer de contexte, vous pouvez démarrer une session de travail focalisée :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gk w start "Add Behind my Cloud feed" -i "Add Behind my Cloud feed #1"
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette commande unique :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crée une nouvelle branche basée sur le nom de votre problème/fonctionnalité&lt;/li&gt;
&lt;li&gt;Bascule vers cette branche automatiquement&lt;/li&gt;
&lt;li&gt;Lie la session de travail à un problème spécifique&lt;/li&gt;
&lt;li&gt;Configure votre environnement de développement pour un travail focalisé&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="gerer-plusieurs-sessions-de-travail"&gt;2. Gérer plusieurs sessions de travail&lt;/h3&gt;
&lt;p&gt;Vous pouvez facilement voir toutes vos sessions de travail actives :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gk w list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C'est particulièrement puissant quand vous travaillez sur plusieurs dépôts ou jonglez avec plusieurs fonctionnalités simultanément.&lt;/p&gt;
&lt;h3 id="faire-des-commits-avec-intelligence"&gt;3. Faire des commits avec intelligence&lt;/h3&gt;
&lt;p&gt;Après avoir fait vos modifications, ajouter des fichiers fonctionne comme prévu :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gk add .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mais c'est ici que la magie de l'IA opère. Au lieu d'écrire des messages de commit manuellement :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gk w commit --ai
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;L'IA analyse vos modifications et génère automatiquement des messages de commit significatifs et descriptifs. Fini les commits "quick fix" ou "update stuff" !&lt;/p&gt;
&lt;h3 id="pousser-et-creer-des-demandes-de-tirage"&gt;4. Pousser et créer des demandes de tirage&lt;/h3&gt;
&lt;p&gt;Publier votre travail est tout aussi rationalisé :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gk w push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et quand vous êtes prêt à créer une demande de tirage :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gk w pr create --ai
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Encore une fois, l'assistance de l'IA aide à générer des titres et descriptions de PR appropriés basés sur votre travail.&lt;/p&gt;
&lt;h3 id="finaliser"&gt;5. Finaliser&lt;/h3&gt;
&lt;p&gt;Une fois votre travail terminé et fusionné, le nettoyage est simple :&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;gk w end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette commande :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vous ramène sur la branche principale&lt;/li&gt;
&lt;li&gt;Supprime la branche de fonctionnalité, localement et sur GitHub&lt;/li&gt;
&lt;li&gt;Ferme la session de travail&lt;/li&gt;
&lt;li&gt;Laisse votre dépôt propre et prêt pour la prochaine tâche&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="/content/images/2025/06/gk-commands.png" alt="list des commands gk"&gt;&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important"&gt;Pourquoi c'est important&lt;/h2&gt;
&lt;p&gt;La beauté de GitKraken CLI réside dans sa capacité à vous garder dans la zone. Vous n'avez pas besoin de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Basculer entre plusieurs outils&lt;/li&gt;
&lt;li&gt;Mémoriser des commandes Git complexes&lt;/li&gt;
&lt;li&gt;Écrire des messages de commit à partir de zéro&lt;/li&gt;
&lt;li&gt;Gérer manuellement le cycle de vie des branches&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tout s'enchaîne naturellement d'une commande à l'autre, maintenant votre focus sur ce qui compte le plus : écrire du code.&lt;/p&gt;
&lt;h2 id="puissance-multi-depots"&gt;Puissance multi-dépôts&lt;/h2&gt;
&lt;p&gt;Une des fonctionnalités remarquables est la capacité de GitKraken CLI à gérer plusieurs dépôts simultanément. C'est inestimable pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les architectures de microservices&lt;/li&gt;
&lt;li&gt;Les applications full-stack avec des dépôts frontend/backend séparés&lt;/li&gt;
&lt;li&gt;Les organisations avec plusieurs projets liés&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="essayez-le-vous-meme"&gt;Essayez-le vous-même&lt;/h2&gt;
&lt;p&gt;GitKraken CLI fait partie d'une suite plus large d'outils de développement que GitKraken offre. La CLI elle-même est gratuite à utiliser, ce qui facilite l'expérimentation et l'intégration dans votre flux de travail sans engagement initial. Si vous trouvez de la valeur dans la CLI et voulez explorer leurs autres outils, GitKraken a divers produits qui pourraient compléter votre configuration de développement.&lt;/p&gt;
&lt;p&gt;La courbe d'apprentissage est vraiment minimale puisqu'elle s'appuie sur les concepts Git que vous connaissez déjà tout en ajoutant une automatisation utile. J'ai trouvé que même de petites améliorations de flux de travail peuvent s'accumuler avec le temps, surtout quand vous travaillez sur plusieurs projets ou faites face à des changements de contexte fréquents.&lt;/p&gt;
&lt;p&gt;Si vous êtes curieux de ce que GitKraken offre au-delà de la CLI, vous pouvez &lt;a href="https://c5m.ca/gitkraken"&gt;explorer leur gamme complète de produits ici&lt;/a&gt;. Pour ceux qui décident que les fonctionnalités Pro bénéficieraient à leur flux de travail, en tant qu'ambassadeur de GitKraken je peux partager mon code pour fournir &lt;a href="https://c5m.ca/krakenpro"&gt;une réduction de 50%&lt;/a&gt; pour votre abonnement GitKraken Pro.&lt;/p&gt;
&lt;p&gt;La combinaison de l'assistance IA et des commandes intuitives adresse de vrais points de douleur que beaucoup de développeurs affrontent quotidiennement. Que GitKraken CLI devienne une partie centrale de votre boîte à outils dépendra de votre flux de travail spécifique, mais ça vaut la peine d'essayer étant donné que c'est gratuit et ne prend que quelques minutes à configurer.&lt;/p&gt;
&lt;h2 id="version-video"&gt;Version vidéo&lt;/h2&gt;
&lt;p&gt;J'ai également enregistré une vidéo, en anglais, pour illustrer tout cela.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/T0tJGkparig?si=wl0HTUP--78f5g3V" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""&gt;&lt;/iframe&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Les meilleurs outils sont ceux qui s'effacent et vous laissent vous concentrer sur la construction. GitKraken CLI vise à faire exactement cela.&lt;/em&gt;&lt;/p&gt;
</content:encoded>
			<comments xmlns="http://purl.org/rss/1.0/modules/slash/">0</comments>
		</item>
		<item>
			<title>J'ai co-écrit 88 tests unitaires avec l'IA : Le parcours d'un développeur</title>
			<link>/posts/2025-06-04-co-ecrit-tests-unitaires-avec-ai.html</link>
			<description>Parlons du «cloud computing» en français</description>
			<enclosure url="/content/images/Cloudenfrancais-logo3.png" length="0" type="image" />
			<guid isPermaLink="false">/posts/2025-06-04-co-ecrit-tests-unitaires-avec-ai.html</guid>
			<pubDate>Wed, 04 Jun 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h1 id="jai-co-ecrit-88-tests-unitaires-avec-lia-le-parcours-dun-developpeur"&gt;J'ai co-écrit 88 tests unitaires avec l'IA : Le parcours d'un développeur&lt;/h1&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Les tests ont toujours été l'une de ces tâches que les développeurs savent essentielles, mais trouvent souvent ennuyeuses. Quand j'ai décidé d'ajouter des tests unitaires complets à mon projet &lt;a href="https://github.com/FBoucher/NoteBookmark"&gt;NoteBookmark&lt;/a&gt;, je me suis dit : pourquoi ne pas en faire une expérience de développement assisté par IA ? Ce qui a suivi fut un parcours fascinant de 4 heures qui a donné lieu à 88 tests unitaires, un pipeline CI/CD complet, et quelques insights précieux sur le travail avec les assistants de codage IA.&lt;/p&gt;
&lt;h2 id="le-projet-notebookmark"&gt;Le projet : NoteBookmark&lt;/h2&gt;
&lt;p&gt;NoteBookmark est une application .NET construite avec C# qui aide les utilisateurs à gérer et organiser leurs notes de lecture et signets. Le projet inclut une API, un frontend Blazor, et utilise les services Azure pour le stockage. Vous pouvez consulter le projet complet sur &lt;a href="https://github.com/FBoucher/NoteBookmark"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="le-defi-partir-de-zero"&gt;Le défi : Partir de zéro&lt;/h2&gt;
&lt;p&gt;Je vais être honnête - ça faisait un bout que je n'avais pas écrit de tests unitaires complets. Plutôt que de me lancer moi-même, j'ai décidé de voir comment différents modèles d'IA aborderaient cette tâche. Ma demande initiale était délibérément vague : « ajouter un projet de test » sans autres spécifications.&lt;/p&gt;
&lt;p&gt;En rétrospective, je réalise que j'aurais dû être plus spécifique sur quelles parties du code je voulais couvrir. Cela aurait rendu le processus de révision plus facile et m'aurait donné un meilleur contrôle sur la portée. Mais parfois, le meilleur apprentissage vient du fait de laisser l'IA nous surprendre.&lt;/p&gt;
&lt;h2 id="la-grande-comparaison-des-modeles-dia"&gt;La grande comparaison des modèles d'IA&lt;/h2&gt;
&lt;p&gt;&lt;img src="/content/images/2025/06/look-at-ai-model_banned.jpeg" alt="comparaison des modeles d'IA"&gt;&lt;/p&gt;
&lt;h3 id="gpt-4.1-competent-mais-discret"&gt;GPT-4.1 : Compétent mais discret&lt;/h3&gt;
&lt;p&gt;GPT-4.1 a livré des résultats décents, mais l'expérience s'est sentie quelque peu mécanique. Le code qu'il a généré était fonctionnel, mais je me trouvais à vouloir plus de contexte. Les explications étaient minimales, et je devais souvent poser des questions de suivi pour comprendre le raisonnement derrière certaines approches de test.&lt;/p&gt;
&lt;h3 id="gemini-le-faux-depart"&gt;Gemini : Le faux départ&lt;/h3&gt;
&lt;p&gt;Mon expérience avec Gemini était... étrange. Peut-être était-ce un problème technique ou une mauvaise journée, mais la plupart de ce qui a été généré ne fonctionnait tout simplement pas. Je n'ai pas persisté longtemps avec ce modèle, car déboguer du code généré par IA qui ne fonctionne pas fondamentalement va à l'encontre du but de l'exercice. Notez qu'au moment d'écrire ces lignes, Gemini était encore en aperçu, donc je m'attends à ce qu'il s'améliore avec le temps.&lt;/p&gt;
&lt;h3 id="claude-sonnet-le-grand-gagnant"&gt;Claude Sonnet : Le grand gagnant&lt;/h3&gt;
&lt;p&gt;C'est là que la magie s'est produite. Claude Sonnet est devenu mon copilote de choix pour ce projet. Ce qui l'a distingué n'était pas seulement la qualité du code (même si elle était excellente), mais la qualité de la conversation. C'était comme avoir un collègue réfléchi qui pensait à voix haute avec moi.&lt;/p&gt;
&lt;p&gt;Les explications étaient claires et éducatives. Quand Claude suggérait une approche de test particulière, il expliquait pourquoi. Quand il rencontrait un scénario complexe, il détaillait son raisonnement. J'ai essayé différentes versions de Claude Sonnet, mais n'ai pas remarqué de différences significatives dans les résultats - elles étaient toutes systématiquement bonnes.&lt;/p&gt;
&lt;h2 id="le-processus-de-developpement-un-parcours-de-4-heures"&gt;Le processus de développement : Un parcours de 4 heures&lt;/h2&gt;
&lt;h3 id="heures-1-2-arriver-a-la-compilation"&gt;Heures 1-2 : Arriver à la compilation&lt;/h3&gt;
&lt;p&gt;La première itération ne pouvait pas compiler. Ce n'était pas surprenant, étant donné la complexité de la base de code et la demande initiale vague. Mais c'est là que la collaboration IA a vraiment brillé. Au lieu de déboguer tout manuellement moi-même, j'ai travaillé avec Copilot pour identifier et corriger les problèmes de manière itérative.&lt;/p&gt;
&lt;p&gt;Nous avons passé par plusieurs rondes de :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Identifier les erreurs de compilation&lt;/li&gt;
&lt;li&gt;Discuter de la meilleure approche pour les corriger&lt;/li&gt;
&lt;li&gt;Laisser l'IA implémenter les corrections&lt;/li&gt;
&lt;li&gt;Réviser et raffiner&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Après environ 2 heures, nous avions un projet de test avec 88 tests unitaires qui compilait avec succès. L'IA avait choisi xUnit comme framework de test, ce qui me convenait - c'est un choix solide que je n'aurais peut-être pas fait moi-même si j'étais rouillé sur le paysage actuel des tests .NET.&lt;/p&gt;
&lt;h3 id="heures-25-35-faire-passer-les-tests"&gt;Heures 2,5-3,5 : Faire passer les tests&lt;/h3&gt;
&lt;p&gt;Faire compiler les tests était une chose ; les faire passer était un tout autre défi. Cette phase m'a beaucoup appris sur ma base de code et les fonctionnalités xUnit que je ne connaissais pas.&lt;/p&gt;
&lt;p&gt;Je me suis beaucoup appuyé sur la fonctionnalité &lt;code&gt;/explain&lt;/code&gt; durant cette phase. Quand les tests échouaient, je demandais à Claude d'expliquer ce qui se passait et pourquoi. C'était inestimable pour comprendre non seulement la correction immédiate, mais les concepts de test sous-jacents.&lt;/p&gt;
&lt;p&gt;Un de ces moments fut l'apprentissage de &lt;code&gt;[InlineData(true)]&lt;/code&gt; et d'autres attributs de données xUnit. Ce n'étaient pas des fonctionnalités que je connaissais, et les avoir expliquées en contexte les a rendues immédiatement utiles.&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2025/06/inlinedata.png" alt="InlineData in the code"&gt;&lt;/p&gt;
&lt;h3 id="heures-35-4-structure-et-style"&gt;Heures 3,5-4 : Structure et style&lt;/h3&gt;
&lt;p&gt;Une fois que tous les tests passaient, j'ai passé du temps à m'assurer de comprendre chaque test et demander des changements structuraux pour correspondre à mes préférences. Cette phase était cruciale pour prendre possession du code. Ce n'est pas parce que l'IA l'a écrit qu'il devrait rester une boîte noire. Répétons ceci : &lt;strong&gt;Comprendre le code est essentiel ; ce n'est pas parce que l'IA l'a écrit que c'est bon&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="au-dela-des-tests-integration-cicd"&gt;Au-delà des tests : Intégration CI/CD&lt;/h2&gt;
&lt;p&gt;Avec les tests terminés, j'ai demandé à Copilot de créer un workflow GitHub Actions pour exécuter les tests à chaque push vers les branches main et v-next, plus les révisions de PR. Au début, il a commencé à modifier mon workflow existant qui s'occupe du déploiement Azure. Je voulais un workflow séparé pour les tests, alors j'ai interrompu (c'est bien que je n'étais pas « forcé » d'attendre), et lui ai demandé d'en créer un nouveau à la place. Le résultat fut le workflow &lt;code&gt;running-unit-tests.yml&lt;/code&gt; qui a fonctionné parfaitement du premier coup.&lt;/p&gt;
&lt;p&gt;C'était vraiment surprenant. Les configurations CI/CD nécessitent souvent des ajustements, mais le workflow généré gérait :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configuration .NET multi-version&lt;/li&gt;
&lt;li&gt;Restauration des dépendances&lt;/li&gt;
&lt;li&gt;Construction et tests&lt;/li&gt;
&lt;li&gt;Rapport des résultats de test&lt;/li&gt;
&lt;li&gt;Analyse de couverture de code&lt;/li&gt;
&lt;li&gt;Téléchargement d'artefacts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="/content/images/2025/06/code-covrage.png" alt="Code coverage"&gt;&lt;/p&gt;
&lt;h2 id="laventure-damelioration-des-pr"&gt;L'aventure d'amélioration des PR&lt;/h2&gt;
&lt;p&gt;C'est là que les choses sont devenues intéressantes. Quand j'ai demandé à Copilot d'améliorer le workflow pour montrer les résultats de test dans les PR, il a commencé à ajouter des composants, puis s'est arrêté et a demandé s'il pouvait supprimer la version actuelle et repartir de zéro.&lt;/p&gt;
&lt;p&gt;J'ai dit oui, et je suis content de l'avoir fait. La version reconstruite a créé de beaux commentaires de PR montrant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Résumé des résultats de test&lt;/li&gt;
&lt;li&gt;Rapports de couverture de code (que je n'avais pas demandés, mais que j'ai appréciés)&lt;/li&gt;
&lt;li&gt;Ventilations détaillées.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="/content/images/2025/06/test-result-in-pr.png" alt="PR display"&gt;&lt;/p&gt;
&lt;h2 id="les-touches-finales"&gt;Les touches finales&lt;/h2&gt;
&lt;p&gt;Aucun projet n'est complet sans indicateurs de statut appropriés. J'ai ajouté un badge de statut de test au README, donnant à quiconque visite le dépôt une visibilité immédiate sur la santé du projet.&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/images/2025/06/badge.png" alt="test status badge"&gt;&lt;/p&gt;
&lt;h2 id="points-cles-a-retenir"&gt;Points clés à retenir&lt;/h2&gt;
&lt;h3 id="ce-qui-a-bien-fonctionne"&gt;Ce qui a bien fonctionné&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;L'IA comme partenaire d'apprentissage&lt;/strong&gt; : Avoir Copilot qui explique les concepts de test et les fonctionnalités xUnit était comme avoir un professeur patient&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Raffinement itératif&lt;/strong&gt; : le processus d'aller-retour s'est senti naturel et productif&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solutions complètes&lt;/strong&gt; : l'IA n'a pas seulement écrit des tests ; elle a créé une infrastructure de test complète&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qualité plutôt que vitesse&lt;/strong&gt; : bien que cela ait pris 4 heures, le résultat était complet et bien structuré&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="ce-que-je-ferais-differemment"&gt;Ce que je ferais différemment&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Être plus spécifique initialement&lt;/strong&gt; : commencer avec une portée plus claire aurait rationalisé le processus&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Définir les priorités de test&lt;/strong&gt; : identifier d'abord les chemins critiques aurait été précieux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planifier les rapports de test visuels&lt;/strong&gt; : penser à la visualisation des résultats de test dès le début&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="lecons-sur-la-collaboration-ia"&gt;Leçons sur la collaboration IA&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Le choix de modèle compte&lt;/strong&gt; : la différence entre les modèles d'IA était significative&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La qualité de conversation compte&lt;/strong&gt; : des explications claires rendent la collaboration plus précieuse&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faire confiance, mais vérifier&lt;/strong&gt; : comprendre chaque morceau de code généré est crucial&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Embrasser l'itération&lt;/strong&gt; : les meilleurs résultats viennent de multiples cycles de raffinement&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="la-vue-densemble"&gt;La vue d'ensemble&lt;/h2&gt;
&lt;p&gt;Cette expérience a renforcé ma conviction que les assistants de codage IA sont plus puissants quand ils sont de vrais collaborateurs plutôt que des générateurs de code. La valeur n'était pas seulement dans les 88 tests qui ont été écrits, mais dans l'apprentissage qui s'est passé en cours de route.&lt;/p&gt;
&lt;p&gt;Pour les développeurs hésitants sur l'assistance IA dans les tests : il ne s'agit pas de remplacer vos compétences de test, mais de les augmenter. L'IA gère le code standard et suggère des patrons, mais vous apportez la connaissance du domaine et le jugement de qualité.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Est-ce que je referais cela ? Absolument. La combinaison de couverture de test complète, d'opportunités d'apprentissage, et d'efficacité temporelle en a fait une victoire claire. Les 4 heures investies ont créé non seulement des tests, mais une infrastructure de test complète qui rapportera des dividendes tout au long du cycle de vie du projet.&lt;/p&gt;
&lt;p&gt;Si vous considérez les tests assistés par IA pour vos propres projets, mon conseil est simple : commencez la conversation, préparez-vous à itérer, et n'ayez pas peur de demander « pourquoi » à chaque étape. Le but n'est pas seulement du code qui fonctionne - c'est de comprendre et posséder ce code.&lt;/p&gt;
&lt;p&gt;La suite de tests complète et le pipeline CI/CD sont disponibles dans le &lt;a href="https://github.com/FBoucher/NoteBookmark"&gt;dépôt NoteBookmark&lt;/a&gt; si vous voulez voir les résultats de cette collaboration IA en action.&lt;/p&gt;
</content:encoded>
			<comments xmlns="http://purl.org/rss/1.0/modules/slash/">0</comments>
		</item>
	</channel>
</rss>