<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://jamstatic.fr/xsl/atom.xsl" media="all"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
  <id>https://jamstatic.fr/categories/deploiement/</id>
  <title>Jamstatic - déploiement</title>
  <subtitle><![CDATA[Jamstatic, la communauté des sites statiques et des architectures découplées.]]></subtitle>
  <link href="https://jamstatic.fr/categories/deploiement/feed.xml" rel="self" type="application/atom+xml" />
  <link href="https://jamstatic.fr/categories/deploiement/" rel="alternate" type="text/html" />
  <updated>2026-03-28T02:49:22+00:00</updated>
  <author>
    <name>Jamstatic</name>
    <uri>https://jamstatic.fr/</uri>
  </author>
  <entry xml:lang="fr">
    <id>https://jamstatic.fr/2021/03/09/11000-pages-statiques/</id>
    <title>Un site statique de 11 000 pages, c&#039;est possible ?</title>
    <published>2021-03-09T14:00:00+00:00</published>
    <link href="https://jamstatic.fr/2021/03/09/11000-pages-statiques/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<p>Les sites statiques pour un site de média c'est l'idéal. Rapide, léger, sécurisé, tout semble coller sur le papier. Mais est-il possible de créer un site statique avec un grand nombre de pages ?</p>
<h2 id="le-contexte">Le contexte</h2>
<p>Tout débute par un client. Une entreprise qui gère des documents et des articles sur tout ce qui concerne les textes légaux sur le droit du travail dans les sociétés françaises.  Elle existe depuis des décennies et comme toutes les entreprises de média et de documentation, elle produit beaucoup de contenu chaque année.  </p>
<p>Au fil des années, par la création de plusieurs sites web, ils ont une accumulation de divers technologies et langages. Le client souhaite aller de l'avant, réduire la dette technique et simplifier toute son infrastructure. Et réduire les coûts si possible.<br>
Il désire donc basculer une bonne partie des sites actuels sur des sites statiques.  </p>
<p>Mais avant d'investir de l'énergie humaine et de l'argent dans cette grosse migration, il est indispensable de tester les possibilités des solutions, vérifier que la solution matche bien avec le besoin et les enjeux business.</p>
<h2 id="choix-des-generateurs-et-du-cms-headless">Choix des générateurs et du CMS Headless</h2>
<p>Côté CMS, le choix est déjà arrêté sur <a href="https://craftcms.com" target="_blank" rel="noopener noreferrer">Craft CMS</a>. C'est un CMS qui propose une très bonne expérience pour l'édition et surtout, il permet un mode headless avec des fonctionnalités très intéressantes par défaut. On y retrouve notamment: un mode prévisualisation, une API GraphQL et des webhooks. Parfait pour fonctionner avec un site statique.</p>
<p>Le mode prévisualisation offre une bonne expérience aux responsables du contenu. Il est très important pour une complète adoption par l'équipe de pouvoir éditer du contenu et vérifier le rendu immédiatement.</p>
<p>Comme le mode prévisualisation est un prérequis, cela élimine déjà tous les GSS (générateur de site statique) pur HTML (<a href="/categories/hugo/">Hugo</a>, <a href="/categories/eleventy/">Eleventy</a>, etc.) sur lequel on ne bénéficie pas de cette fonctionnalité.<br>
On s'oriente donc sur deux solutions qui offrent la possibilité de fonctionner dans ce mode. C'est donc Nuxt.js et Next.js qui sont retenus.</p>
<p>Gastby aurait pu être utilisé aussi grâce à la nouvelle route API mais nous souhaitons conserver des process de build assez rapide. D'expérience, je connais bien Gatsby et je sais qu'il est le moins performant — ce prototype précède l'annonce de la version 3.0 annoncée comme plus rapide.</p>
<p>Pour être 100% honnête, cet <a href="/2020/10/31/comparatif-performance-generateurs-de-site-statique/">article</a> a mis de côté Gastby au profit de Next.js dès le départ.</p>
<aside class="note note-info"><h3 id="next-js">Next.js</h3>
<p><a href="https://nextjs.org" target="_blank" rel="noopener noreferrer">Next.js</a> est un framework JavaScript basé sur React. Il permet de générer des applications React sous trois modes de rendu : SSR (rendu serveur), hybride (statique dynamique) et 100% statique (export des pages sous forme HTML).<br>
Uniquement dans le mode hybride, il offre les fonctionnalités suivantes : le mode prévisualisation des pages non générées, la regénération statique incrémentale (la (re)génération de pages existantes ou non, sous forme de fichiers statiques).</p></aside>
<aside class="note note-info"><h3 id="nuxt-js">Nuxt.js</h3>
<p><a href="https://fr.nuxtjs.org" target="_blank" rel="noopener noreferrer">Nuxt.js</a> est un framework JavaScript basé sur Vue.js. Il permet de générer des applications Vue.js sous trois modes de rendu : SSR (rendu serveur), SPA (single page application) et 100% statique (export des pages HTML).<br>
Il propose également un système de prévisualisation, mais dans le mode 100% statique. À ce jour, il ne propose pas de système de génération de page dynamique comme Next.js.<br>
Rien de confirmé pour le moment, mais la version 3.0 de Nuxt.js devrait proposer une fonctionnalité équivalente.</p></aside>
<h2 id="commencons-avec-next-js">Commençons avec Next.js</h2>
<p>Nous commençons avec Next.js, et nous avons hâte de découvrir le mode incrémental. La vitesse de publication d'une nouvelle version du site est également un point important. En effet, Next.js a implémenté deux modes intéressants dans les dernières versions : le mode incrémental et la régénération des pages.</p>
<p>Néanmoins ces deux fonctionnalités et le mode prévisualisation ne sont pas disponibles dans le mode entièrement statique (export HTML). Donc <strong>pour Next.js, le mode hybride est obligatoire</strong> et demande donc un serveur Node.js pour le faire tourner. Pas de soucis aujourd'hui, car Vercel est très accessible en termes d'hébergement et Netlify propose aussi la possibilité de faire tourner Next.js en mode hybride sur son service.</p>
<h2 id="generation-des-11-000-pages-et-premier-blocage">Génération des 11 000 pages et premier blocage</h2>
<p>Durant le développement, je travaillais avec un échantillon d'une centaine de pages. Jusque là, tout va bien. Je fais mon développement, j'ajoute les pages, la pagination. Tout fonctionne parfaitement.</p>
<p>Il est temps de tester avec les 11 000 pages. Et là, patatras !  L'API a du mal à suivre les requêtes. Eh oui, 11 000 pages, c'est autant de requêtes pour générer chaque page dans un temps très court. Évidemment, à ce stade, rien n'est optimisé du côté du CMS mais c'est un premier blocage dans la génération des pages.</p>
<p>Pour optimiser les appels vers l'API, je fais un système de cache qui permet d'utiliser les fichiers du cache au lieu d'appeler l'API. Je génère le cache juste avant le build.<br>
Tout fonctionne parfaitement. Les 11 000 pages prennent entre 5 et 8 minutes pour être créées.</p>
<h2 id="la-surprise-ou-le-blocage-qu-on-attendait-pas">La surprise ou le blocage qu'on attendait pas</h2>
<p>Bon OK, le temps de build des 11 000 pages est un petit peu long. Si on doit attendre à chaque fois entre 5 et 10 minutes pour avoir une nouvelle version en ligne, ce n’est pas top.</p>
<p>Mais là où nous avons été surpris, c'est quand nous avons testé le déploiement sur Vercel.<br>
Une chose que j'avais oubliée, c'est que 11 000 pages, c'est entre 400 et 500 Mb. Et en upload, ça prend du temps. Beaucoup de temps !</p>
<p>Clairement, au début, j'ai cru a un bug. J'ai coupé le déploiement au bout de 39 minutes. Oui, vous avez bien lu, 39 minutes. Et non, ce n’était pas un bug : j'ai testé sur Netlify, via FTP avec une connexion fibre, ça prend bien une bonne quarantaine de minutes !</p>
<figure>
<picture title="39 minutes de temps de déploiement">
<source type="image/webp" srcset="/images/post/11000-pages-statiques/39mindeploy.db86559c1af22952417cd298357497f6.webp" width="356" height="74">
<source type="image/avif" srcset="/images/post/11000-pages-statiques/39mindeploy.db86559c1af22952417cd298357497f6.avif" width="356" height="74">
<img src="/images/post/11000-pages-statiques/39mindeploy.db86559c1af22952417cd298357497f6.png" alt="39 minutes de temps de déploiement" loading="lazy" decoding="async" class="dark:brightness-90" width="356" height="74" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADoUlEQVR4nO1a25aDMAiMcf//Z/us7hNdlh3IRcC265yTY9UaUiZDCHZ5PB7HcRyllFJmjzf8UK8ewI3f+PLo5FaKH26FvBhcFEK4lXIet0JeDK4KIWhKuRXURgghEne63I9QQjgB1Ph5Js7aW5bFaSQ2whXCyZAt0mbPtREgQiJICiOEO37f91RSbkIUSOcjYrzsWOfatRFYhFjEjNoNy7KsJonxsGeda9dGIJ0uyeD3ua2XIITjE0jhzuYELMtSjuN4HpGt0cwyJe0tBRMzQooWMqzZaJHSa4/b4ARQH2hco9Vxfj2NEG5cI0WDdAS/Rn3y/qU9bQzovmYDqQEpQ9rtIYWP561KJ5rjUUjRzj3CoxXCzvS5LEu+QtBAZr5rZTjazEUhRrOPFm1tIbcmhBxT6/deTgihhxiLEJnloDg/o44WCfKorTe9uJQQT3VoaSc6n4EMSS1CZnEZIT2LY48DUAiKqABYk8Bzxx5OCM0s2XrSR3peO2oOqdU/VxlZL84ghBBrwyTRk36i/nsX2d4+LbR26Z4IfUHVKqFY+wEELaOSqumdxbNr2OizI7h8p77v+/M+hxaieDiSjpcN9TOCHqV5E5NeyyIStm0zSydo1tday77vpdb6Kyy2Gu8P2ehFlCo4Ut6HaGTwZhHCCeAKqbX+2bFLJaEw1oPe77+VQshZ0vmclG3boEq4I0kVGmk8S+POJyIz1OGVaqeGLI0QVGCUs10La8jhI2HLC159pxBCR0QKD18WIeu6/rmPsjV+n/cjEUGOh0rS/3Ui1xJJCN+9c3UQ+OKO7nNEb+Ise7O4/H2ItS9Baa0WvrRyvAUvkjxLNemEaPF9ph903tp/RCjFs89QQtBegmY5NakKGbLk9yMW69nnI4qYacVFSQIt0jy11bIoem5d17Ku65MYjaQeB3vM6gi1hSsEZUsctMewCEGkEDGSFPns6Hh7EKEMQhghaB+B7qMMC/XBCeVEcLXMrEszszwyYwsvv1MJAzmblDFCiFQLIudMskB2ESKVQQhVCB1RXYlIaP0NSPYj1w4vIrLWnRbCCdEKgDzDst6JWJkaClWeTqO+MpRBSEl7S/kp9FHFduQFlUZKBBGonwxlEELXEPpM5xoJI28LJTny87sjPGRp18+EAZneWvY8bGTClRCuDHRPKsfL5ifBXSEtB72bA7PH6/IHpndz8ivDTSGfTkrW7zulkE8n4QqcVsh/IyX6904p5L+RkIlvQjj5N2cxLSoAAAAASUVORK5CYII=);background-repeat:no-repeat;background-position:center;background-size:cover;">
</picture>
<figcaption>39 minutes de temps de déploiement</figcaption>
</figure>
<p>Le constat est simple. Impossible de faire du full statique sur un très grand nombre de pages. Le statique ne s'y prête pas du tout. D'autant que les futurs sites doivent atteindre le double, voire le triple en quantité de pages.</p>
<h2 id="la-regeneration-incrementale-a-la-rescousse">La régénération incrémentale à la rescousse</h2>
<p>C'est alors que la fonctionnalité de <a href="https://nextjs.org/docs/basic-features/data-fetching#incremental-static-regeneration" target="_blank" rel="noopener noreferrer">régéneration incrementale</a> nous est apparu comme la solution ultime ! Next.js est en effet capable de générer une page sous forme statique lors de la visite. Générer <em>ou</em> régénérer.</p>
<p>On peut utiliser le mode <code>fallback</code> de la fonction <code>getStaticPaths</code> avec la valeur <code>true</code> ou <code>blocking</code> pour afficher une page non générée lors de la phase de build.</p>
<p>Ensuite, vous donnez un tableau vide comme valeur <code>paths</code> de la fonction <code>getStaticPaths</code> pour ne générer aucune page lors du build. Les pages seront générées à la demande en cas de visite.</p>
<p>Résultat, un <strong>temps de génération entre deux et quatre minutes</strong> pour un site statique hybride de 10 991 articles !</p>
<figure>
<picture title="10991 articles">
<source type="image/webp" srcset="/images/post/11000-pages-statiques/10991articles.d1fa6683eef339c38d45565a0a52064d.webp" width="508" height="143">
<source type="image/avif" srcset="/images/post/11000-pages-statiques/10991articles.d1fa6683eef339c38d45565a0a52064d.avif" width="508" height="143">
<img src="/images/post/11000-pages-statiques/10991articles.d1fa6683eef339c38d45565a0a52064d.png" alt="10991 articles" loading="lazy" decoding="async" class="dark:brightness-90" width="508" height="143" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,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);background-repeat:no-repeat;background-position:center;background-size:cover;">
</picture>
<figcaption>10991 articles</figcaption>
</figure>
<figure>
<picture title="4 minutes de temps de déploiement">
<source type="image/webp" srcset="/images/post/11000-pages-statiques/4mindeploy.c523cd79283c87f56c565c1e51905018.webp" width="413" height="72">
<source type="image/avif" srcset="/images/post/11000-pages-statiques/4mindeploy.c523cd79283c87f56c565c1e51905018.avif" width="413" height="72">
<img src="/images/post/11000-pages-statiques/4mindeploy.c523cd79283c87f56c565c1e51905018.png" alt="4 minutes de temps de déploiement" loading="lazy" decoding="async" class="dark:brightness-90" width="413" height="72" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADsklEQVR4nO1c7ZLCIAwE6vu/qY9ge7+iMeazDcI57EwHrC2ELBsC3ly93+9HWZgGt+NYfMyENtqAhXcshUyGpZDJsBQyGZZCJsMNKkspc+BmP6JjEZmLD0I4B3ucfpaYWQittU7RjqoQcNZxHKLjog6dhQCKLEKuQiQESKCX9vxZWO9mkKg5fAQZUp8sIZSEfd9dpFg4G/p6EGJ95pCp7hAh0DkmI4sU2sfZe1FoBHgVMoQQKVT1IgX3i0vuuyuQCIA65yDa71CFgAGZpFAjpAFnO0IjoNZaaq0uW3oTUmv1rSEZpFhhQRr4VYdwjscltIvrtD+pPANNqcdx+DaGXlIkp3MzED8bJUMjSQtBkk247i29dtDP2kQQFQIPRC7PwLV73sF6ZqtXCbQemfnUJq8PLJtOH514MhMpTnL1qOM0NdLSU4cyEoK1yCApxEouThHiTRMjqaY0W61w5+nfQwT3Lp0A0kTxwiKjFIUQMJy7sjq3Us2sDMdDRnShvwLNH2GFREKVle9rbfVyglVaKXc2IfQzS0hUHVoMtUrpvd6EaLZo/Q0hRGqEc1aUDC8xGN8kxOqrByEYKiFYGVKGY+0DOIVxxGiG9o7bPfrz2kLhPjqBz9x9+o5EhpeYCLLe47K5EXgjRDII78zpDl0LX3Qm9iQmCi3UZrYZRegsa9/358UphC78XK5+NZ2GNjLwLfIjUH9TpyQ8Ho8PpWDUWktr7VkCadJ6cYUUDTM62gu3QjAxVCXgACChtdefe0Fsxs/SUAXPex3Z0+HZ60jUVtfhIiUCK4U7NKPrihSvpXVkJEbbEP49hFNJKS9C8Gyn6gBIocuD/6QOQMRmV9oLdUkl0Cmtcxc2UsvKRmB0/6U4d+raQk+PoPG6oO1XMM44ItN539p/eGy+/KekPfDtmTqDMgDm0Qkt8ewvpbwpBFJeawM4S4o7amd+6uiEOq+1VvZ9f0tpMTH4uW3bSmvt45I2iWcMz8BMygCIx+9Q4rVg27bnfbxw43sSEb02gdRmD2Y4syqFt9mlEKyEUspTLdLRCUcKJibD8CuYURmAD0Lo7plLVSHTkr7HxyeWYrKhtTmLMiiwzTfuCxqy8PdAyLZt7AAlUjLC1VUCZ1YGQF1DuF03l2HR97iEoOf6oY2Bs3NW1Cr8kQMeDBBAF3FP470W8mg7/0EZAHNRl3419IDbgyzoYBd17t4V2dO1KQu/SLB5dJIx6F90XC88CbGcNrNTZ7YtivWfHCbD7Zdm1y+M5Q9gJSYfp6j0FwAAAABJRU5ErkJggg==);background-repeat:no-repeat;background-position:center;background-size:cover;">
</picture>
<figcaption>4 minutes de temps de déploiement</figcaption>
</figure>
<p>Cerise sur le gâteau, en utilisant le paramètre <code>revalidate</code>, on peut régénérer la page (temps en secondes) sans relancer un build. Cela veut dire qu'en cas de mise à jour de contenu, il n'est pas nécessaire de relancer un build !</p>
<p><div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
<iframe src="https://www.youtube-nocookie.com/embed/Dj-rKHmLp5w" loading="lazy" width="640" height="360" frameborder="0" allow="accelerometer;autoplay;encrypted-media;gyroscope;picture-in-picture;fullscreen;web-share;" allowfullscreen="" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background-color:#d8d8d8;"></iframe>
</div></p>
<h2 id="la-solution-retenue">La solution retenue</h2>
<p>Bien que Nuxt.js ne propose pas de mode hybride comme Next.js pour le moment, nous sommes allés au bout du prototype. Nous avons fait la même application en mode full statique, car nous ne souhaitons pas utiliser le mode SSR (Server Side Rendering). Et comme vous devez vous en douter, nous avons rencontré les mêmes soucis de temps de build et de déploiement.</p>
<p>Nous avons hâte de découvrir plus en détail la version 3 de Nuxt.js avec le moteur Nitro, qui doit normalement permettre un mode hybride.</p>
<p>Donc pour le moment, Next.js est retenu pour la migration des premiers sites. On utilisera le mode hybride avec une génération des pages à la demande en utilisant un <code>fallback</code> en <code>blocking</code> pour être 100% SEO compatible.</p>
<p>L'idée de générer au build les <em>X</em> derniers articles pour accélérer le chargement des articles récents est évoqué. Nous n’excluons pas que certaines pages très anciennes ne soient peut-être jamais visitées et donc jamais générées.</p>
<p>Finalement, pour remplir le périmètre requis pour le projet : le mode prévisualisation, un processus de publication simple et automatique, aucune gestion de serveur et certaines pages accessibles uniquement par des abonnés ; Next.js semble être pour le moment la meilleure solution.</p>
<h2 id="prototype-prive">Prototype privé</h2>
<p>Le projet est confidentiel et le code privé. Je ne peux pas fournir les données pour faire des tests.</p>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://jamstatic.fr/2020/12/08/hebergement-statique-en-france/</id>
    <title>Héberger du statique en France, avec Matthias Dugué et Hubert Sablonnière</title>
    <published>2020-12-08T00:00:00+00:00</published>
    <updated>2021-09-10T00:00:00+00:00</updated>
    <link href="https://jamstatic.fr/2020/12/08/hebergement-statique-en-france/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<p>Dans ce deuxième épisode de <em>Génération Statique</em> Frank Taillandier et Arnaud Ligny reçoivent Matthias Dugué, en charge des relations avec les développeurs chez <a href="https://alwaysdata.com" target="_blank" rel="noopener noreferrer">Alwaysdata</a>, et Hubert Sablonnière, développeur web chez <a href="https://www.clever-cloud.com" target="_blank" rel="noopener noreferrer">Clever Cloud</a>. Avec eux nous évoquons la différence entre les plate-formes françaises et les géants américains du Cloud, quand il s’agit de déployer des sites Jamstack.</p>
<iframe src="https://anchor.fm/jamstatic/embed/episodes/Hberger-du-statique-en-France-enhc1t" height="174px" width="100%" frameborder="0" scrolling="no"></iframe>
<p>L’émergence de solutions dédiées au déploiement automatisé de sites statiques est principalement l’apanage de sociétés américaines (Netlify, Vercel, Amazon, Microsoft, Digital Ocean, etc.). La bataille a commencé outre-atlantique pour s’arroger les parts de marché, maintenant que Netlify revendique plus d’un million d’utilisateurs. Il existe des hébergeurs en France, mais pas uniquement dédié à du déploiement automatisé de statique sur des CDNs.</p>
<p>Les offres dédiées Jamstack sont un terreau d’innovation, on a vu ainsi arriver les développements atomiques (une URL pour chaque commit), les intégrations au workflow Git avec mise à disposition d’un lien de prévisualisation lors de la soumission d’une modification sur le dépôt Git, l’ajout simplifié de fonctions Lambda, etc.</p>
<p>Matthias et Hubert nous confient que le statique ne représente pas plus de 5% des projets actuellement chez les hébergeurs plus généralistes, et rappellent que le besoin applicatif représente encore leur cœur de leur activité. Les documentations respectives des ces services sont générées avec Hugo et les deux hébergeurs permettent de pousser via Git. L’automatisation et l’expérience utilisateur n’est pas aussi poussée mais le workflow est similaire. On commence néanmoins à réfléchir à l’amélioration de la DX (<em>Developer Experience</em>), via l’amélioration des outils en ligne de commande dans un premier temps.</p>
<p>L’UX n’est cependant pas le premier facteur de choix des entreprises françaises, qui veulent avant tout pouvoir héberger au plus près de leurs utilisateurs quand elles visent le marché français.</p>
<p>Il est difficile de comparer des services spécialisés qui focalisent leurs efforts sur le frein à l’adoption et qui se content de recopier des fichiers statiques. Les services plus génériques qui gèrent de l’infrastructure et des serveurs ont beaucoup d’autres aspects à gérer, ne serait-ce que pour s’assurer de la sécurité de leur infrastructure.</p>
<p>Hubert précise que des fonctionnalités très prisées comme la prévisualisation automatisée de branche Git sont possibles pour des sites statiques chez Clever Cloud à condition de connaître leur API. Ce genre de fonctionnalité est beaucoup plus complexe à mettre en place pour des applications dynamiques.</p>
<p>Matthias confesse que l’importance de la Developer Experience (DX) est grandissante dans la communauté et que le déploiement de sites Jamstack est quelque chose qu’on voit se développer aussi chez des acteurs majeurs comme Amazon Web Services, Microsoft Azure, Digital Ocean ou Cloudflare récemment.</p>
<p>Il n’est pas aisé de pour nos hébergeurs français plus modestes de rivaliser avec les géants du secteur. Force est de constater q’il est plus facile aujourd’hui de déployer un projet statique chez les "gros". Les outils en ligne de commande, les APIs, les outils de monitoring continuent d’être au centre de l’attention des hébergeurs traditionnels, c’est leur cœur de métier. Il y a bien d’autres paramètres à prendre en compte, comme par exemple la qualité et la réactivité d’un support technique à visage humain, qui accompagnent les clients pour s’assurer de répondre à leurs besoins au plus vite.</p>
<p>Les gros acteurs comme AWS ne sont pas non plus à l’abri de pannes, comme <a href="https://www.theverge.com/2020/11/25/21719396/amazon-web-services-aws-outage-down-internet" target="_blank" rel="noopener noreferrer">on a pu le voir encore recemment</a>.</p>
<p>Chez Clever Cloud, on peut déjà déployer des fonctions en mode PaaS (Platform as a Service), voire des <em>functions as a service</em> (FaaS) avec support de Web Assembly. Lors du développement de sa documentation en mode Jamstack Alwaysdata a pu expérimenté le besoin en fonctions dynamiques comme l’envoi de mail, un besoin qu’il est toujours possible de combler en développant soi-même la fonction manquante ou en se reposant sur des services et des API externes.</p>
<p>Arnaud souligne qu’il est peut-être plus rassurant pour des entreprises de pouvoir stocker leurs fonctions métier dans son Cloud privé afin de maîtriser son environnement. "La valeur ajoutée de notre métier c’est l’accompagnement et la gestion de la complexité" commente Matthias.</p>
<p>Cette complexité est aussi présente chez des acteurs comme AWS, et on est pas à l’abri pour autant d’un certain degré d’enfermement propriétaire lorsqu’on développe son application pour tourner sur ces plate-formes.</p>
<p>Les problématiques de protections des données, la volonté de ne pas dépendre d’entreprises étrangères qui ne sont pas soumises aux mêmes règles fiscales, des choix éthiques liés aux politiques énergétiques sont autant de critères qui entrent de plus en plus dans le processus de décision.</p>
<p>Le déploiement automatisé systématique c’est très pratique dans plein de cas, mais au prix de quel coût énergétique ? Il reste encore aux différents outils (CMS, plate-forme de déploiement) à donner plus de maîtrise (et de métriques) pour nous permettre de pouvoir estimer correctement l’empreinte énergétique de son <em>workflow</em> et de l’infrastructure utilisée.</p>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://jamstatic.fr/2018/08/26/recherche-plate-forme-de-deploiement-continu-parfaite/</id>
    <title>À la recherche de la plate-forme de déploiement continu parfaite</title>
    <published>2018-08-26T16:26:33+00:00</published>
    <link href="https://jamstatic.fr/2018/08/26/recherche-plate-forme-de-deploiement-continu-parfaite/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<aside class="note note-intro"><p>L'automatisation est une des composantes qui permet de bien travailler en versionnant son projet et en configurant une publication automatique. Cette bonne pratique issue du développement permet de s'assurer que tout le monde peut contribuer et que les changements seront bien publiés. DJ Walker a pris le temps de passer en revue différents services pour vous, c'est parti pour la visite guidée.</p></aside>
<p>Nous vous avons déjà parlé des <a href="https://forestry.io/blog/automate-deploy-w-circle-ci/" target="_blank" rel="noopener noreferrer">avantages du déploiement automatique,</a> et plus particulièrement de ceux des sites statiques. L'intégration continue et le déploiement continu sont la stratégie qu'on retrouve le plus souvent quand il s'agit de gérer la publication logicielle. Il existe une multitude d'options pour la mise en place de pipelines CI/CD, avec leurs forces et leurs faiblesses. Quelle est celle qui est faite pour vous ? Dans cet article, nous nous penchons sur cinq services différents  avec lesquels vous pouvez développer, tester et déployer votre code.</p>
<h2 id="la-configuration-est-cle">La configuration est clé</h2>
<p>Lors de l'évaluation de l'utilité d'un outil de CI/CD, je veux d'abord connaître la réponse à deux questions :</p>
<p><strong>Quel niveau de contrôle ai-je sur l'environnement qui va générer une nouvelle version de mon application ?</strong> Pouvoir configurer l'environnement dans lequel vous allez lancer vos étapes de build est essentiel. J'ai tendance à préférer lancer les étapes de build dans un conteneur Docker avec une image définie par mes soins. Les conteneurs sont devenus le moyen idéal pour faire tourner du code dans un environnement reproductible et isolé.</p>
<p><strong>Comment se configurent les étapes de build ?</strong>
Vous pourriez simplement lancer vos tâches à l'aide d'un gros script shell ou d'un outil robuste comme <code>make</code>. Ces scripts peuvent toutefois devenir rapidement complexes et difficiles à déboguer. Idéalement, l'enchaînement des tâches est configuré à l'aide d'un langage de configuration qui offre des abstractions plus commodes pour éviter d'avoir à écrire de multiples scripts réutilisables. Bien qu'une syntaxe de configuration intuitive et facile à comprendre soit utile, quel que soit l'outil utilisé vous devrez en apprendre les rudiments, attendez-vous donc à lire leur documentation pour comprendre comment les utiliser.</p>
<p>Peu importe comment fonctionne la configuration, l'important est d'opter pour des outils qui vous permettent de stocker et versionner votre configuration de build dans votre dépôt. Stocker votre configuration présente plusieurs avantages. Lancer le build d'un commit précédent se fera avec la configuration correspondante à cette même période. Vous pouvez travailler votre configuration sur une branche à part, et tirer parti de la portabilité qui découle de l'utilisation de la gestion de version.</p>
<h2 id="circleci">CircleCI</h2>
<picture>
<source type="image/webp" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_960/v1603617610/jamstatic/circleci_hero.becc91a4ea20845f715f9bac4cbb1884.webp 768w, /res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_960/v1603617610/jamstatic/circleci_hero.becc91a4ea20845f715f9bac4cbb1884.webp 960w" width="960" height="489" sizes="100vw">
<source type="image/avif" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_960/v1603617610/jamstatic/circleci_hero.becc91a4ea20845f715f9bac4cbb1884.avif 768w, /res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_960/v1603617610/jamstatic/circleci_hero.becc91a4ea20845f715f9bac4cbb1884.avif 960w" width="960" height="489" sizes="100vw">
<img src="/res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_960/v1603617610/jamstatic/circleci_hero.becc91a4ea20845f715f9bac4cbb1884.png" alt="" loading="lazy" decoding="async" class="dark:brightness-90" width="960" height="489" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFg0lEQVR4nO2ba5LbIBCEewbdIfe/p5nODxgYkLSSN9ldUlFXsZJtCSM+5oUT+fXrF/FoGelPD+DRqAfIYtp+egCu1fym/ND3PhaymB4gi+kBspgeIItpmaDu+u7g/lPB+0yPhSymB8hieoAspgfIn0jw14PQckF9Fc3JhbQ/2EOQcMMfZiUPkDuKIASAyAiF9Q8xtk/oAXIlKfMPEYjW4wSk8CBoFYoxfPCe/nsgZ3PmLkpEABVIbA6kQmGFQC1QKCxQHNAb+u+BnKpZRW1JoaqQJBDVZjUkSzPCjAAMgHUOb0J5gJypWoeoQtPYRBWiMgCxbBAzmAgsCwADadWK7kN5C4jI53M84tyvrvZbSIfRgaQtQVMqxwmIGWFqyDkDyACkhBEChBWj4b2n3I4uG6ZdpL8Wud3xvk9pnXsQXFUlfghUBapaQKQNaUsNjKiWZyFgZrCcPfoDyNVyUC4QjqnxB9rOCxsp/dcLxDu8aSU8esX+wDwYIE/Ox1F9g2omJVLihrqVpA3blpC2DZoUEIFVd/USBetqo6EEeAXI6q7Ebi3CjeEJJZwJZDaV8JoHfd/3Rfzgs4uPvl4ezEVaUFdNSJqQUsKWNmzbBk2pAcmSy7hrPBEjxBSiBjEB3XLkOpbsLOTUXQWR84Xcn+6+ex9DjixiBUdWfUKwkhpLVJFSAeNApE6GEVAjJBtUFKYKiFZ3xerur/3Wxl3RKYgY2EfY+2r599z5RyZxfMVKIIp8NSNU5A6nAPJWFizLZf6+ar2vW9k7jnbzINtCRJ0aRizRVfXTCVSf0qvJvRMrflI82LiKC4cnr/s0eALTE5kO5sJC2mo/vJwj3HoB2x1+Yzw/7uymLS0jX3qeLZFAJqFW6g1KTHsNZgaawchyL6MHCWAu3NYQQ/YwpFlvoy+oqRw6jDk8zLufA8h/QOwTSqJkUmYlm9IMCKBkA5KzwV4vWC5QHEyfg/MabNZB2isF4sFW81A/OKE5CEy2zNm+l5c7breMsvpzNkAMlFJjaLbBQnLOrbm1kFY2HNtEeP/nGoEMm2YRTAgWjMu9VEZDCIlHw97JRkCLyms5kmWlm5WWXxWUtoBd9rEMuVqQ5QzLuVkKaHU/696Db4MlxP1+/y1RKhi/KOa8fj6YZ2juuqw2hGtWVXXDAwwRIGcArO5LhxhdLILIliuUaiG5gvQgdKcw7BNfm8ZjSP+apoAwgGCHYbUPC31beL04FNYJpBFWVxNJqBpMe2lA1C13WgPDCqRswdtt6wAcSLQO9SYjkLlqj9bRrMQ3d9CPhrLfFh52V9csp/osZm39AISQoEnbeveF6bHC3RfdRVmwjJvPOgJxEEMDhny6jrdbSjg6FHMYHGH4vavHkea2UCEYDLUqF+nrkzU9Dr+JNAD2HgjXNrooAKme+7H+YrbLxjidx2ahzcVIdGFLQ2E9GAQCWq/gu5H7nt5kCdF1v6m9hURLSdLf2+3yxuCOYyAZfYAW+vYAvzIUn+i2gAi2HfCwudrKgIO4+gntf6BqcBhiCQ62Y8Jszm4rXj9bRfyOVWG42upH91Hxw9lL/AVtrbPuFGuTYHb123ZQ5tHcHNXqIKJ2UPCl49/qL46jzxMArzoIz7oGK5mWdxy0BzQjkGubC8Qvfqgv0zeMuQOJG1ZEcVkWsi3f0z8c2RTMHIjHkYweV/51KF+sraWlij5ZyrEmcRi+qytXFoKQ+uJjKI8GbXihV9FzCqwcYbSgHINJzC5CDPKJjyAyHiAXGl1WzIaGCn4O6kSsVP2t4egTH48PjEuNQI5S0/ga8Xx2WdP5UW3yxI5Lbbvsap74OdU9S30P4vyp9Tw61VgYHrmT09rjQs/kf0rX/5T0mdhv1fNf2hbTA2QxPUAW029wpajkU9YbNgAAAABJRU5ErkJggg==);background-repeat:no-repeat;background-position:center;background-size:cover;" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_960/v1603617610/jamstatic/circleci_hero.becc91a4ea20845f715f9bac4cbb1884.png 768w, /res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_960/v1603617610/jamstatic/circleci_hero.becc91a4ea20845f715f9bac4cbb1884.png 960w" sizes="100vw">
</picture>
<p>CircleCI est un service d'hébergement de CI/CD qui se connecte à votre dépôt et exécute vos étapes de build à chaque nouveau commit. CircleCI peut exécuter vos tâches dans une image Docker, une machine virtuelle Linux, ou une VM MacOS pour vos projets iOS.</p>
<p>La configuration se fait à l'aide d'un fichier <code>.circleci/config.yml</code> dans votre dépôt. Ce fichier indique l'image Docker à utiliser pour votre environnement de build, ainsi que les commandes à exécuter afin de générer, tester et déployer votre application.</p>
<p>CircleCI est le service utilisé par Forestry pour lancer ses tests et déployer son code. Il s'intègre sans problème avec GitHub et Bitbucket.</p>
<h3 id="on-aime">On aime</h3>
<p>Le fait que ce soit à la fois hautement configurable et simple à intégrer avec les projets GitHub.</p>
<h3 id="on-est-pas-super-fan">On est pas super fan</h3>
<p>On ne peut pas connecter de projets GitLab à CircleCI pour le moment.</p>
<aside class="note note-info"><p>Lire comment <a href="https://forestry.io/blog/automate-deploy-w-circle-ci/" target="_blank" rel="noopener noreferrer">déployer un site statique avec CircleCI</a>.</p></aside>
<h2 id="travisci">TravisCI</h2>
<picture>
<source type="image/webp" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_862/jamstatic/travis_pipeline.d33d612c32616045339fc1f55c3b5ada.webp 768w, /res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_862/jamstatic/travis_pipeline.d33d612c32616045339fc1f55c3b5ada.webp 862w" width="862" height="310" sizes="100vw">
<source type="image/avif" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_862/jamstatic/travis_pipeline.d33d612c32616045339fc1f55c3b5ada.avif 768w, /res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_862/jamstatic/travis_pipeline.d33d612c32616045339fc1f55c3b5ada.avif 862w" width="862" height="310" sizes="100vw">
<img src="/res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_862/jamstatic/travis_pipeline.d33d612c32616045339fc1f55c3b5ada.png" alt="" loading="lazy" decoding="async" class="dark:brightness-90" width="862" height="310" style=";max-width:100%;height:auto;background-image:url(data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2ODApLCBxdWFsaXR5ID0gNzUK/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAMgBkAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A9opppaQ0CuJSGikNDC4hOKM0hphOKBkmaM1FupwoAkFOpopaBXFpwpmacKYXH5optFAAaaacaaRSENzSGlIpKYkITUMjYqYioJFqJ7aFjA+TU6GqypzVlF4qIX6gSZpaaBThWxDCnCkxS4oAWiiikMWkNKaSgGNNJin4pCKYrDDTGGakIoxSsWRbKetOxRiiwBilAoFOxTJaEpaMUtArBiilFFBQlFFFAgoPSiigaG0UUUDCiiigAp9FFAmFFFFAgooooGf/2Q==);background-repeat:no-repeat;background-position:center;background-size:cover;" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_862/jamstatic/travis_pipeline.d33d612c32616045339fc1f55c3b5ada.png 768w, /res.cloudinary.com/jamstatic/image/upload/c_scale-f_auto-q_auto-w_862/jamstatic/travis_pipeline.d33d612c32616045339fc1f55c3b5ada.png 862w" sizes="100vw">
</picture>
<p>TravisCI est une solution de CI/CD hébergée qui s'intègre avec vos projets GitHub. Les builds TravisCI se configurent dans un fichier <code>.travis.yml</code> présent dans votre dépôt.</p>
<p>Les scripts de build s'exécutent dans un environnement Ubuntu qui peut être configuré à l'aide de commandes shell pendant la phase d'installation de votre build. TravisCI fournit également des abstractions pour installer <a href="https://docs.travis-ci.com/user/languages/" target="_blank" rel="noopener noreferrer">différents langages de programmation</a> dans votre environnement de build.</p>
<h3 id="on-aime-1">On aime</h3>
<p>TravisCI promet d'être gratuit à vie pour les projets open source. TravisCI travaille de pair avec Github et peut lancer automatiquement les tests d'intégration <a href="https://docs.travis-ci.com/user/pull-requests/" target="_blank" rel="noopener noreferrer">lorsqu'une pull request est ouverte</a>.</p>
<h3 id="on-est-pas-super-fan-1">On est pas super fan</h3>
<p>Avec TravisCI, vos builds doivent tourner dans un environnement Ubuntu. Vous pouvez installer Docker dans cet environnement pour récupérer des images, mais c'est la solution la plus verbeuse de toutes. De plus, vous ne pouvez utiliser TravisCI que si vos projets sont hébergés sur GitHub.</p>
<aside class="note note-info"><p><a href="https://docs.travis-ci.com/user/getting-started/" target="_blank" rel="noopener noreferrer">Guide de démarrage TravisCI</a></p></aside>
<h2 id="drone">Drone</h2>
<p>Drone est un serveur de CI/CD écrit en Go. Pour le moment vous devez héberger Drone sur votre serveur, mais une option d'hébergement dédiée est dans les tuyaux. Drone possède un système de plugin qui permet ainsi d'ajouter de nouvelles fonctionnalités.</p>
<p>Configurer un build pour Drone se fait à l'aide d'un fichier <code>.drone.yml</code>. On notera que la syntaxe de configuration de Drone est dérivée de la configuration de <code>docker-compose</code>. Si vous connaissez déjà <code>docker-compose</code>, vous serez en terrain connu avec le langage de configuration de Drone.</p>
<h3 id="on-aime-2">On aime</h3>
<p>Drone propose des <a href="http://docs.drone.io/matrix-builds/" target="_blank" rel="noopener noreferrer">matrices de builds</a> pour permettre de tester simplement votre code dans de multiples configurations, par exemple différentes versions de vos dépendances.</p>
<h3 id="on-est-pas-super-fan-2">On est pas super fan</h3>
<p>Drone est un arrivant relativement récent, et sa documentation aurait besoin d'un peu d'amour.</p>
<aside class="note note-info"><p><a href="http://docs.drone.io/getting-started/" target="_blank" rel="noopener noreferrer">Bien démarrer avec Drone CI</a></p></aside>
<h2 id="gitlab-ci">GitLab CI</h2>
<picture>
<source type="image/webp" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/c_scale-dpr_2.0-f_auto-q_auto-w_868/jamstatic/ci-cd-test-deploy-illustration_2x.0613618ae80f9bf63f844f8336d7d6b1.webp 768w, /thumbnails/1024x/res.cloudinary.com/jamstatic/image/upload/c_scale-dpr_2.0-f_auto-q_auto-w_868/jamstatic/ci-cd-test-deploy-illustration_2x.0613618ae80f9bf63f844f8336d7d6b1.webp 1024w" width="1024" height="477" sizes="100vw">
<source type="image/avif" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/c_scale-dpr_2.0-f_auto-q_auto-w_868/jamstatic/ci-cd-test-deploy-illustration_2x.0613618ae80f9bf63f844f8336d7d6b1.avif 768w, /thumbnails/1024x/res.cloudinary.com/jamstatic/image/upload/c_scale-dpr_2.0-f_auto-q_auto-w_868/jamstatic/ci-cd-test-deploy-illustration_2x.0613618ae80f9bf63f844f8336d7d6b1.avif 1024w" width="1024" height="477" sizes="100vw">
<img src="/res.cloudinary.com/jamstatic/image/upload/c_scale-dpr_2.0-f_auto-q_auto-w_868/jamstatic/ci-cd-test-deploy-illustration_2x.0613618ae80f9bf63f844f8336d7d6b1.png" alt="" loading="lazy" decoding="async" class="dark:brightness-90" width="1024" height="477" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,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);background-repeat:no-repeat;background-position:center;background-size:cover;" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/c_scale-dpr_2.0-f_auto-q_auto-w_868/jamstatic/ci-cd-test-deploy-illustration_2x.0613618ae80f9bf63f844f8336d7d6b1.png 768w, /thumbnails/1024x/res.cloudinary.com/jamstatic/image/upload/c_scale-dpr_2.0-f_auto-q_auto-w_868/jamstatic/ci-cd-test-deploy-illustration_2x.0613618ae80f9bf63f844f8336d7d6b1.png 1024w" sizes="100vw">
</picture>
<p>Si vous utilisez GitLab pour héberger votre code, vous avez déjà accès aux outils d'intégration continue de GitLab. Tout ce que vous avez à faire est d'ajouter un pipeline de CI à votre projet avec un fichier <code>.gitlab-ci.yml</code>. J'aime le fait de ne pas à avoir à parcourir une interface graphique pour configurer l'intégration continue d'un projet — si vous avez plein de projets et que vous souhaitez gérer leur intégration continue par lots, cette option vous donne des possibilités d'automatisation.</p>
<h3 id="on-aime-3">On aime</h3>
<p>GitLab CI est compatible avec toutes les versions de GitLab : vous pouvez l'utiliser sur gitlab.com ou sur votre instance GitLab hébergée. Le composant d'intégration continue de GitLab est écrit en Go, il est donc facile à exécuter sur les systèmes d'exploitation majeurs, y compris Windows et MacOS. Vous pouvez même <a href="https://gitlab.com/gitlab-org/gitlab-runner/issues/312" target="_blank" rel="noopener noreferrer">lancer vos tests d'intégration en local sur votre machine</a> !.</p>
<h3 id="on-est-pas-super-fan-3">On est pas super fan</h3>
<p>Forcément pour utiliser GitLab CI, vous devez héberger votre code source avec GitLab, le fait de pouvoir héberger vous-même votre suite logicielle devrait vous rassurer si vous avez peur d'être trop dépendant d'un service tiers.</p>
<aside class="note note-info"><p><a href="https://docs.gitlab.com/ee/ci/quick_start/" target="_blank" rel="noopener noreferrer">GitLab CI : guide de démarrage rapide</a></p></aside>
<h2 id="jenkins">Jenkins</h2>
<img src="/images/jenkins-logo.3e83aa52a384b4cc1de13db61db99231.svg" alt="Jenkins logo" loading="lazy" decoding="async" class="dark:brightness-90">
<p>Jenkins est un serveur d'intégration et de déploiement continu que vous installez et lancer sur votre propre serveur. Le projet Jenkins <a href="https://www.cloudbees.com/jenkins/about" target="_blank" rel="noopener noreferrer">a débuté en 2004</a> et aujourd'hui c'est une solution adoptée par les entreprises qui souhaitent posséder leur propre infrastructure de CI.</p>
<p>Jenkins dispose d'une foule de plugins pour l'ajout de fonctionnalités à votre serveur de CI. Les builds sont configurés dans un fichier <code>Jenkinsfile</code>, à partir du moment où vous avez <a href="https://www.jenkins.io/doc/book/pipeline/getting-started/" target="_blank" rel="noopener noreferrer">installé le plugin Pipeline</a> recommandé. Comme CircleCI, vous pouvez configurer votre environnement de build à l'aide d'une image Docker, même s'il existe également <a href="https://www.jenkins.io/doc/book/pipeline/syntax/#agent" target="_blank" rel="noopener noreferrer">beaucoup d'autres options</a>.</p>
<p>Jenkins est écrit en Java et est compatible avec les principaux systèmes d'exploitation. Les builds peuvent tourner sous environnement Linux, BSD, MacOS ou Windows.</p>
<h3 id="on-aime-4">On aime</h3>
<p>Jenkins est totalement libre d'utilisation et open source. Jenkins supporte les plugins et dispose d'une <a href="https://plugins.jenkins.io/" target="_blank" rel="noopener noreferrer">bibliothèque très fournie</a> de par sa relative longévité dans le domaine de l'intégration continue.</p>
<p>Le fait de pouvoir faire tourner ses builds sur n'importe quel système d'exploitation, y compris Windows ou Mac OS, car Jenkins est écrit en Java.</p>
<h3 id="on-est-pas-super-fan-4">On est pas super fan</h3>
<p>Pas grand-chose à redire à ce niveau : Jenkins peut faire à peu près tout ce que vous voulez ! Toutefois, il se peut que les petites équipes n'aient peut-être pas envie de devoir se coltiner la maintenance et l'hébergement de leur propre serveur d'intégration continue.</p>
<aside class="note note-info"><p><a href="https://www.jenkins.io/doc/pipeline/tour/getting-started/" target="_blank" rel="noopener noreferrer">Jenkins : Guide de démarrage</a></p></aside>
<h2 id="choisir-l-outil-qui-vous-convient-le-mieux">Choisir l'outil qui vous convient le mieux</h2>
<p>La variété d'options pour la mise en place de l'intégration et du déploiement continu a rendu l'automatisation plus accessible que jamais aux développeurs. Les projets open source qui possèdent des prérequis assez simples peuvent tirer parti de l'offre gratuite de <strong>TravisCI</strong>. Les utilisateurs de GitLab devraient se pencher sur l'utilisation de <strong>GitLab CI</strong>. Drone est une bonne solution pour ceux qui recherchent une solution simple à héberger soi-même, surtout s'ils apprécient la syntaxe de <code>docker-compose</code>. <strong>CircleCI</strong> est un bon choix pour ceux qui veulent de la souplesse mais qui ne souhaitent pas héberger leur serveur. <strong>Jenkins</strong> demandera quelques heures et de l'huile de coude, mais c'est un logiciel capable de faire beaucoup de choses.</p>]]>
    </content>
  </entry>
  <entry xml:lang="fr">
    <id>https://jamstatic.fr/2018/01/07/netlify-en-10-fonctionnalites/</id>
    <title>Netlify en 10 fonctionnalités</title>
    <published>2018-01-07T20:05:43+00:00</published>
    <link href="https://jamstatic.fr/2018/01/07/netlify-en-10-fonctionnalites/" rel="alternate" type="text/html" />
    <content type="html">
      <![CDATA[<aside class="note note-intro"><p>En l’espace de quelques années <a href="https://www.netlify.com/" target="_blank" rel="noopener noreferrer">Netlify</a> est devenu un acteur incontournable de l’écosystème Jamstack - ils sont d’ailleurs à l’origine de cette appellation - et des sites statiques. Nous sommes nous-mêmes des utilisateurs plus que satisfaits de ce service et l’article que vous lisez en ce moment est lui-même hébergé sur un de leurs CDN. Netlify c'est le genre de service qui a réussi à faire de ses clients ses premiers ambassadeurs, tant leur produit est plus que recommandable.<br>
Netlify — la contraction de <em>Net</em> et <em>Simplify</em> — a pour but de simplifier la mise en production et de fournir tous les outils modernes nécessaires à des stratégies de déploiement agiles à tout un chacun, sans avoir besoin pour cela d’être un devops confirmé. Ce n'est pas simplement une solution pour héberger vos sites statiques à moindre frais, <a href="/2017/03/17/smashing-mag-va-dix-fois-plus-vite/">le passage de Smashing Magazine à une architecture Jamstack</a> hébergée par Netlify a montré que ça pouvait aller bien au delà en faisant appel à différentes APIs et microservices.<br>
<a href="https://twitter.com/philhawksworth" target="_blank" rel="noopener noreferrer">Phil Hawksworth</a>, nouvellement en charge des relations avec les développeurs chez Netlify a publié une liste de fonctionnalités disponibles quelle que soit <a href="https://www.netlify.com/pricing/" target="_blank" rel="noopener noreferrer">la formule utilisée</a>, même celle entièrement gratuite.</p></aside>
<picture>
<source type="image/webp" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1603628397/jamstatic/paperplane.45c71f1d347b3ea3937a6a301868e0bc.webp 768w, /res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1603628397/jamstatic/paperplane.45c71f1d347b3ea3937a6a301868e0bc.webp 1000w" width="1000" height="265" sizes="100vw">
<source type="image/avif" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1603628397/jamstatic/paperplane.45c71f1d347b3ea3937a6a301868e0bc.avif 768w, /res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1603628397/jamstatic/paperplane.45c71f1d347b3ea3937a6a301868e0bc.avif 1000w" width="1000" height="265" sizes="100vw">
<img src="/res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1603628397/jamstatic/paperplane.45c71f1d347b3ea3937a6a301868e0bc.png" alt="Image d&#039;illustration" loading="lazy" decoding="async" class="dark:brightness-90" width="1000" height="265" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,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);background-repeat:no-repeat;background-position:center;background-size:cover;" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1603628397/jamstatic/paperplane.45c71f1d347b3ea3937a6a301868e0bc.png 768w, /res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1603628397/jamstatic/paperplane.45c71f1d347b3ea3937a6a301868e0bc.png 1000w" sizes="100vw">
</picture>
<h2 id="mais-d-abord-comment-demarrer-simplement">Mais d’abord, comment démarrer simplement</h2>
<p>Si vous ne connaissez pas encore ce service, sachez que c'est extrêmement simple d’héberger un site chez Netlify. Nul besoin de connaître toutes les fonctionnalités avancées pour vous lancer.</p>
<p>La manière la plus simple d’héberger un site chez Netlify est de <a href="https://www.netlify.com/docs/manual-deploys/" target="_blank" rel="noopener noreferrer">glisser-déposer un dossier</a> contenant vos fichiers dans un navigateur sur <a href="https://app.netlify.com" target="_blank" rel="noopener noreferrer">https://app.netlify.com</a>.</p>
<p><figure>
<div title="Netlify’s easy peasy drag and drop deployment" style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">
<iframe src="https://www.youtube-nocookie.com/embed/fiw2P-UAlII" loading="lazy" width="640" height="360" frameborder="0" allow="accelerometer;autoplay;encrypted-media;gyroscope;picture-in-picture;fullscreen;web-share;" allowfullscreen="" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;background-color:#d8d8d8;"></iframe>
</div>
<figcaption>Netlify’s easy peasy drag and drop deployment</figcaption>
</figure></p>
<p>Vous pouvez aussi déployer directement grâce à <a href="https://www.netlify.com/docs/cli/" target="_blank" rel="noopener noreferrer">l’utilitaire en ligne de commande</a>, mais je prefère vous renvoyer à <a href="https://www.netlify.com/docs" target="_blank" rel="noopener noreferrer">la documentation</a> pour ça, sinon vous allez croire que j'essaie de caser discrètement des éléments en plus dans ma liste. Bon OK, c'est ce que je faisais, vous m'avez démasqué. Passons maintenant à la liste à proprement parler.</p>
<h2 id="1-deploiements-atomiques-avec-publication-et-retour-en-arriere-immediats">1. Déploiements atomiques avec publication et retour en arrière immédiats</h2>
<p>Si vous avez déjà rencontré des problèmes de mise en production ou de déploiement sur des projets de développement web, vous apprécierez grandement cette fonctionnalité.</p>
<p>Chaque génération réussie sur Netlify entraîne le déploiement d’une nouvelle instance de votre site. La publication sur les différents extrémités des nœuds du réseau de CDN de Netlify et l’invalidation de cache se font automatiquement et de manière quasi-instantanée, à tel point que que je trouve inutile de mesurer combien de temps ça prend.</p>
<p>Les déploiements sont immutables. Cela signifie que chaque résultat de déploiement correspond à une version du site qui ne changera jamais. Les mises à jour créent de nouvelles instances du site pour remplacer les versions précédentes (qui sont gentiment remerciées pour leur service et mises au repos, sans être supprimées pour autant). Cela veut dire que vous pouvez revenir à tout moment à une version précédente de votre site d’un simple clic dans l’interface d’administration ou via l’API.</p>
<p>En fait, <em>tout</em> ce que vous pouvez faire dans l’interface d’administration, vous pouvez le faire aussi avec l’API. La <a href="https://open-api.netlify.com/" target="_blank" rel="noopener noreferrer">documentation de l’API</a> vous explique comment faire tout cela. Je ne compte pas même pas ça comme une fonctionnalité à part entière ici, c'est juste un petit bonus de plus !</p>
<h2 id="2-notifications-et-permaliens">2. Notifications et permaliens</h2>
<p>Une fois encore, il y a plus d’une fonctionnalité dans cet élément de ma liste, il faudra vous y faire.</p>
<p>Netlify vous permet de configurer des notifications en fonction des différents types d’évènement liés à un déploiement. Vous pouvez définir qui sera informé en cas de nouveau déploiement, ou lorsqu'un déploiement réussit, échoue, est verrouillé ou déverrouillé (je ne vous ai pas dit mais on peut aussi choisir de faire pointer la version du site vers un déploiement en particulier).</p>
<p>Vous pouvez envoyer des notifications par mail ou sur un canal Slack (je suis fan, tous mes projets ont un canal Slack dédié à l’intégration continue). Vous pouvez même décider qu'une notification va déclencher un webhook, ajouter des messages à des commits Git ou commenter sur des pull requests.</p>
<p>Ce qui rend ces notifications encore plus utiles, c'est qu'elles incluent un lien unique vers le déploiement en question. Je vous ai dit que tous les déploiements sont immutables et toujours actifs. Cela signifie que chacun d’eux possède sa propre URL pour qu'on puisse y accéder et voir ce déploiement en particulier.</p>
<p>Avoir des liens uniques pour chaque déploiement c'est énorme. Vous pouvez partager à tout moment n'importe quelle version de votre site avec votre équipe en charge des tests, votre client, ou n'importe qui d’autre. "À quoi ressemblait la version 3.2.14 du site déjà ? Tiens, voilà le lien."</p>
<p>Et cet accès instantané vous est partagé directement à chaque notification.</p>
<h3 id="3-branches-de-deploiement-et-sous-domaines">3. Branches de déploiement et sous-domaines</h3>
<p>C’est bien pratique de pouvoir déployer d’autres branches que celle de production. Pouvoir développer de nouvelles fonctionnalités dans des branches dédiées et ensuite pouvoir les tester et les passer en revue sur votre environnement de production, c'est incroyablement puissant.</p>
<p>Netlify vous permet de garder le contrôle sur la façon dont vous déployez. Vous pouvez choisir de déployer uniquement la branche de production, toutes vos branches, ou seulement certaines branches.</p>
<figure>
<picture title="Paramètres du déploiement continu.">
<source type="image/webp" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1523347027/jamstatic/controle-deploiement-continu.8dac49c750c50965299fa36764db5b71.webp 768w, /res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1523347027/jamstatic/controle-deploiement-continu.8dac49c750c50965299fa36764db5b71.webp 800w" width="800" height="489" sizes="100vw">
<source type="image/avif" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1523347027/jamstatic/controle-deploiement-continu.8dac49c750c50965299fa36764db5b71.avif 768w, /res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1523347027/jamstatic/controle-deploiement-continu.8dac49c750c50965299fa36764db5b71.avif 800w" width="800" height="489" sizes="100vw">
<img src="/res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1523347027/jamstatic/controle-deploiement-continu.8dac49c750c50965299fa36764db5b71.png" alt="Paramètres du déploiement continu" loading="lazy" decoding="async" class="dark:brightness-90" width="800" height="489" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEm0lEQVR4nO1aWw7cMAiEKvc/Y9UehH7EOBjjZ7AdtR1p19k8CZMBQxZ//vpNsADII/KIycgbSI185BKjehFtAQAEwGBTaqEaUf5GYz2G09bHy/1m/iKgsYzWjo74T4iBGhH/ICEngpUdkkrrVuKDhOwHQp0MvbwS3yGENiuDEynYhOwiQOM7hBwAqg/AGVVI/NOEaJxWB8DXCKH4tQ74JHCtjmzXtZaY+BYhggzLGV5UnVRACx8jJGCFSDAZqsrID60Z5EUvAQB+lJAFjKBw3GcVQvQdQmpOoo59Rq9TPxeZi8l50FcZjM8QYsKjNhFJPK56f1ZfiPt0I2T2JnuVMUONdW69zuwtV36yMohkJ3vCOKUMhgshy5+4dgRJgPFLrTOW38N2bN+h6d0QOBBSjckVO8eUMaqP9NE1yVA1T2uabSkj7kekcgolx+RnLd/9K0L0C5r6XmeAy3JI6ticFHtd2JCdCeC2dZqQ/G3ZnBzy56qSM3rjFd43Z6q3Y6IwqwyiujKqPgqYIsQko3kt/8htXkGGIuWY08qgwsMg951XCHOA+o1z7aD2ZtNkxO4nO7uEOG4kE3kpoxi2ChgmJGnKIceH0TOMAxGBgJpepfTrJhl7gkULa5XBmFPIzQaA+MfE8PFd+z2OLN1UEQQ3gRNAxO3KYAwRguqTbRzCKIlMDjWjF5UWOpVyO5Nt3KMMtnKIEH16tDYKxUzneeW4YXWAslUQ01PG3eERAIKjKchFq9VTGYz5OoQAAAmIEAAfNqIp3TalqdxM7IiAFAIQ4t0Ob6eTaGb2Q9hmTlCJYu7h2MXX1yHLSxlsyxQhpB4zLD523fOv6Gy5f6zSHXqMtmJs3DxQErCYjBoJHh3gH/OHcixvpE6deKyPvSqlM0wkpAJnb5+MT7KdeKTqmJ2XyPy07JC4fMu1EkpXSQs4Ga7i8uK/B5UKTJ5lkcgjtdELLxTiB60KeXuIot6JO3jUFSnk0xrHTqV4KIOxSSE2Yo2v5/vAbZDZSmIe2fViEomSEZ2DR9NeKrlONWOjIozrW/Murgs4b6nM745sEqBJgTC7JMPijtlUCZe/+OcQe0cASd5Y7Pcmci7uri0hBT4QEClsf+/LYwp5BYTVud7GE0sBCJ/lhhN7lMH4jEKKU8nkQ8nKI6QsxkGF8AwllzpZv+JQm6P4I6mJBmufEWUwjikkTZq5g5vK2KiOhIwFU26J8zlETm1ln6ihjB18ZF2B3m6xPn4A13wD4j20U1HVHUkvKyrDp7fVi4cU2bxbp5LLseqvA9UU1mggkdiXpEDUa9ituVz7p+KwN8pgbFaI2Vy3q2N4yIikbFZHrEGli6xXiQDg5cd9CukFxUD1jPRkkGMFIjcTQYfWR/oerjyaQzSyKAagFLLdpCe8ynI9wPbcO39+TyEBJJVCu6sPZQs8bavw35fQPrm3e7rwUwphWOHqGBvClqSnBS3Pzfl1q0LeOtaeEuwBZgtrsFEh867kSvlU78p6bdzvtTH/blGIV8jBIJGdvORkYK0UeY0NCnmrDPWe5FDc0i/Uxr3Wd8T6XtYC553MJY8Raxz3B6MXJ+CVc6xRAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:center;background-size:cover;" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1523347027/jamstatic/controle-deploiement-continu.8dac49c750c50965299fa36764db5b71.png 768w, /res.cloudinary.com/jamstatic/image/upload/dpr_auto-f_auto-q_auto/v1523347027/jamstatic/controle-deploiement-continu.8dac49c750c50965299fa36764db5b71.png 800w" sizes="100vw">
</picture>
<figcaption>Paramètres du déploiement continu.</figcaption>
</figure>
<p>Une fois déployée, chaque branche sera accessible depuis un sous-domaine généré en fonction du nom de la branche utilisée. Ça donne un truc comme ça :</p>
<p><code>ma-branche--mon-site.netlify.com</code></p>
<p>Grâce à la <a href="https://www.netlify.com/blog/2017/12/19/an-easier-way-to-manage-domains-and-dns-on-netlify/" target="_blank" rel="noopener noreferrer">gestion des DNS de Netlify</a>, vous pouvez aussi choisir d’affecter vos propres sous-domaines à des branches. Vous avez une liberté totale pour définir comment les différentes branches vont pousser du contenu sur les différents sous-domaines de votre site.</p>
<h3 id="4-tests-a-b-tests-a-b-avec-plusieurs-variantes-ou-tests-separes">4. Tests A/B, Tests A/B avec plusieurs variantes ou tests séparés</h3>
<p>Il existe plusieurs variantes et termes pour désigner les tests A/B, Netlify appelle cela le <em>split testing</em> parce que c'est ce que ça fait : découper le trafic de votre site entre les différentes branches de votre choix.</p>
<p>Vous pouvez partager le trafic de votre site en autant de branches que vous le souhaitez et définir le pourcentage de trafic attribué à chacune des branches.</p>
<figure>
<picture title="La configuration du split testing chez Netlify.">
<source type="image/webp" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347053/jamstatic/split-testing.ccea9f0c6cf3ce5f47515ad31a910cdd.webp 768w, /res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347053/jamstatic/split-testing.ccea9f0c6cf3ce5f47515ad31a910cdd.webp 800w" width="800" height="400" sizes="100vw">
<source type="image/avif" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347053/jamstatic/split-testing.ccea9f0c6cf3ce5f47515ad31a910cdd.avif 768w, /res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347053/jamstatic/split-testing.ccea9f0c6cf3ce5f47515ad31a910cdd.avif 800w" width="800" height="400" sizes="100vw">
<img src="/res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347053/jamstatic/split-testing.ccea9f0c6cf3ce5f47515ad31a910cdd.png" alt="La configuration du split testing chez Netlify" loading="lazy" decoding="async" class="dark:brightness-90" width="800" height="400" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,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);background-repeat:no-repeat;background-position:center;background-size:cover;" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347053/jamstatic/split-testing.ccea9f0c6cf3ce5f47515ad31a910cdd.png 768w, /res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347053/jamstatic/split-testing.ccea9f0c6cf3ce5f47515ad31a910cdd.png 800w" sizes="100vw">
</picture>
<figcaption>La configuration du split testing chez Netlify.</figcaption>
</figure>
<p>Cette fonctionnalité me bluffe. Elle rend les différents types de tests A/B vraiment trivial à mettre en place. Si vous tirez déjà parti du déploiement de branches, il n'y a pas grand-chose à faire de plus.</p>
<p>Vous me direz que beaucoup d’entreprises peuvent vous vendre des services de tests A/B pour votre site. J'ai été un grand adepte de ces services. Mais la plupart, si ce n'est tous, vont faire ça en magouillant un peu à coup de JavaScript une fois votre site servi et chargé dans le navigateur.</p>
<p>Vu le mal qu'on se donne, en tant de développeurs web, à minimiser l’impact qu'ont les ressources externes en JavaScript sur le rendu de nos sites, c'est vraiment bête de réduire tous ces efforts à néant en introduisant un ralentissement de la performance dans notre rendu.</p>
<p>De plus, si la performance des différentes variantes que nous testons diffère de la production, alors comment pouvons nous bénéficier d’une comparaison vraiment fiable de la performance de ces options ? Les tests sont faussés.</p>
<p>L'approche de Netlify c'est de servir chaque variante de test directement depuis son CDN optimisé. Tous les trucs super intelligents comme la répartition du trafic, les variantes de tests et l’assurance de la consistence d’utilisation se passent au niveau du CDN - sur les nœuds les plus proches possibles de l’utilisateur.</p>
<p>Chaque variante de test est servie et rendue comme sur la "production". Fantastique.</p>
<h3 id="5-commandes-de-generation-contextuelles">5. Commandes de génération contextuelles</h3>
<p>Non seulement vous pouvez déployer différentes branches, mais vous pouvez aussi personnaliser le contenu et les environnements de vos déploiements en fonction de différents contextes comme la préproduction, la qualification et la production.</p>
<p>Il fut un temps où c'était compliqué de mettre en place différents environnements de déploiement pour votre projet. Netlify rend les choses plus simples que je ne l’ai jamais vu. Vous pouvez créer <code>staging.votre-projet.com</code> et <code>testing.votre-projet.com</code> et tout ce que vous voulez à côté de votre <code>www.votre-projet.com</code> simplement à l’aide d’un peu de configuration. Et ils tournent tous sur des environnements identiques, c'est très important pour la fiabilité du développement et la stratégie de déploiement.</p>
<p>Vous pourriez vouloir lancer des commandes de génération légèrement différentes en fonction de l’environnement sur lequel vous déployez, ou générer une fonctionnalité pas encore disponible en production. Vous pouvez faire tout cela en configurant différents contextes de déploiement.</p>
<p>Cela vous permet de faire des choses comme générer la production avec <code>npm run build:prod</code> et une branche de fonctionnalité avec <code>npm run build:ma-fonctionnalite</code>. Pratique !</p>
<p>Cela se paramètre à l’aide d’un fichier de configuration <code>netlify.toml</code> qu'on peut laisser à la racine du projet pour accéder à toutes sortes d’options pour vos déploiements sur Netlify.</p>
<p>Par exemple :</p>
<p><figure>
<script src="https://gist.github.com/philhawksworth/61715131c5d229c06f161e82e93db803.js" title="Exemple de fichier de configuration de site netlify.toml.">
<figcaption>Exemple de fichier de configuration de site netlify.toml.</figcaption>
</figure></p>
<p>Vous trouverez plus d’informations à ce sujet dans la <a href="https://www.netlify.com/docs/continuous-deployment/#deploy-contexts" target="_blank" rel="noopener noreferrer">documentation des contextes de déploiement</a>.</p>
<h3 id="6-gestion-des-certificats-ssl-et-ssl-gratuit-avec-let-s-encrypt">6. Gestion des certificats SSL et SSL gratuit avec Let’s Encrypt</h3>
<p>Même si ce n'est pas forcément évident à première vue, il est très important de servir les sites web en HTTPS plutôt qu'en HTTP, même si ce sont des sites servis en statique.</p>
<p>Un des créateurs de Netlify explique tout ça très bien en donnant <a href="https://www.netlify.com/blog/2014/10/03/five-reasons-you-want-https-for-your-static-site/" target="_blank" rel="noopener noreferrer">cinq bonne raisons de servir votre site en HTTPS</a> et Google a également publié de bons articles qui expliquent <a href="https://developers.google.com/web/fundamentals/security/encrypt-in-transit/why-https" target="_blank" rel="noopener noreferrer">pourquoi HTTPS est si important</a>, quelle que soit l’architecture utilisée.</p>
<p>Vous êtes convaincu et vous voulez acheter un certificat numérique ? N'ayez crainte, l’opération peut être bien plus simple que vous ne pourriez le penser.</p>
<p>Netlify rend triviale la configuration de <a href="https://www.netlify.com/docs/ssl/#https-on-custom-domains" target="_blank" rel="noopener noreferrer">HTTPS sur vos noms de domaines</a>.Vous avez le choix entre la gestion automatisée de SSL, la gestion personnalisée de SSL et même une adresse IP dédiée SSL pour les entreprises qui en ont besoin.</p>
<p>La plupart des gens peuvent se contenter de la gestion automatisée grâce aux certificats offerts par <a href="https://www.netlify.com/blog/2016/01/15/a-worlds-first.-free-ssl-with-lets-encrypt/" target="_blank" rel="noopener noreferrer">Let's Encrypt</a>. La configuration se fait en un clic (bon ok peut-être trois, mais ça m'a pris moins d’une minute). En plus le certificat est renouvelé automatiquement, pour que vous n'ayez pas à le faire tous les ans.</p>
<figure>
<picture title="La configuration de SSL chez Netlify avec renouvellement automatique des certificats grâce à Let’s Encrypt.">
<source type="image/webp" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347047/jamstatic/ssl-config.f8ab94aed6f6162b9010cc631cfbe83c.webp 768w, /res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347047/jamstatic/ssl-config.f8ab94aed6f6162b9010cc631cfbe83c.webp 800w" width="800" height="533" sizes="100vw">
<source type="image/avif" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347047/jamstatic/ssl-config.f8ab94aed6f6162b9010cc631cfbe83c.avif 768w, /res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347047/jamstatic/ssl-config.f8ab94aed6f6162b9010cc631cfbe83c.avif 800w" width="800" height="533" sizes="100vw">
<img src="/res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347047/jamstatic/ssl-config.f8ab94aed6f6162b9010cc631cfbe83c.png" alt="La configuration de SSL chez Netlify avec renouvellement automatique des certificats grâce à Let’s Encrypt" loading="lazy" decoding="async" class="dark:brightness-90" width="800" height="533" style=";max-width:100%;height:auto;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAAAyCAYAAACqNX6+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADPUlEQVR4nO2aa3KFIAyFkw7732Sn60h/CBIgICIEZDwz7VXwciWHD3mIv39/BIpCQAA4fpJ6/zLa8tmnTXaZ0hfYd9g9Rpdj8h2eiWnRxfu017NPl27ulDNKPXwRA0JRRnzOM8iWgvzcl+6ziV1uA0pUV4cK435qynmjjhDxwNrzW2WkR6O1BCHdVSIjyFuHDKftCJHICMMWB10qIz3S0l6EFMgge4wuYzEynLYhhIQDiYxSIGeS4bQXIU43yMBFyHDahhAA364J+ByHjkBmIhmOveaR4bQdIS6kCOHEE/EwBQGB8Gj64eMGp5LhtJ0hTjyAgTmnGQiE/BprRIegPlE3Q/yCyHoi8cSn+ntntUAEVCTD6bEh0nrPqsYApOYgACOFLECRMYr398iQczEO/S0T0VTkayVRc9qAbDRWal4DzNr2GVKrYBDAEg9ywmGyRkPrbginJafuy+4dlAwCeOJpjDsf1431MYR4OwOdpjRQ0gjNPWtGV+2RIW5CTEmKvMlDK6KxmB7P1HcOMUafGuqydFLe+nln/5WY8daHeoviis6mTjJDS0sYsorELioepwyeKE41JB4hz3rml4iI3y4ZrUmGrNNJof0rPiOYEaNJmWLISmQkZmQoGE2KK1HZkDXIiJ8RCHUrDBqkqBoym4w4cFgyYxIpSobMI0MKWRLUhldBk7I6kWJUhtgT/Lg24iADrwKpTIp560yaK1eDbDoKuS0tfAApr54Yliqe5AXD2ob9DSVSjMJcp7uqFv3EgNuV6KKTc0lZkpCaiki9TlpGOOXG8hV1GkyKqRp/L6zS7PoqdNdV9y5WRakDKUsR0tw2yn1QclokhfjOoN+6Dd84dV1frlOsuS9Zl4TMXgqvVZ6UXF7Ynfm9zsMRukFGOoBoJ2UJQrp1mzdJiRWa4tN4+eIvdCRFJITCf69SiZQaRa9rPPvtBlIm74cMGlB0KDduinUlpv3jXVIMIkZv8YW3MiJk7+Punp6QMmk/5N1D7Wu1k2LOTHEtHGH/9jxOLaTkCfm86KOIhitSlhj27q47pHyGaKmSFMGQr68apRpSPkK0dUGKCbM+MjRUIsW4Cz4rlJUhxXx2zJNEyj+I7OOF6TaongAAAABJRU5ErkJggg==);background-repeat:no-repeat;background-position:center;background-size:cover;" srcset="/thumbnails/768x/res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347047/jamstatic/ssl-config.f8ab94aed6f6162b9010cc631cfbe83c.png 768w, /res.cloudinary.com/jamstatic/image/upload/f_auto-q_auto/v1523347047/jamstatic/ssl-config.f8ab94aed6f6162b9010cc631cfbe83c.png 800w" sizes="100vw">
</picture>
<figcaption>La configuration de SSL chez Netlify avec renouvellement automatique des certificats grâce à Let’s Encrypt.</figcaption>
</figure>
<h3 id="7-lancer-des-tests-avec-l-integration-continue-de-netlify">7. Lancer des tests avec l’intégration continue de Netlify</h3>
<p>Une des choses qui fait que Netlify est très puissant c'est qu'en plus d’un réseau optimisé de CDN pour héberger vos sites, ils fournissent aussi un environnement de conteneurs pour lancer vos builds. Cela signifie que n'importe quel <em>build</em> lancé dans votre environnement de développement ou sur un serveur d’intégration continue peut en fait être directement exécuté sur Netlify.</p>
<p>Si votre script de déploiement inclus des tests, Netlify les exécutera pour vous et qu'il en résulte un succès ou un échec, <a href="https://www.netlify.com/blog/2016/07/18/shiny-slack-notifications-from-netlify/" target="_blank" rel="noopener noreferrer">vous serez prévenus</a> de l’issue finale.</p>
<p>Remplacer mon infrastructure d’intégration continue, mon infrastructure d’hébergement ainsi que mes scripts de déploiement par un seul et unique service ? Je suis partant.</p>
<h3 id="8-gestion-des-formulaires">8. Gestion des formulaires</h3>
<p>Si votre site a besoin d’intégrer des formulaires, vous vous êtes peut-être dit par le passé que ce n'était pas compatible avec un site statique. Pourtant Netlify propose une solution simple pour régler ce problème.</p>
<p>Si vous avez besoin d’ajouter un formulaire sur votre site qui récolte des informations entrées par vos utilisateurs, Netlify peut s'en charger pour vous. En ajoutant un simple attribut au code HTML de votre formulaire, <a href="https://www.netlify.com/docs/form-handling/" target="_blank" rel="noopener noreferrer">Netlify va exposer le point d’accès qui va bien pour le formulaire</a> et rendre toutes les données postées accessibles pour vous depuis l’interface d’administration et l’API.</p>
<p>Comme les données sont accessibles via l’API, vous pouvez accéder à ces contenus lors de l’étape de génération afin de les utiliser sur votre site. Avec un peu d’imagination, cela ouvre pas mal de possibilités intéressantes.</p>
<p>Les <a href="https://www.netlify.com/docs/form-handling/#receiving-submissions" target="_blank" rel="noopener noreferrer">soumissions de formulaires</a> peuvent aussi déclencher des notifications. Tout devient alors possible : des messages Slack, des webhooks ou même des <a href="https://zapier.com/app/dashboard" target="_blank" rel="noopener noreferrer">intégrations Zapier</a>.</p>
<h3 id="9-redirections-reecritures-et-proxy">9. Redirections, réécritures et proxy</h3>
<p>N'oubliez aucune URL en route ! En ajoutant un fichier <code>_redirects</code> dans votre dossier déployé nous avez accès à tout plein d’options de configuration en ce qui concerne les redirections et les réécritures d’URLs. Elles sont déclenchées sur les nœuds finaux des CDN, ce qui les rend particulièrement rapides et efficientes.</p>
<p>Vous avez aussi la possibilité de préciser le code de réponse HTTP dans le fichier <code>_redirects</code>, ce qui vous permet de personnaliser vos erreurs 404 ou même de rendre d’autres ressources accessibles au travers d’un proxy.</p>
<p>Voici un exemple :</p>
<p><figure>
<script src="https://gist.github.com/philhawksworth/7b12a0785266f8dcf1960d2df93dfc59.js" title="Un exemple de fichier de configuration _redirects.">
<figcaption>Un exemple de fichier de configuration <code>_redirects</code>.</figcaption>
</figure></p>
<p>Vous voulez des <em>splats</em>, des <em>placeholders</em>, des paramètres de requêtes et plus encore ? Jetez un œil à la <a href="https://www.netlify.com/docs/redirects/" target="_blank" rel="noopener noreferrer">documentation sur les redirections</a>.</p>
<h3 id="10-controle-des-entetes-personnalises">10. Contrôle des entêtes personnalisés</h3>
<p>Celui là ravira toux ceux qui ont hébergé leur site sur GitHub Pages et qui ont couru après le score parfait sur <a href="https://developers.google.com/web/tools/lighthouse/" target="_blank" rel="noopener noreferrer">Lighthouse</a> ou <a href="https://developers.google.com/speed/pagespeed/insights/" target="_blank" rel="noopener noreferrer">Page Speed Insights</a>. Vous avez tout bien fait, mais vous avez besoin de pouvoir définir vos entêtes de cache HTTP pour bénéficier de cette dernière optimisation de performance qui vous manque tant… malheureusement vous n'en avez pas la possibilité.</p>
<p>Maintenant vous l’avez.</p>
<p>Netlify utilise pour cela une approche similaire à celle de la gestion des redirections que nous venons de voir plus haut. Grâce à un fichier <code>_headers</code> déposé dans votre dossier de déploiement, vous pouvez ainsi contrôler les entêtes HTTP de toutes les ressources de votre site.</p>
<p>Et vous pouvez faire bien plus que contrôler les entêtes de cache. La possibilité de configurer vos entêtes à l’aide de fichier <code>_headers</code> vous permet de définir votre politique de sécurité en matière de contenu (CSP), vos options <code>X-Frame</code> et plein d’autres choses toutes aussi importantes pour vous aider à contrôler la sécurité de votre site.</p>
<p><figure>
<script src="https://gist.github.com/philhawksworth/d1deda75c8bc3d025e7d62639f904222.js" title="Un exemple de fichier de configuration _headers.">
<figcaption>Un exemple de fichier de configuration <code>_headers</code>.</figcaption>
</figure></p>
<p>Bénéficier d’une telle granularité pour ce type de contrôle est souvent bien plus complexe que cela. Il me semble que cette fonctionnalité rend accessible le contrôle de la sécurité à davantage de développeurs.</p>
<h2 id="ca-en-fait-10-mais-ce-n-est-pas-tout">Ça en fait 10, mais ce n'est pas tout</h2>
<p>J'aurais pu mentionner bien d’autres choses, mais vous ne voulez pas d’une liste interminable.</p>
<p>Plus je creuse, plus je découvre qu'il est possible de contrôler pas mal de choses. Il est important que les développeurs puissent bénéficier d’une solution simple pour mettre en ligne leurs sites statiques, et comme l’écosystème de la Jamstack évolue en permanence, les possibilités sont de plus en plus grandes.</p>
<p>Ça vaut le coup de garder un œil sur Netlify, d’autres fonctionnalités prometteuses sont actuellement testées par des alpha-testeurs enthousiastes.</p>
<p>Vous pouvez <a href="https://twitter.com/Netlify" target="_blank" rel="noopener noreferrer">suivre Netlify sur Twitter</a> pour rester informé des nouvelles fonctionnalités, plonger dans la <a href="https://www.netlify.com/docs/" target="_blank" rel="noopener noreferrer">documentation</a>, ou prendre connaissance des <a href="https://www.netlify.com/open-source/" target="_blank" rel="noopener noreferrer">nos projets open source</a> pour étendre les possibilités de l’écosystème <a href="https://www.jamstack.org/" target="_blank" rel="noopener noreferrer">Jamstack</a>.</p>]]>
    </content>
  </entry>
</feed>
