<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Go on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/go/</link><description>Recent content in Go on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Fri, 22 May 2026 12:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/go/index.xml" rel="self" type="application/rss+xml"/><item><title>Refonte de l'UI de GroROTI</title><link>https://blog.zwindler.fr/2026/05/22/refonte-ui-groroti/</link><pubDate>Fri, 22 May 2026 12:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2026/05/22/refonte-ui-groroti/</guid><description>&lt;img src="https://blog.zwindler.fr/2026/05/roti-avant-apr%C3%A8s.webp" alt="Featured image of post Refonte de l'UI de GroROTI" /&gt;&lt;p&gt;Si vous lisez régulièrement ce blog et mes aventures sur les réseaux sociaux, vous savez que j&amp;rsquo;aime énormément l&amp;rsquo;infrastructure, un peu le code backend (surtout en Golang), mais que dès qu&amp;rsquo;il s&amp;rsquo;agit de concevoir une interface graphique moderne et agréable, il n&amp;rsquo;y a plus personne.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est un fait établi, je n&amp;rsquo;ai aucune compétence en développement front. Dommage pour les offres FullSteak (jeu de mot pourri, mais plutôt approprié ici).&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est exactement ce qui pénalisait GroROTI, un petit outil web open source en Go que j&amp;rsquo;avais développé en 2024 (en partie sur mon temps libre, en partie lorsque j&amp;rsquo;étais chez mon ancien employeur, ce qui explique pourquoi le dépôt soit hébergé sur leur GitHub).&lt;/p&gt;
&lt;p&gt;Pour rappel, l&amp;rsquo;application permet d&amp;rsquo;évaluer rapidement et anonymement la qualité des réunions ou des ateliers via le format ROTI (Return On Time Invested).&lt;/p&gt;
&lt;p&gt;Le problème, c&amp;rsquo;est que l&amp;rsquo;outil était fonctionnel, &lt;strong&gt;mais franchement moche&lt;/strong&gt;. Un petit look Web 1.0, voire soviétique, qui était franchement assumé dans un premier temps, mais dont on se lasse assez vite.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2026/05/vote-avant.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Qu&amp;rsquo;à cela ne tienne. Fort de mes expériences plutôt concluantes avec la refonte de ma page &lt;a class="link" href="https://blog.zwindler.fr/conf%C3%A9rences/" target="_blank" rel="noopener"
&gt;Conférence&lt;/a&gt; (cf &amp;ldquo;&lt;a class="link" href="https://blog.zwindler.fr/2026/03/13/refonte-page-conferences-hugo/" &gt;Refonte de la page Conférences : data-driven avec Hugo&lt;/a&gt;&amp;rdquo;) et la v3 de &lt;a class="link" href="https://zwindler.github.io/101-ways-to-deploy-kubernetes/" target="_blank" rel="noopener"
&gt;mon projet pour cataloguer toutes les manières de déployer Kubernetes&lt;/a&gt; (cf &amp;ldquo;&lt;a class="link" href="https://blog.zwindler.fr/2026/03/29/101-facons-de-deployer-kubernetes-v3/" target="_blank" rel="noopener"
&gt;101 façons de déployer Kubernetes : 125 solutions, des PRs communautaires et une UI qui s&amp;rsquo;améliore&lt;/a&gt;&amp;rdquo;), j&amp;rsquo;ai fait chauffer un LLM perso pour lui demander de m&amp;rsquo;aider à rendre ça un peu plus agréable à l&amp;rsquo;oeil.&lt;/p&gt;
&lt;p&gt;Le résultat va bien au-delà de mes compétences (&amp;ldquo;la barre est au sol&amp;rdquo; comme on dit). Si on compare les captures d&amp;rsquo;écran avant (à gauche) et après (à droite), le changement est flagrant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une page d&amp;rsquo;accueil transformée : Fini l&amp;rsquo;alignement de texte un peu triste. On passe sur une interface épurée, une colorimétrie violette moderne (petit clin d&amp;rsquo;oeil), un bloc de création &amp;ldquo;New ROTI&amp;rdquo; bien délimité et une barre latérale pour afficher les derniers examens créés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2026/05/home-avantapr%c3%a8s.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Des résultats clairs : La page de restitution des votes affiche désormais la moyenne globale en grand, ainsi que le nombre de participants et les valeurs minimales et maximales sous forme de &amp;ldquo;cartes&amp;rdquo;. Le QR code de partage est lui aussi bien mieux intégré visuellement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2026/05/roti-avant-apr%c3%a8s.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un système de notation plus intuitif : Le vieux curseur glissant a été remplacé par un système de notation à 5 étoiles (avec support des demi notes) bien plus classique et parlant pour les utilisateurs. Le tout reste accompagné d&amp;rsquo;une zone de texte (redesignée) pour les retours optionnels, quand ils sont activés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2026/05/vote-avant-apr%c3%a8s.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="juste-un-lifting"&gt;Juste un lifting
&lt;/h2&gt;&lt;p&gt;Sous le capot, l&amp;rsquo;application reste la même, je n&amp;rsquo;ai pas touché au code backend (*), juste la partie templates HTML (gotpl) et CSS.&lt;/p&gt;
&lt;p&gt;(*) &lt;em&gt;c&amp;rsquo;est pas 100% vrai, j&amp;rsquo;ai fait quelques modifs en 2025, notamment pour ajouter du tracing otel, support de la CR ServiceMonitor, amélioration du build multi arch et quelques bugfixes&amp;hellip; dont je ne vous avais pas parlé.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Au final, ce petit truc en plus fait la diff entre un tool interne que je n&amp;rsquo;avais pas trop envie de mettre en avant, et un outil qui me parait utilisable en dehors de mon contexte pro :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/deezer/GroROTI" target="_blank" rel="noopener"
&gt;https://github.com/deezer/GroROTI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Automatiser son site Hugo sans Github Action ou Vercel</title><link>https://blog.zwindler.fr/2023/08/01/automatiser-hugo-sans-github-action/</link><pubDate>Tue, 01 Aug 2023 06:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2023/08/01/automatiser-hugo-sans-github-action/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/11/wordpress-to-hugo.webp" alt="Featured image of post Automatiser son site Hugo sans Github Action ou Vercel" /&gt;&lt;h2 id="contexte"&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Fin 2021, après plus de 10 ans à écrire des articles de blog tech sur Wordpress, je prenais la décision radicale d&amp;rsquo;arrêter de maintenir cette bouse infâme (je mâche mes mots) et de partir sur des articles rédigés en markdown et un site statique avec Hugo.&lt;/p&gt;
&lt;p&gt;Au tout début, je gérais le blog moi-même mais assez vite j&amp;rsquo;en ai eu assez de devoir aller rebuild le blog à chaque modification. J&amp;rsquo;ai rapidement mis un cron qui faisait des &lt;code&gt;git pull&lt;/code&gt; régulièrement, mais on ne va pas se mentir, c&amp;rsquo;est assez crado&amp;hellip;&lt;/p&gt;
&lt;p&gt;Finalement, on m&amp;rsquo;a rapidement pointé que je devrais arrêter de m&amp;rsquo;embêter et utiliser &lt;a class="link" href="https://www.netlify.com/" target="_blank" rel="noopener"
&gt;Netlify&lt;/a&gt; ou &lt;a class="link" href="https://vercel.com/" target="_blank" rel="noopener"
&gt;Vercel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;étais pas super chaud, car ça allait à l&amp;rsquo;encontre de ma volonté d&amp;rsquo;auto héberger mon contenu et de limiter l&amp;rsquo;impact sur la vie privée de mes lecteurs, mais finalement, l&amp;rsquo;expérience utilisateur sur Vercel était tellement bonne que j&amp;rsquo;avais craqué. Je ferai peut-être un article là-dessus d&amp;rsquo;ailleurs, c&amp;rsquo;est la première fois que j&amp;rsquo;ai compris (ressenti) l&amp;rsquo;intérêt d&amp;rsquo;un PaaS.&lt;/p&gt;
&lt;p&gt;Mais aujourd&amp;rsquo;hui, je reviens sur cette décision et j&amp;rsquo;essaye de voir ce qu&amp;rsquo;il est nécessaire de mettre en place pour disposer soi-même d&amp;rsquo;un site hugo qui se refresh tout seul dès qu&amp;rsquo;un commit arrive sur le dépôt git, sans utiliser de plateforme type Vercel ni d&amp;rsquo;outils types Github action+pages.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Je pars du principe que vous avez déjà un site statique généré avec Hugo. Si ce n&amp;rsquo;est pas le cas je vous invite à aller lire mes articles précédents sur le sujet (&lt;a class="link" href="https://blog.zwindler.fr/2019/06/10/comment-migrer-de-wordpress-a-hugo/" &gt;premiers pas&lt;/a&gt;, &lt;a class="link" href="https://blog.zwindler.fr/2019/06/18/mes-stats-de-visites-hugo-sans-google-analytics-avec-matomo/" &gt;stats avec matomo&lt;/a&gt;, &lt;a class="link" href="https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/" &gt;migration wordpress vers hugo&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Vous avez donc un serveur Linux sur lequel vous avez la main pour installer des choses et un dépôt git (sous Github dans mon cas, mais on peut probablement adapter l&amp;rsquo;article pour autre chose).&lt;/p&gt;
&lt;p&gt;Hugo étant d&amp;rsquo;abord un générateur de site statique, je vais utiliser nginx en frontal pour servir les fichiers qu&amp;rsquo;on va générer. Jusqu&amp;rsquo;à il y a peu, l&amp;rsquo;usage du mode &amp;ldquo;server&amp;rdquo; de hugo n&amp;rsquo;était d&amp;rsquo;ailleurs pas conseillé en production (mais ça ne semble plus être le cas, je n&amp;rsquo;ai pas vu de warning dernièrement ?).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install nginx git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="déposer-les-sources-sur-le-serveur"&gt;Déposer les sources sur le serveur
&lt;/h2&gt;&lt;p&gt;Dans mon cas, les sources de mon blog ne sont pas disponibles publiquement (parce que j&amp;rsquo;ai pas envie, c&amp;rsquo;est comme ça ¯\_(ツ)_/¯).&lt;/p&gt;
&lt;p&gt;Il faut donc préalablement se loguer en SSH avec git avant de pouvoir &lt;em&gt;pull&lt;/em&gt; le code. Et comme je n&amp;rsquo;ai pas envie de laisser ma clé privée sur le serveur qui va héberger mon blog, il faut que j&amp;rsquo;utilise une autre clé.&lt;/p&gt;
&lt;p&gt;Dans mon cas, Github, qui héberge le code markdown de mon blog, a une notion de &amp;ldquo;deploy keys&amp;rdquo;, qui servent justement pour ça :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/managing-deploy-keys" target="_blank" rel="noopener"
&gt;docs.github.com/en/authentication/connecting-to-github-with-ssh/managing-deploy-keys&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je vais donc créer une clé sur le serveur qui héberge le blog :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519 -C &lt;span class="s2"&gt;&amp;#34;xxx@xxx.tld&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Generating public/private ed25519 key pair.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter file in which to save the key &lt;span class="o"&gt;(&lt;/span&gt;/home/toto/.ssh/id_ed25519&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et je la copie dans le dossier de &lt;em&gt;www-data&lt;/em&gt; (l&amp;rsquo;utilisateur nginx sous Ubuntu)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; /root/.ssh/id_ed25519
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir /var/www/.ssh/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp ~/.ssh/id_ed25519* /var/www/.ssh/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown www-data: /var/www/.ssh/*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois la clé créée, on doit l&amp;rsquo;ajouter dans Github.com. Je ne lui donne que les droits &amp;ldquo;read only&amp;rdquo; puisque le but c&amp;rsquo;est seulement de récupérer le code et générer le site statique, pas qu&amp;rsquo;on puisse éditer le code (&lt;em&gt;cé pour la sécuritay&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/07/github-deploy-keys2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Je retourne ensuite sur mon serveur et j&amp;rsquo;essaye de télécharger les sources et le thème:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/share/nginx/html
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GIT_SSH_COMMAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ssh -i /var/www/.ssh/id_ed25519 -o IdentitiesOnly=yes&amp;#39;&lt;/span&gt; git clone git@github.com:zwindler/blog.example.org.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; blog.example.org/themes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add -f https://github.com/CaiJimmy/hugo-theme-stack.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown -R www-data: /usr/share/nginx/html/blog.example.org
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="webhook"&gt;Webhook
&lt;/h2&gt;&lt;p&gt;Pour réagir à l&amp;rsquo;arrivée d&amp;rsquo;un nouveau commit sur notre dépôt source, on va utiliser 2 choses :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un projet qui s&amp;rsquo;appelle sobrement &amp;ldquo;Webhook&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;configurer un webhook dans github, qui va envoyer l&amp;rsquo;info que quelque chose est arrivé sur le dépôt (mais on verra ça plus tard)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Revenons à &amp;ldquo;Webhook&amp;rdquo; dans un premier temps :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;webhook is a lightweight configurable tool written in Go, that allows you to easily create HTTP endpoints (hooks) on your server, which you can use to execute configured commands. You can also pass data from the HTTP request (such as headers, payload or query variables) to your commands. webhook also allows you to specify rules which have to be satisfied in order for the hook to be triggered.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On récupère la dernière release et déposer le binaire sur notre serveur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/adnanh/webhook/releases/tag/2.8.1" target="_blank" rel="noopener"
&gt;github.com/adnanh/webhook/releases/tag/2.8.1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2.8.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/adnanh/webhook/releases/download/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/webhook-linux-amd64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xvf webhook*.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv webhook-linux-amd64/webhook /usr/local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf webhook-linux-amd64*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;webhook --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois que c&amp;rsquo;est fait, on va générer une chaîne aléatoire qui va nous servir de &amp;ldquo;secret&amp;rdquo; qui sera partagé entre le binaire &lt;em&gt;webhook&lt;/em&gt; qui tourne sur notre serveur et un &lt;em&gt;webhook&lt;/em&gt; sur Github.com :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;WHSECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;uuidgen &lt;span class="p"&gt;|&lt;/span&gt; base64&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On crée un fichier de configuration &lt;code&gt;hook.json&lt;/code&gt; pour déclarer nos webhooks&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;mkdir&lt;/span&gt; &lt;span class="err"&gt;/etc/webhook&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;cat&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;/etc/webhook/hook.json&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="err"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;redeploy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;execute-command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/usr/share/nginx/html/blog.example.org/blog_refresh.sh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command-working-directory&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/usr/share/nginx/html/blog.example.org&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;trigger-rule&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;match&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;payload-hmac-sha1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;secret&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$WHSECRET&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;parameter&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;header&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;X-Hub-Signature&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ici, quand le serveur va recevoir l&amp;rsquo;url /hooks/redeploy, on va lancer le script &lt;code&gt;/usr/share/nginx/html/blog.example.org/blog_refresh.sh&lt;/code&gt; depuis le répertoire /usr/share/nginx/html/blog.example.org.&lt;/p&gt;
&lt;p&gt;Charge à nous de créer un script qui va soit :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;récupérer les sources (git pull)&lt;/li&gt;
&lt;li&gt;relancer un build&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Voilà à quoi pourrait ressembler le script &lt;code&gt;blog_refresh.sh&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/share/nginx/html/blog.example.org
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#pull latest version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GIT_SSH_COMMAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ssh -i /var/www/.ssh/id_ed25519 -o IdentitiesOnly=yes&amp;#39;&lt;/span&gt; git clone git@github.com:zwindler/blog.example.org.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#refresh theme submodule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#rebuild (fire and forget)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo --minify --gc &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On va ensuite créer un service systemd qui va lancer le binaire &lt;em&gt;webhook&lt;/em&gt; en tâche de fond&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/systemd/system/webhook.service &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Description=Simple Golang webhook server
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ConditionPathExists=/usr/local/bin/webhook
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;After=network.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;User=www-data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Group=www-data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Type=simple
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;WorkingDirectory=/usr/share/nginx/html/blog.example.org
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ExecStart=/usr/local/bin/webhook -ip 127.0.0.1 -hooks /etc/webhook/hook.json -verbose
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Restart=on-failure
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;WantedBy=default.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; webhook
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl start webhook
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Côté Github.com, on crée le webhook qui va contacter le serveur webhook de la façon suivante :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/07/github-webhook.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On a maintenant un serveur web qui est en attente de certains événements webhooks et qui va lancer un script si jamais l&amp;rsquo;URL de webhook est appelée par Github.com.&lt;/p&gt;
&lt;h2 id="configuration-nginx"&gt;Configuration nginx
&lt;/h2&gt;&lt;p&gt;Il reste maintenant toute la configuration de notre nginx en frontal à faire. En partant du principe qu&amp;rsquo;on vient juste de faire l&amp;rsquo;installation du package, on commence par supprimer le fichier &lt;code&gt;/etc/nginx/sites-enabled/default&lt;/code&gt;, et on en crée un nouveau :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm /etc/nginx/sites-enabled/default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/nginx/sites-available/blog.example.org.conf &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# Root configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;server {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; listen 80;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; server_name blog.example.org;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; location /hooks/ {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; proxy_pass http://127.0.0.1:9000/hooks/;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; error_page 404 /404.html;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; location / {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; root /usr/share/nginx/html/blog.example.org/public;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; index index.html;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -s /etc/nginx/sites-&lt;span class="o"&gt;{&lt;/span&gt;available,enabled&lt;span class="o"&gt;}&lt;/span&gt;/blog.example.org.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On vérifie que la configuration est valide et si oui on redémarre nginx&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl reload nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A partir de maintenant, toutes les URLs qui arriveront jusqu&amp;rsquo;à votre serveur en /hooks seront redirigées sur le logiciel &amp;ldquo;webhook&amp;rdquo; et le reste ira sur votre site statique (/usr/share/nginx/html/blog.example.org/public).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;curl https://blog.example.org/hooks/redeploy -L
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Hook rules were not satisfied.%
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ici le hook renvoie une erreur, car on a pas envoyé le token secret mais c&amp;rsquo;est probable que ça fonctionne. Toutes les autres pages renvoient bien une page du blog :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;curl https://blog.example.org/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;&amp;lt;!DOCTYPE html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;&amp;lt;html lang=&amp;#34;fr-fr&amp;#34; dir=&amp;#34;ltr&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; &amp;lt;head&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; &amp;lt;meta name=&amp;#34;generator&amp;#34; content=&amp;#34;Hugo 0.115.1&amp;#34;&amp;gt;&amp;lt;meta charset=&amp;#39;utf-8&amp;#39;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;[...]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On peut maintenant envoyer des commits et voir si ça déclenche des rebuilds de notre blog. Ou alors, on peut récupérer un push précédent et cliquer sur &amp;ldquo;Redeliver&amp;rdquo; si on veut trigger un rebuild du blog.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/07/github-redelivery.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;root@hugo:~# systemctl status webhook
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;* webhook.service - Simple Golang webhook server
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Loaded: loaded (/etc/systemd/system/webhook.service; enabled; vendor preset: enabled)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Active: active (running) since Mon 2023-07-31 07:34:35 UTC; 33s ago
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Main PID: 900109 (webhook)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Tasks: 15 (limit: 4574)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; Memory: 240.4M
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; CPU: 45.504s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; CGroup: /system.slice/webhook.service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; |-900109 /usr/local/bin/webhook -ip 127.0.0.1 -hooks /etc/webhook/hook.json -verbose
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; `-900161 hugo --minify --gc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:34:35 hugo webhook[900109]: [webhook] 2023/07/31 07:34:35 attempting to load hooks from /etc/webhook/hook.json
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:34:35 hugo webhook[900109]: [webhook] 2023/07/31 07:34:35 found 1 hook(s) in file
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:34:35 hugo webhook[900109]: [webhook] 2023/07/31 07:34:35 loaded: redeploy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:34:35 hugo webhook[900109]: [webhook] 2023/07/31 07:34:35 serving hooks on http://127.0.0.1:9000/hooks/{id}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:34:35 hugo webhook[900109]: [webhook] 2023/07/31 07:34:35 os signal watcher ready
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:34:41 hugo webhook[900109]: [webhook] 2023/07/31 07:34:41 [f089a0] incoming HTTP POST request from 127.0.0.1:43258
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:34:41 hugo webhook[900109]: [webhook] 2023/07/31 07:34:41 [f089a0] redeploy got matched
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:34:41 hugo webhook[900109]: [webhook] 2023/07/31 07:34:41 [f089a0] redeploy hook triggered successfully
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:34:41 hugo webhook[900109]: [webhook] 2023/07/31 07:34:41 [f089a0] 200 | 0 B | 1.151688ms | 127.0.0.1:9000 | POST /hooks/redeploy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:34:41 hugo webhook[900109]: [webhook] 2023/07/31 07:34:41 [f089a0] executing /usr/share/nginx/html/blog.example.org/blog_refresh.sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;[...]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:37:28 hugo webhook[900109]: Pages | 3572
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:37:28 hugo webhook[900109]: Paginator pages | 516
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:37:28 hugo webhook[900109]: Non-page files | 14
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:37:28 hugo webhook[900109]: Static files | 2282
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:37:28 hugo webhook[900109]: Processed images | 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:37:28 hugo webhook[900109]: Aliases | 1563
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:37:28 hugo webhook[900109]: Sitemaps | 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:37:28 hugo webhook[900109]: Cleaned | 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:37:28 hugo webhook[900109]: Total in 166131 ms
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Jul 31 07:37:28 hugo webhook[900109]: [webhook] 2023/07/31 07:37:28 [f089a0] finished handling redeploy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Si vous êtes à l&amp;rsquo;aise avec Linux et nginx, ces quelques manipulations sont assez rapides à faire, il n&amp;rsquo;y a rien de vraiment complexe.&lt;/p&gt;
&lt;p&gt;Cependant, ça demande à l&amp;rsquo;usage un peu d&amp;rsquo;administration et de vouloir mettre les mains dans le cambouis (avoir une VM à gérer). Je ne peux reprocher à personne de préférer l&amp;rsquo;utilisation de Github/Gitlab pages, couplé à de Github actions/Gitlab runners, voire de tout déléguer à Vercel/Netlify&amp;hellip;&lt;/p&gt;
&lt;p&gt;Mais j&amp;rsquo;avais envie de reprendre la main sur le hosting de mon blog (avec tous les inconvénients que ça va avoir en termes de maintien en condition opérationnelle), notamment pour disposer à nouveau de l&amp;rsquo;IPv6 (perdue lors du passage à Vercel) et une navigation sur mon blog plus respectueuse de votre vie privée (pas que j&amp;rsquo;aie pas confiance en Vercel, mais bon&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Et c&amp;rsquo;est en revanche beaucoup plus simple que d&amp;rsquo;héberger son propre serveur Gitlab + Gitlab runners + Gitlab pages ;-).&lt;/p&gt;
&lt;p&gt;Donc, pour mon usage, ça fait le taf :)&lt;/p&gt;
&lt;h2 id="ressources-additionnelles"&gt;Ressources additionnelles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://ansonvandoren.com/posts/deploy-hugo-from-github/" target="_blank" rel="noopener"
&gt;ansonvandoren.com/posts/deploy-hugo-from-github/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://magefan.com/blog/configure-webhooks-in-github" target="_blank" rel="noopener"
&gt;magefan.com/blog/configure-webhooks-in-github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>J'ai enfin migré de Wordpress vers Hugo - partie 2</title><link>https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/</link><pubDate>Mon, 29 Nov 2021 08:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/11/wordpress-to-hugo.webp" alt="Featured image of post J'ai enfin migré de Wordpress vers Hugo - partie 2" /&gt;&lt;p&gt;Cette article fait partie d&amp;rsquo;une suite d&amp;rsquo;articles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="extraire-les-données-de-wordpress"&gt;Extraire les données de WordPress
&lt;/h2&gt;&lt;p&gt;Normalement &lt;a class="link" href="https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/" &gt;si vous avez lu la première partie&lt;/a&gt;, vous savez qu&amp;rsquo;on a un Hugo fonctionnel (mais vide). Et que dans mon cas, l&amp;rsquo;objectif était de migrer 12 ans d&amp;rsquo;historique (350 articles tout de même) de Wordpress vers notre Hugo.&lt;/p&gt;
&lt;p&gt;Vous vous en doutez, le but n&amp;rsquo;est pas de reprendre les articles uns par uns (sauf si vous n&amp;rsquo;en avez qu&amp;rsquo;une dizaine, ça doit se faire) mais bien de trouver une méthode pour exporter le contenu existant en markdown pour repartir comme si de rien n&amp;rsquo;était.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://gohugo.io/tools/migrations/#wordpress" target="_blank" rel="noopener"
&gt;La documentation officielle de Hugo donne plusieurs pistes&lt;/a&gt; pour migrer depuis Wordpress et c&amp;rsquo;est la première que j&amp;rsquo;avais utilisé en 2019 (la première fois que j&amp;rsquo;avais tenté de migrer, sans succès). J&amp;rsquo;ai re-installé l&amp;rsquo;extension &lt;code&gt;wordpress-to-hugo-exporter&lt;/code&gt; (je vous invite quand même à regarder les alternatives car il n&amp;rsquo;est pas impossible que ça ait évolué depuis).&lt;/p&gt;
&lt;h2 id="wordpress-to-hugo-exporter"&gt;wordpress-to-hugo-exporter
&lt;/h2&gt;&lt;p&gt;La première chose à faire pour installer cette extension est de vérifier que votre serveur qui héberge le WordPress dispose bien de l’extension PHP &lt;code&gt;zip.so&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/php.d/40-zip.ini
; Enable ZIP extension module
extension=zip.so
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut ensuite cloner le projet git du plugin directement dans le dossier plugin de WordPress&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd PATH_TO_WORDPRESS/wp-content/plugins/
git clone https://github.com/SchumacherFM/wordpress-to-hugo-exporter
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, il est possible de démarrer un export soit depuis l&amp;rsquo;interface, soit via un script en PHP lancé depuis le serveur en ligne de commandes. Évidemment, dans ce genre de procédures, on arrive toujours à un moment où on se tape un timeout quelque part. Dans mon cas, les données exportées (articles + medias, environ ~1.5 Go) prenaient 500 Mo de RAM et 20 minutes d&amp;rsquo;exécution.&lt;/p&gt;
&lt;p&gt;On oublie donc le clic dans l&amp;rsquo;interface (sauf à tuner votre nginx pour autoriser des requêtes clients avec un timeout &amp;gt; 60s) et on lance depuis la ligne de commande. Et bien entendu, on augmente toutes les limites possibles et imaginables, notamment celle de wordpress via le fichier wp-config.php.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-PHP" data-lang="PHP"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Set initial default constants including WP_MEMORY_LIMIT, WP_MAX_MEMORY_LIMIT, WP_DEBUG, SCRIPT_DEBUG, WP_CONTENT_DIR and WP_CACHE.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;wp_initial_constants&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;WP_MEMORY_LIMIT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2048M&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;WP_MAX_MEMORY_LIMIT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2048M&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; PATH_TO_WORDPRESS/wp-content/plugins/wordpress-to-hugo-exporter/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php hugo-export-cli.php &lt;span class="nv"&gt;memory_limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Qui devrait se terminer, si tout se passe bien, par un :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is your file!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/tmp/wp-hugo.zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Note: on peut également exporter les commentaires, il faut modifier manuellement une ligne dans le fichier &lt;code&gt;hugo-export.php&lt;/code&gt; (voir la doc)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A partir de là, on a une archive qui contient vos posts, vos pages et vos médias importés (grosso modo tout wp-content).&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;archive a l&amp;rsquo;arborescence suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un dossier &lt;strong&gt;posts&lt;/strong&gt; qui contient tous les articles (&lt;em&gt;posts&lt;/em&gt; dans la terminologie wordpress) dans un mélange de markdown + html brut (ce qui n&amp;rsquo;aura pas été correctement converti, on y reviendra)&lt;/li&gt;
&lt;li&gt;un dossier &lt;strong&gt;wp-content&lt;/strong&gt; qui contient tous les médias&lt;/li&gt;
&lt;li&gt;des dossiers pour chacune de vos &amp;ldquo;&lt;em&gt;pages&lt;/em&gt; (&amp;ldquo;à propos&amp;rdquo;, &amp;ldquo;mentions légales&amp;rdquo;, etc).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="importer-dans-hugo"&gt;Importer dans Hugo
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;arborescence de Hugo est elle un peu différente. De base, tout ce qui est markdown doit être dans &lt;strong&gt;content&lt;/strong&gt;, avec des sous dossiers en fonction du type de page (&lt;em&gt;post&lt;/em&gt; ou &lt;em&gt;page&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;La première petite &amp;ldquo;blaguounette&amp;rdquo; est que les &lt;em&gt;posts&lt;/em&gt; doivent être déposés dans le sous-dossier &lt;strong&gt;content/post&lt;/strong&gt; (sans S à la fin !!!).&lt;/p&gt;
&lt;p&gt;Chaque post commence par des métadonnées encadrées par des triples tirets &amp;ldquo;&amp;mdash;&amp;rdquo; avant et après. Ca donne quelque chose comme ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;title: &amp;#39;ESXi 4.0 &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Explorons l&amp;amp;rsquo;Hidden Console Part 1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;zwindler&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;post&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ld"&gt;2010-04-28T08:32:20&lt;/span&gt;&lt;span class="m"&gt;+00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/2010/04/28/esxi-4-0-explorons-lhidden-console-part-1/&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://blog.example.org/wp-content/uploads/2014/10/vmware-220x162.jpg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;Virtualisation&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;ESX(i)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;Hidden Console&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;SSH&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;L&amp;#39;article lui même...]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ca peut différer un peu selon les thèmes je pense, mais grosso modo les markdown des &lt;em&gt;pages&lt;/em&gt; iront eux dans &lt;strong&gt;content/page&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Enfin, tout ce qui est media (dossier wp-media) va dans un dossier &lt;strong&gt;static&lt;/strong&gt;. On peut garder la même arborescence que wordpress (/année/mois/) mais rien ne nous y oblige.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So far, so good&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="emile-et-images"&gt;Emile et Images
&lt;/h2&gt;&lt;p&gt;Enfin&amp;hellip; &lt;em&gt;so good&lt;/em&gt;, c&amp;rsquo;est vite dit&amp;hellip;&lt;/p&gt;
&lt;p&gt;Et oui parce que l&amp;rsquo;exporter n&amp;rsquo;exporte pas hyper bien un certain nombre de choses, à commencer par l&amp;rsquo;image de garde de chaque article :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;featured_image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://blog.example.org/wp-content/uploads/2014/10/vmware-220x162.jpg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On peut remarquer plusieurs soucis avec cette variable. D&amp;rsquo;abord, la variable utilisée pour indiquer le chemin de l&amp;rsquo;image dans les métadonnées générées est &lt;code&gt;featured_image&lt;/code&gt; alors qu&amp;rsquo;Hugo attend &lt;code&gt;image&lt;/code&gt;. Petit &lt;code&gt;sed&lt;/code&gt; sur vos md pour corriger ça :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/featured_image/image/g&amp;#34;&lt;/span&gt; fichier.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mais bien sûr, ce n&amp;rsquo;est pas fini ;-)&lt;/p&gt;
&lt;p&gt;Ensuite, on remarque qu&amp;rsquo;on a un chemin est une URL complète et non pas relative. Si vous gardez les média dans le chemin &lt;strong&gt;static/wp-content/uploads/YYYY/MM&lt;/strong&gt; ça marchera, mais je trouve ça moche.&lt;/p&gt;
&lt;p&gt;2 solutions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on supprime &lt;strong&gt;/wp-content/uploads&lt;/strong&gt; avec un bête &lt;code&gt;sed -i &amp;quot;s!/wp-content/uploads!!g fichier.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;on passe en relatif en supprimant carrément toute la première partie de l&amp;rsquo;URL &lt;strong&gt;&lt;a class="link" href="https://yourblog.example.org/wp-content/uploads" target="_blank" rel="noopener"
&gt;https://yourblog.example.org/wp-content/uploads&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous choisissez la 2ème solution (mon choix), faites quand même bien attention. En fonction de &lt;em&gt;comment&lt;/em&gt; vous rédigez votre expression régulière, ça pourrait affecter aussi toutes les autres images que vous auriez en lien dans vos articles. Ce n&amp;rsquo;est pas forcément une mauvaise chose (moi j&amp;rsquo;aime mieux les liens relatifs car c&amp;rsquo;est plus flexible) mais ça demande un travail supplémentaire.&lt;/p&gt;
&lt;h2 id="images-intermédiaires"&gt;Images intermédiaires
&lt;/h2&gt;&lt;p&gt;Toujours dans les images, vous remarquerez aussi que l&amp;rsquo;image &amp;ldquo;mise en avant&amp;rdquo; (dans les métadonnées) possède un suffixe de type &lt;code&gt;-111x222&lt;/code&gt; juste avant l&amp;rsquo;extension. En fait, chaque fois que vous importez une image dans wordpress, celui ci la convertie en plusieurs tailles pour accélérer le chargement des pages.&lt;/p&gt;
&lt;p&gt;Sauf que le &lt;strong&gt;wordpress-to-hugo-exporter&lt;/strong&gt; choisi une des plus petites résolution pour l&amp;rsquo;image en tête de l&amp;rsquo;article. Ca sera souvent hyper moche&amp;hellip;&lt;/p&gt;
&lt;p&gt;Là encore, j&amp;rsquo;ai donc passé un gros &lt;code&gt;sed&lt;/code&gt; pour virer tous les suffixes &lt;code&gt;-111x222&lt;/code&gt; avant l&amp;rsquo;extension, puis je n&amp;rsquo;ai copié QUE les images originales dans le dossier &lt;strong&gt;static&lt;/strong&gt; (regex non triviale) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; PATH_TO_EXPORT/wp-content/uploads
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="sb"&gt;`&lt;/span&gt;seq &lt;span class="m"&gt;2010&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; 2021&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; find &lt;span class="nv"&gt;$i&lt;/span&gt; -mindepth &lt;span class="m"&gt;1&lt;/span&gt; -type f -regextype posix-egrep -not -iregex &lt;span class="s2"&gt;&amp;#34;.*/.*-[0-9]{1,4}x[0-9]{1,4}.*\..*&amp;#34;&lt;/span&gt; -exec cp &lt;span class="o"&gt;{}&lt;/span&gt; PATH_TO_HUGO/static/&lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&gt;\;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nettoyer-les-caractères-spéciaux-html"&gt;Nettoyer les caractères spéciaux HTML
&lt;/h2&gt;&lt;p&gt;Si vous avez bien lu l&amp;rsquo;exemple de métadonnées exportées que j&amp;rsquo;ai donné, vous aurez peut être remarqué la présence d&amp;rsquo;un caractère spécial encodé &lt;code&gt;&amp;amp;rsquo;&lt;/code&gt; dans le titre.&lt;/p&gt;
&lt;p&gt;Dans une page HTML, ce n&amp;rsquo;est pas grave, mais Hugo lui, ne les interprète pas comme tel dans le markdown. Il faut donc leur faire la chasse et tous les convertir 🤦. Et encore, il faut faire attention, car certains de ces caractères pourraient être légitimement écris en HTML (si vous faite un tuto sur HTML, ce n&amp;rsquo;est pas impossible par exemple)&amp;hellip;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai pour ma part lancé un gros &lt;code&gt;sed&lt;/code&gt; (une fois de plus) sur tous mes articles mais prudence !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;rsquo;/’/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8211;/--/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8230;/.../g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;gt;/&amp;gt;/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;lt;/&amp;lt;/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8212;/-/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#8217;/&amp;#39;/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &lt;span class="s2"&gt;&amp;#34;s/&amp;amp;#215;/×/g&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je n&amp;rsquo;ai pas osé modifier les caractères suivants, très souvent présents dans les URLs :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;amp;#038
&amp;amp;#039
&amp;amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mais c&amp;rsquo;est quand même une bonne idée de faire une grosse recherche avec votre éditeur de texte favori pour voir s&amp;rsquo;il ne reste pas des &lt;code&gt;&amp;amp;#&lt;/code&gt; qui traînent dans votre contenu.&lt;/p&gt;
&lt;h2 id="html-désactivé"&gt;HTML désactivé
&lt;/h2&gt;&lt;p&gt;Au delà des caractères spéciaux, il arrive aussi que l&amp;rsquo;exporter est un peu de mal avec les différents types d&amp;rsquo;éditeurs que Wordpress a pu avoir au fil du temps.&lt;/p&gt;
&lt;p&gt;Typiquement, beaucoup du contenu &amp;ldquo;non texte&amp;rdquo; que j&amp;rsquo;ai ajouté au fil des années s&amp;rsquo;est retrouvé non converti par ce que j&amp;rsquo;ai rédigé s&amp;rsquo;est retrouvé exporté tel quel, en HTML brut inséré dans mon markdown.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est hyper traître car Hugo ne renvoie aucune erreur. Il manque &amp;ldquo;juste&amp;rdquo; des bouts ! On peut les retrouver en allant voir le code source de la page, qui affiche alors les commentaires HTML suivants :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- raw HTML omitted --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En attendant de nettoyer tout ça à grand coup de &lt;code&gt;sed&lt;/code&gt;, on peut résoudre une partie des problèmes en &amp;ldquo;réactivant le support du code HTML dans le markdown dans votre &lt;code&gt;config.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;markup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;goldmark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;## Set to true if you have HTML content inside Markdown&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;unsafe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ca permet de sauver les meubles mais ce n&amp;rsquo;est pas suffisant&amp;hellip;&lt;/p&gt;
&lt;h2 id="markdown-hates-html"&gt;Markdown hates HTML
&lt;/h2&gt;&lt;p&gt;Même comme ça, on grosse partie du HTML sera HS&amp;hellip; Tous les tableaux (table/tr/td) et listes (ul/li) HTML sont pétés car l&amp;rsquo;exporter laisse des sauts de lignes entre les blocs, que le markdown interprète mal. Il faudra supprimer tous les sauts de lignes en trop (ou réécrire en markdown)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;table class=&amp;#34;Content&amp;#34; border=&amp;#34;0&amp;#34; width=&amp;#34;750&amp;#34;&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td class=&amp;#34;LargeBold&amp;#34;&amp;gt;
SEND_CUSTOM_SVC_NOTIFICATION
&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td class=&amp;#34;MediumBold&amp;#34;&amp;gt;
Command Format:
&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sachez également que toutes les &amp;ldquo;videos embedded&amp;rdquo; Youtube disparaîtront purement et simplement, et que pour les tweets, vous aurez une version très moche du tweet, sans l&amp;rsquo;image&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;blockquote&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;twitter-tweet&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;550&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;en&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-dnt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-partner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;jetpack&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fr&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ltr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [[#SAPHANA](ht tps://tw itter.com/hashtag/SAPHANA?src=hash&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;ref_src=twsrc%5Etfw)] Finies les mises à jour incompatibles avec votre plateforme, optez pour la simplicité et la tranquillité, chez SAP : on collecte, on connecte, ça marche : [t.co/2AdCCEQ97L](https://t.c o/2AdCCEQ97L) [pic.twi tter.com/yy7moMnZmC](ht tps://t.c o/yy7moMnZmC)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- SAP France (@SAPFrance)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [October 8, 2018](ht tps://twiter.com/SAPFrance/status/1049286253533962241?ref_src=twsrc%5Etfw)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;blockquote&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;J&amp;rsquo;en avais peu heureusement, j&amp;rsquo;ai donc pris des captures d&amp;rsquo;écran et ajouté des liens.&lt;/p&gt;
&lt;h2 id="balises-de-code-pre-etc"&gt;Balises de code, pre, etc.
&lt;/h2&gt;&lt;p&gt;Une autre grosse catégorie de code &amp;ldquo;mal exporté&amp;rdquo; est le &amp;ldquo;code&amp;rdquo;. Je donne souvent des bouts de scripts ou de code ou tout simplement des commandes à passer sur des serveurs. Et au fil des années, j&amp;rsquo;ai (&amp;amp; wordpress) changé plusieurs fois la façon d&amp;rsquo;afficher du code dans mes articles.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;abord avec des balises HTML &lt;code&gt;&amp;lt;pre&amp;gt;&amp;lt;/pre&amp;gt;&lt;/code&gt;, puis des balises &lt;code&gt;&amp;lt;code&amp;gt;&amp;lt;/code&amp;gt;&lt;/code&gt;, puis via des extensions (pour avoir la coloration syntaxique), puis via du markdown via Jetpack, puis de nouveau via les extensions&amp;hellip;&lt;/p&gt;
&lt;p&gt;Autant dire que le HTML généré par Wordpress ne ressemble à rien&amp;hellip;&lt;/p&gt;
&lt;p&gt;Il a fallut faire un gros gros boulot pour détecter toutes les balises de code ouvrantes et fermantes pour les convertir en ``` de markdown&amp;hellip;&lt;/p&gt;
&lt;p&gt;Quelques exemples que j&amp;rsquo;ai rencontré :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-HTML" data-lang="HTML"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;brush: plain; title: ; notranslate&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;brush: perl; collapse: false; title: ; wrap-lines: false; notranslate&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EnlighterJSRAW&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;null&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EnlighterJSRAW&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;generic&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;EnlighterJSRAW&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;generic&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;data-enlighter-theme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;... et bien d&amp;#39;autres encore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="final-words"&gt;Final words
&lt;/h2&gt;&lt;p&gt;Je m&amp;rsquo;arrête là car l&amp;rsquo;article est déjà très long, mais il y a eu d&amp;rsquo;autres petits problèmes du même style, plus sporadiques&amp;hellip;&lt;/p&gt;
&lt;p&gt;Vous voyez donc qu&amp;rsquo;exporter le blog sur Hugo n&amp;rsquo;aura pas été de tout repos, dans mon cas. Et encore ! Je n&amp;rsquo;ai pas exporté les commentaires historiques (plus de 1600) !&lt;/p&gt;
&lt;p&gt;Cependant, si vous avez un blog plus petit que celui ci, vous devriez avoir moins de mal et les conseils que je donne ici devraient vous permettre de régler rapidement 90% des problèmes.&lt;/p&gt;
&lt;p&gt;Enjoy !&lt;/p&gt;</description></item><item><title>J'ai enfin migré de Wordpress vers Hugo - partie 1</title><link>https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/</link><pubDate>Mon, 22 Nov 2021 08:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/11/wordpress-to-hugo.webp" alt="Featured image of post J'ai enfin migré de Wordpress vers Hugo - partie 1" /&gt;&lt;p&gt;Cette article fait partie d&amp;rsquo;une suite d&amp;rsquo;articles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/22/jai-enfin-migre-de-wordpress-a-hugo-partie-1/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/11/29/jai-enfin-migre-de-wordpress-a-hugo-partie-2/" &gt;J&amp;rsquo;ai enfin migré de Wordpress vers Hugo - partie 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="plus-de-2-ans-et-demi"&gt;Plus de 2 ans et demi
&lt;/h2&gt;&lt;p&gt;Ca fait plus de 2 ans et demi que je râle que j&amp;rsquo;en ai ma claque de Wordpress.&lt;/p&gt;
&lt;p&gt;Stack LEMP à maintenir, perfs bof (j&amp;rsquo;ai du mettre un cache pour passer sous la seconde, wtf&amp;hellip;), plugins aux MAJs hasardeuses, failles de sécu, pas de support propre du markdown, éditeur à ch*** (Gutenberg, je te hais), &amp;hellip; you name it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_mieuxavant.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Après 12 ans de blogging, il était temps de faire l&amp;rsquo;effort et de quitter Wordpress pour quelque chose qui me convient mieux : un moteur de blog statique (rien de dynamique dans ce que je poste) en markdown (parce que de toute façon c&amp;rsquo;est comme ça que j&amp;rsquo;écris mes articles à la base). Le tout dans git pour historiser tout ça.&lt;/p&gt;
&lt;p&gt;Et j&amp;rsquo;ai choisi Hugo pour des raisons que &lt;a class="link" href="https://blog.zwindler.fr/2019/06/10/comment-migrer-de-wordpress-a-hugo/" &gt;je détaille dans l&amp;rsquo;article 2019 &amp;ldquo;Comment migrer de Wordpress à Hugo&amp;rdquo; si ça vous intéresse&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="forcément-cest-pas-si-facile"&gt;Forcément, c&amp;rsquo;est pas si facile
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;en parlais déjà dans l&amp;rsquo;article de 2019 : migrer de Wordpress à Hugo, forcément ce n&amp;rsquo;est pas si facile. D&amp;rsquo;ailleurs, j&amp;rsquo;avais même abandonné l&amp;rsquo;idée devant l&amp;rsquo;ampleur da tâche !&lt;/p&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas tant la partie technique (installation de Hugo, export du blog existant) le problème. En quelques minutes, on a un blog fonctionnel, l&amp;rsquo;export prend guère plus de temps. Rajouter l&amp;rsquo;outillage pour automatiser certaines tâches prend un peu de temps mais rien d&amp;rsquo;incroyable.&lt;/p&gt;
&lt;p&gt;Mon problème était plutôt que je voulais obtenir au moins aussi bien que ce que j&amp;rsquo;avais avant, existant inclus.&lt;/p&gt;
&lt;p&gt;Et c&amp;rsquo;est là que le bat blesse : wordpress, avec mes 12 ans (350 articles) d&amp;rsquo;historique, c&amp;rsquo;est au fil des années 15 façons différentes d&amp;rsquo;afficher du HTML&amp;hellip; que le plugin d&amp;rsquo;export gère comme il peut ! Nous y reviendrons.&lt;/p&gt;
&lt;p&gt;Je vais donc vous guider un peu sur la partie technique, puis j&amp;rsquo;aborderai ensuite les points pénibles du nettoyage du markdown, qui m&amp;rsquo;a pris un bonne partie de mes vacances (plusieurs journées à ~2-3 heures par jour). Il y aura aussi, plus tard, des articles sur l&amp;rsquo;outillage à mettre en place pour se faciliter la vie au quotidien.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;installation en elle même est triviale. On a un binaire compilé en go packagé dans un &lt;strong&gt;.deb&lt;/strong&gt; (ou les sources si vous voulez le builder vous même) disponible sur github. Fin.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0.88.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/gohugoio/hugo/releases/download/v&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/hugo_&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ou https://github.com/gohugoio/hugo/releases/download/v${VER}/hugo_extended_${VER}_Linux-64bit.deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ./hugo*_0.88.1_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A noter que dans mon cas, je n&amp;rsquo;ai pas téléchargé la version ci dessus, mais la version &amp;ldquo;extended&amp;rdquo;, nécessaire pour le thème que j&amp;rsquo;ai choisi, mais le principe est le même.&lt;/p&gt;
&lt;h2 id="initialisation-du-site-et-du-dépôt-git"&gt;Initialisation du site et du dépôt git
&lt;/h2&gt;&lt;p&gt;Hugo est maintenant disponible sur votre machine.&lt;/p&gt;
&lt;p&gt;A partir de là, je vous invite fortement à versionner tout ce que vous allez faire avec votre blog. C&amp;rsquo;est bien entendu optionnel mais pourquoi se priver de toute la puissance du couple markdown + git ?&lt;/p&gt;
&lt;p&gt;On commence par créer un dossier puis on génère un squelette de site vierge avec &lt;code&gt;hugo new site&lt;/code&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir hugo &amp;amp;&amp;amp; cd hugo
hugo new site toto
Congratulations! Your new Hugo site is created in toto.
Just a few more steps and you&amp;#39;re ready to go:
1. Download a theme into the same-named folder.
Choose a theme from https://themes.gohugo.io/ or
create your own with the &amp;#34;hugo new theme &amp;lt;THEMENAME&amp;gt;&amp;#34; command.
2. Perhaps you want to add some content. You can add single files
with &amp;#34;hugo new &amp;lt;SECTIONNAME&amp;gt;/&amp;lt;FILENAME&amp;gt;.&amp;lt;FORMAT&amp;gt;&amp;#34;.
3. Start the built-in live server via &amp;#34;hugo server&amp;#34;.
Visit https://gohugo.io/ for quickstart guide and full documentation.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, on va pouvoir initialiser notre dépôt git&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; toto
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bon, si jamais vous lancez la génération du blog avec simplement la commande de preview &lt;code&gt;hugo server&lt;/code&gt;, vous allez être assez déçus, ça donne une page blanche. Mais, ça marche !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Start building sites …
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo v0.88.1-5BC54738+extended linux/amd64 &lt;span class="nv"&gt;BuildDate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2021-09-04T09:39:19Z &lt;span class="nv"&gt;VendorInfo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gohugoio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN 2021/11/14 06:57:47 found no layout file &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; kind &lt;span class="s2"&gt;&amp;#34;taxonomy&amp;#34;&lt;/span&gt;: You should create a template file which matches Hugo Layouts Lookup Rules &lt;span class="k"&gt;for&lt;/span&gt; this combination.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN 2021/11/14 06:57:47 found no layout file &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; kind &lt;span class="s2"&gt;&amp;#34;home&amp;#34;&lt;/span&gt;: You should create a template file which matches Hugo Layouts Lookup Rules &lt;span class="k"&gt;for&lt;/span&gt; this combination.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;WARN 2021/11/14 06:57:47 found no layout file &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HTML&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; kind &lt;span class="s2"&gt;&amp;#34;taxonomy&amp;#34;&lt;/span&gt;: You should create a template file which matches Hugo Layouts Lookup Rules &lt;span class="k"&gt;for&lt;/span&gt; this combination.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; EN
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-------------------+-----
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Pages &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Paginator pages &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Non-page files &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Static files &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Processed images &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Aliases &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Sitemaps &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Cleaned &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Built in &lt;span class="m"&gt;1&lt;/span&gt; ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Watching &lt;span class="k"&gt;for&lt;/span&gt; changes in /toto/&lt;span class="o"&gt;{&lt;/span&gt;archetypes,content,data,layouts,static&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Watching &lt;span class="k"&gt;for&lt;/span&gt; config changes in /toto/config.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Environment: &lt;span class="s2"&gt;&amp;#34;development&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Serving pages from memory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Running in Fast Render Mode. For full rebuilds on change: hugo server --disableFastRender
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Web Server is available at http://localhost:1313/ &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt; address 127.0.0.1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Press Ctrl+C to stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ajout-dun-thème"&gt;Ajout d&amp;rsquo;un thème
&lt;/h2&gt;&lt;p&gt;Avant même de commencer à ajouter du contenu, il est probable que vous allez vouloir choisir un thème. Il existe une liste de thèmes, plus fournie qu&amp;rsquo;en 2019, &lt;a class="link" href="https://themes.gohugo.io/" target="_blank" rel="noopener"
&gt;disponible ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une fois le thème choisi, on va l&amp;rsquo;ajouter au site à l&amp;rsquo;aide de la (très utile) commande git &lt;code&gt;git submodule&lt;/code&gt; qui va nous permettre de gérer notre thème et ses mises à jour avec git sans pour autant commiter tous les fichiers.&lt;/p&gt;
&lt;p&gt;Dans mon cas j&amp;rsquo;ai choisi le thème &amp;ldquo;stack&amp;rdquo; mais le principe est grosso modo le même pour tous (à quelques détails d&amp;rsquo;implémentation près) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; themes/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule add https://github.com/CaiJimmy/hugo-theme-stack.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="avant-le-premier-article-"&gt;Avant le premier article !
&lt;/h2&gt;&lt;p&gt;Si on veut bosser un peu proprement, on va vouloir éviter de commiter n&amp;rsquo;importe quoi. Comme hugo est un générateur de blog statique, on va bien entendu éviter de commiter le code statique généré par la commande &lt;code&gt;hugo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On utilise simplement un fichier &lt;strong&gt;.gitignore&lt;/strong&gt; à la racine du projet pour ignorer tout ce qui est technique ou qui n&amp;rsquo;est pas du code :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; .gitignore &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;themes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;resources/_gen
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;assets/jsconfig.json
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;public
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On va aussi vouloir paramétrer a minima notre site. Vous aurez peut être remarqué qu&amp;rsquo;il existe un fichier &lt;code&gt;config.toml&lt;/code&gt; généré par défaut par la commande &lt;code&gt;hugo new site&lt;/code&gt;. Il s&amp;rsquo;agit de &amp;ldquo;l&amp;rsquo;ancienne&amp;rdquo; manière de faire de la configuration Hugo, mais surtout d&amp;rsquo;un fichier agnostique du thème utilisée. Généralement, il vaut mieux le supprimer et repartir du fichier d&amp;rsquo;exemple inclus avec votre thème.&lt;/p&gt;
&lt;p&gt;Dans mon cas, il s&amp;rsquo;agit du fichier &lt;strong&gt;theme/hugo-theme-stack/config.yaml&lt;/strong&gt; que j&amp;rsquo;ai donc copié à la racine du projet et modifié pour correspondre à mon site et mes besoins.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;baseurl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://blog.zwindler.fr&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;languageCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;fr-fr&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;hugo-theme-stack&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Zwindler&amp;#39;s Reflection&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;...]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="le-premier-commit"&gt;Le premier commit
&lt;/h2&gt;&lt;p&gt;C&amp;rsquo;est un petit moment agréable dans n&amp;rsquo;importe quel projet informatique. Le premier commit.&lt;/p&gt;
&lt;p&gt;Bon moi, comme j&amp;rsquo;ai hébergé le dépôt sur Github et qu&amp;rsquo;ils ont décidé de renommer &lt;strong&gt;master&lt;/strong&gt; en &lt;strong&gt;main&lt;/strong&gt; dans le nom de la branche par défaut on a un peu de gymnastique à faire, mais pourquoi pas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;first commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git branch -M main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add origin git@github.com:zwindler/example.org.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push -u origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le &amp;ldquo;code&amp;rdquo; de notre (absence de) blog est publié Internet :)&lt;/p&gt;
&lt;h2 id="et-en-prod-"&gt;Et en prod ?
&lt;/h2&gt;&lt;p&gt;Vous pouvez donc commencer à écrire (dans &lt;strong&gt;content/post&lt;/strong&gt;), tester votre blog en local, puis pousser le code sur git. Mais si jamais vous voulez héberger votre site ailleurs que sur votre laptop (et je parie que c&amp;rsquo;est le cas) ?&lt;/p&gt;
&lt;p&gt;Et bien c&amp;rsquo;est là où c&amp;rsquo;est chouette d&amp;rsquo;utiliser git et un dépôt accessible depuis Internet. Vous n&amp;rsquo;avez qu&amp;rsquo;à reproduire l&amp;rsquo;installation de hugo, ajouter votre dépôt, initialiser les submodules (notre thème) et le tour est joué !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0.88.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/gohugoio/hugo/releases/download/v&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/hugo_&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ou https://github.com/gohugoio/hugo/releases/download/v${VER}/hugo_extended_${VER}_Linux-64bit.deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ./hugo*_0.88.1_Linux-64bit.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/zwindler/toto.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Normalement, le site devrait se générer, comme en local. Si vous n&amp;rsquo;avez pas d&amp;rsquo;historique à migrer, comme moi, vous êtes donc l&amp;rsquo;heureux propriétaire d&amp;rsquo;un blog statique fonctionnel :-). La classe !&lt;/p&gt;
&lt;p&gt;Sinon, dans le prochain article, j&amp;rsquo;aborderai un plus gros morceau, à savoir l&amp;rsquo;export et le nettoyage du markdown depuis un Wordpress existant.&lt;/p&gt;</description></item></channel></rss>