<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media = "http://search.yahoo.com/mrss/" version="2.0">
  <channel>
    <title>Journal de bord on Limawi Blog</title>
    <link>https://blog.limawi.io/fr-fr/series/journal-de-bord/</link>
    <image>
      <url>https://blog.limawi.io/logo.png</url>
      <title>Journal de bord on Limawi Blog</title>
      <link>https://blog.limawi.io/fr-fr/series/journal-de-bord/</link>
    </image>
    <description>Du cloud, du devops et des outils pour tout ça.</description>
    <language>fr-fr</language>
    <lastBuildDate>Fri, 05 Feb 2021 18:00:00 +0000</lastBuildDate><atom:link href="https://blog.limawi.io/fr-fr/series/journal-de-bord/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Journal de bord 05 février 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210205-journal-de-bord/</link>
      <pubDate>Fri, 05 Feb 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210205-journal-de-bord/</guid>
      <description>On passe de cookiecutter à copier.</description>
      <content:encoded><![CDATA[<p>Parceque le mélange <code>json</code>, <code>yml</code> et <code>jinja</code> dans le code, ça va 5 minutes.</p>
<p>Avec <code>copier</code>, on a tout en yml. Ce que je souhaite :</p>
<ul>
<li>pouvoir être <code>DRY</code>(Don’t repeat yourself)</li>
<li>avoir un mécanisme d’héritage ou apparenté qui me permette d’appliquer plusieurs templates en même temps</li>
<li>ça soit intégrable en CI avec immutabilité</li>
<li>avoir la possibilité de créer des sous-templates (par exemple pour gérer les roles d’une collection ansible)</li>
</ul>
<p>Du coup, j’ai conçu un petit script en python pour étendre <code>copier</code> en m’appuyant sur la doc de <code>copy</code>:</p>
<p>
<a href="https://copier.readthedocs.io/en/stable/api/" target="_blank">https://copier.readthedocs.io/en/stable/api/</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 04 février 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210204-journal-de-bord/</link>
      <pubDate>Thu, 04 Feb 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210204-journal-de-bord/</guid>
      <description>Aujourd’hui on coupe des cookies.</description>
      <content:encoded><![CDATA[<p>On va utiliser <code>cookiecutter</code> pour générer tous nos templates.</p>
<p>Avec son système de sous-répertoires, on va faire nos diverses variations.</p>
<p>
<a href="https://cookiecutter.readthedocs.io/en/1.7.2/advanced/directories.html" target="_blank">Organizing cookiecutters in directories (1.7+) - cookiecutter 1.7.2 documentation</a></p>
<p>Le problème avec cookiecutter c’est que pour l’instant il n’existe pas de méthodes pour générer une arborescence de dossiers à partir d’une liste.</p>
<p>Imaginons un repo ansible, on voudrais pouvoir définir des roles, et pour chacun des roles, on voudrait définir le dossier de tests molecule et le playbook de base qui va avec.</p>
<p>Du coup, on aurait une sorte de sous-template comme ça :</p>
<pre><code>roles     -&gt;role1
          -&gt;role2
molecule  -&gt;role1
          -&gt;role2
playbooks -&gt;role1
          -&gt;role2
</code></pre>
<p>Donc, on voudrait générer ça à partir d’une liste:</p>
<pre><code>{
  roles: [
    role1
    role2
  ]
}
</code></pre>
<p>On s’appuit sur l’idée de base ici :</p>
<p>
<a href="https://igorbasko01.github.io/cookiecutter/python/2020/02/04/cookiecutter-sub-folders.html" target="_blank">Creating cookiecutter multiple sub-folders from template</a></p>
<p>mais il y a des trucs qui ne fonctionnent pas.</p>
<p>On doit se battre en plus avec le fait que <code>cookiecutter</code> a des fichiers de config en <code>json</code> et en <code>yml</code>.</p>
<p>Ça rend les choses compliquées (et instables) dés qu’on a des tableaux complexes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 02 février 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210202-journal-de-bord/</link>
      <pubDate>Tue, 02 Feb 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210202-journal-de-bord/</guid>
      <description>On continue toujours la monorepoysation.</description>
      <content:encoded><![CDATA[<p>L’idée de ce soir est de coder les containers nécessaires au bon fonctionnement de l’intégration continue.</p>
<p>Donc :</p>
<ul>
<li>renovate</li>
<li>semantic-release</li>
</ul>
<p>On va les coder simplement sans fioritures et on les refactorera une fois qu’on aura retrouvé tous nos outils de CI.</p>
<p>On va d’abord coder le role ansible <code>container</code>. Ce role aura la charge de faire toutes les tâches nécessaires à la création d’un container avec ansible.</p>
<p>C’est lui qui installe l’<code>entrypoint</code> ou les dossiers selon la <code>XDGBase Directory Spec</code>.</p>
<p>Il paramètre aussi l’ensemble des déclarations de l’image container résultante.</p>
<p>On cherche aussi à utiliser un inventaire en <code>yml</code> avec <code>molecule</code> au lieu du fichier hosts en <code>INI</code>.</p>
<p>Cela afin d’avoir une syntaxe semblable sur l’ensemble du projet.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 01 février 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210201-journal-de-bord/</link>
      <pubDate>Mon, 01 Feb 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210201-journal-de-bord/</guid>
      <description>On continue la formalisation du projet.</description>
      <content:encoded><![CDATA[<p>L’idée est d’être sec, pardon <code>DRY</code>. Il y a donc un repo central <code>coppint</code> constitué de templates.</p>
<p>Je voudrais automatiser la création de README selon un template et la création de la doc.</p>
<p>Pour cela, on va utiliser le paquet</p>
<p>
<a href="https://github.com/kefranabg/readme-md-generator#readme" target="_blank">kefranabg/readme-md-generator</a></p>
<p>et un template selon ce paquet pour générer automatiquement notre README.</p>
<p>Ce générateur en nodejs me pose quand même quelques soucis. Il n’est pas maintenu depuis 2 ans et est vraiment spécifique à nodejs.</p>
<p>Du coup, stand-by et on va réfléchir au truc.</p>
<p>la génération de doc pour shell semble se faire avec</p>
<p>
<a href="https://github.com/reconquest/shdoc" target="_blank">https://github.com/reconquest/shdoc</a></p>
<p>sans problèmes.</p>
<p>Reste à tester</p>
<p>
<a href="https://github.com/thegeeklab/ansible-doctor" target="_blank">https://github.com/thegeeklab/ansible-doctor</a></p>
<p>et</p>
<p>
<a href="https://www.npmjs.com/package/doctoc" target="_blank">https://www.npmjs.com/package/doctoc</a></p>
<p>Passons maintenant à la mise en place d’un environnement <code>nodejs</code> pour pouvoir restaurer les containers <code>renovate</code> et <code>semantic-release</code>.</p>
<p>C’est bon à l’exception de Gitlab qui met n’importe quoi comme nom de commit, comme d’habitude.</p>

<figure class="figure text-center">
  <img src="https://blog.limawi.io/fr-fr/posts/stream-20210201-journal-de-bord/images/relations-monorepos.png" class="figure-img img-fluid rounded" alt="Les relations prévues entre les monorepos de Limawi.">
  <figcaption class="figure-caption"><p>Relations monorepos</p>
    <small>Les relations prévues entre les monorepos de Limawi.</small>
  </figcaption>
</figure>

]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 29 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210129-journal-de-bord/</link>
      <pubDate>Fri, 29 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210129-journal-de-bord/</guid>
      <description>La refactorisation continue.</description>
      <content:encoded><![CDATA[<p>On reprend à la base. C’est à dire le projet <code>ansible-environments</code> et son pendant <code>inspec</code>.</p>
<p>Le projet <code>ansible-environments</code> c’est la collection ansible qui fournit les environnements de base des langages sécurisés et paramétrés pour la prod.</p>
<p>Son pendant <code>Inspec</code> ce sont les profils Inspec chargés de tester ces environnements.</p>
<p>Nous avons aussi créé un projet qui centralise les artefacts nécessaires à tous les repos.</p>
<p>Ces artefacts sont en vrac :</p>
<ul>
<li>CONTRIBUTING.md</li>
<li>LICENSE.md</li>
<li>Des gitlab-ci.yml de lint et release</li>
<li>Des presets de release</li>
<li>Des presets de renovate</li>
</ul>
<p><code>security.txt</code> a été oublié, il faudra l’ajouter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 28 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210128-journal-de-bord/</link>
      <pubDate>Thu, 28 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210128-journal-de-bord/</guid>
      <description>Encore, encore le docker-compose et monorepoysation.</description>
      <content:encoded><![CDATA[<p>On va modifier la structure du projet pour se rapprocher des collections ansible. Et on va faire de la monorepoysation parce que j’aime bien les néologismes imprononçables.</p>
<p>Pourquoi ?</p>
<p>Parce que je suis à peu près à 80 repos git actifs pour le projet de forge logicielle.</p>
<p>C’est trop, ça introduit des instabilités partout et une capacité de progression réduite (PR en attentes…)</p>
<p>Pourquoi je n’ai pas monorepoysé plus tôt ?</p>
<p>Parce que je crains le repo fourre-tout et les monorepos ont tendance à aller dans cette direction.</p>
<p>Du coup, on va réfléchir nos monorepos.</p>
<p>Je propose donc:</p>
<ul>
<li>monorepo services de la forge logicielle</li>
<li>monorepo outils de la forge logicielle.</li>
<li>monorepos cucumber et Inspec correspondants (donc 4 monorepos)</li>
</ul>
<p>Les services de la forge logicielle sont les containers qui tournent en permanence (Gitea, Concourse-ci, etc…)</p>
<p>les outils de la forge logicielle sont les containers appellés pour résoudre une tâche (ansible, inspec, etc…)</p>
<p>Il y a un container qui fonctionne comme un service mais qui est un outil (plus une sorte de container side-car), c’est renovate. Donc lui, je vais le gérer dans le monorepo des outils.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 26 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210126-journal-de-bord/</link>
      <pubDate>Tue, 26 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210126-journal-de-bord/</guid>
      <description>Encore le docker-compose de GoHarbor.</description>
      <content:encoded><![CDATA[<p>On continue à débugger. C’est un peu long car GoHarbor a axé sa stratégie d’install sur un script d’installation et non sur une doc complète.</p>
<p>Je passe donc mon temps à chercher des infos dans le code et faire divers tests pour trouver les paramètres que GoHarbor accepte.</p>
<p>Portal m’a fait ressurgir des limbes de mon cerveau la notion d’héritage de templates <code>jinja2</code> au sein d’ansible.</p>
<p>Avec ça je peux modifier le template vhost de base de nginx avec une variante locale (spécifique à GoHarbor).</p>
<p>Dans le cadre des collections ansible, il peut être nécessaire d’installer les collections dans le projet lui-même en exécutant une commande du type :</p>
<pre><code>ansible-galaxy collection install -r requirements.yml -p ./collections
</code></pre>
<p>Cela permet d’utiliser des chemins relatifs dans la déclaration extends des templates <code>jinja2</code>.</p>

<figure class="figure text-center">
  <img src="https://blog.limawi.io/fr-fr/posts/stream-20210126-journal-de-bord/images/heritage-template-ansible.png" class="figure-img img-fluid rounded" alt="Quel template est pris par la task ?">
  <figcaption class="figure-caption"><p>Héritage de templates ansible</p>
    <small>Quel template est pris par la task ?</small>
  </figcaption>
</figure>

]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 25 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210125-journal-de-bord/</link>
      <pubDate>Mon, 25 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210125-journal-de-bord/</guid>
      <description>On continue le docker-compose de GoHarbor.</description>
      <content:encoded><![CDATA[<p>On a mis en place le mTLS et les schémas SQL. On continue.</p>
<p>L’init passe si on n’oublie pas de paramétrer le répertoire <code>container-init</code> qui contient le fichier <code>LOCK</code> déclenchant le démarrage des autres containers.</p>
<p>Paramétrer veut dire le créer et lui affecter le <code>USER</code> du container init.</p>
<p>Maintenant, on débugge les valeurs manquantes dans les fichiers de config de GoHarbor.</p>
<p>GoHarbor a besoin de 3 interfaces publiques:</p>
<ul>
<li>celle de core qui gère l’accès à l’API REST</li>
<li>celle de portal qui gère l’accès à l’interface web de gestion</li>
<li>celle du registry qui gère les push et pull des images</li>
</ul>
<p>Donc, on doit créer 3 noms domaines pour les tests:</p>
<ul>
<li>core.coppint.test</li>
<li>web.coppint.test</li>
<li>registry.coppint.test</li>
</ul>
<p>Ces noms de domaines ont leur port définis sur 444, 443 et 445 depuis l’extérieur.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 22 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210122-journal-de-bord/</link>
      <pubDate>Fri, 22 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210122-journal-de-bord/</guid>
      <description>Ce soir, on continue le docker-compose.yml.</description>
      <content:encoded><![CDATA[<p>On ajoute les secrets et les schémas postgres.</p>
<p>Un doute m’assaille quand même sur la façon dont portal se connecte au backend.</p>
<p>En effet, il n’apparait nulle part, côté portal, de paramètres qui permette de déterminer l’uri des backends.</p>
<p>Du coup, on va tâtonner. On va faire le fichier docker-compose au mieux, le faire tourner et voir à quoi ressemble l’interface web (portal quoi !).</p>
<p><code>standalone-db-migrator</code> a besoin de paramètres postgres pour se connecter à la DB et faire ses migrations.
Il utilise les même paramètres que <code>core</code> dont <code>SSL_MODE</code> qu’on peut mettre à <code>verify-full</code> et ça c’est cool !!!!!</p>
<p>Du coup, il ne faut pas oublier de monter le couple clé/certificat TLS plus la chaîne de certification dans les répertoires client de postgres.
Et ça fait du <code>mTLS</code>. En plus de celà, il faut extraire les fichiers SQL de migration et les monter dans le container init avec un bon <code>POSTGRES_MIGRATION_SCRIPTS_PATH</code>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 21 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210121-journal-de-bord/</link>
      <pubDate>Thu, 21 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210121-journal-de-bord/</guid>
      <description>Ce soir on fait le container portal de GoHarbor.</description>
      <content:encoded><![CDATA[<p>On va se servir du role ansible nginx et on va utiliser une nouvelle façon de coder le playbook.</p>
<p>Jusqu’à présent, on utilisait le paramètre <code>delegate_to</code> pour accéder à l’environnement du container.</p>
<p>Maintenant, on va le déclarer dans l’inventaire et y accéder à partir de l’inventaire. L’inventaire sera divisé en 3 parties :</p>
<ul>
<li>la première construit le container de base et le provisionne avec l’environnement python nécessaire à ansible</li>
<li>la deuxième partie provisionne le container en se servant de la déclaration du container dans l’inventaire (plus besoin de <code>delegate_to</code>)</li>
<li>la troisième partie conclut le container. C’est à dire qu’il lui ajoute ses déclarations de containérisation (<code>CMD</code>, <code>USER</code>, &hellip;)</li>
</ul>
<p>Vient la construction du <code>docker-compose.yml</code>. C’est celui qui contient le plus de containers au sein du projet de forge logicielle.</p>
<p>Quelques éléments :</p>
<ul>
<li>Le TLS se fait avec les variables d’environnement <code>INTERNAL_TLS_ENABLED</code></li>
<li>Le container <code>registryctl</code> a un point de montage commun avec le container <code>registry</code> qui contient le fichier de configuration de <code>registry</code></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 19 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210119-journal-de-bord/</link>
      <pubDate>Tue, 19 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210119-journal-de-bord/</guid>
      <description>Encore du role ansible nginx. On espère finir...</description>
      <content:encoded><![CDATA[<p>On galère un peu avec les variables <code>perl</code>.</p>
<p>Donc, on finit les tests Inspec avec un patch à merger :</p>
<p>
<a href="https://github.com/dev-sec/nginx-baseline/pull/44" target="_blank">nginx parsed config as attribute by micheelengronne · Pull Request #44 · dev-sec/nginx-baseline</a></p>
<p>Et on se replonge dans GoHarbor.</p>
<p>on va pouvoir ajouter Portal à la liste de nos containers GoHarbor en utilisant le role ansible nginx et en incorporant le code html extrait de la phase de compilation.</p>
<p>Portal se construit avec la task <code>synchronize</code> d’ansible qui a une syntaxe différente de <code>copy</code> pour pourvoir uploader le code html.</p>
<p>Le débuggage de cette étape au prochain épisode.</p>
<p>Il y a un problème à régler avec nginx en container. Quelle est la bonne architecture ?</p>
<div class="row">
<div class="col-lg-6 col-md-6">

<figure class="figure text-center">
  <img src="https://blog.limawi.io/fr-fr/posts/stream-20210119-journal-de-bord/images/probleme-container-nginx-php-1.png" class="figure-img img-fluid rounded" alt="Un seul container avec les 2 processus ?">
  <figcaption class="figure-caption"><p>Problème de nginx en container 1</p>
    <small>Un seul container avec les 2 processus ?</small>
  </figcaption>
</figure>

</div>

<div class="col-lg-6 col-md-6">

<figure class="figure text-center">
  <img src="https://blog.limawi.io/fr-fr/posts/stream-20210119-journal-de-bord/images/probleme-container-nginx-php-2.png" class="figure-img img-fluid rounded" alt="Deux containers avec le code commun en volume ?">
  <figcaption class="figure-caption"><p>Problème de nginx en container 2</p>
    <small>Deux containers avec le code commun en volume ?</small>
  </figcaption>
</figure>

</div>

</div>

]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 18 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210118-journal-de-bord/</link>
      <pubDate>Mon, 18 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210118-journal-de-bord/</guid>
      <description>Ce soir, on continue le role ansible nginx.</description>
      <content:encoded><![CDATA[<p>On va écrire les tests puis les appliquer.</p>
<p>Les tests seront de 2 types, internes et externes.</p>
<ul>
<li>Les tests internes vont vérifier la configuration de nginx.</li>
<li>Les tests externes vont vérifier que nginx produit bien des pages web accessibles depuis l’extérieur.</li>
</ul>
<p>On va formaliser ces tests avec :</p>
<p>
<a href="https://github.com/inspec/inspec" target="_blank">inspec/inspec</a></p>
<p>Avec Inspec, les tests internes seront différenciés par le fait qu’ils seront exécutés dans l’environnement distant.</p>
<p>Pourquoi l’environnement distant ?</p>
<p>Parceque nous n’exécutons jamais Inspec au sein de l’environnement testé. Cela afin d’éviter des biais de test entre le dev, le staging et la prod.</p>
<p>Nos tests Inspec pour nginx sont basés sur :</p>
<p>
<a href="https://github.com/dev-sec/nginx-baseline" target="_blank">dev-sec/nginx-baseline</a></p>
<p>J’ai donc créé un PR pour soft-coder l’emplacement des fichiers de configurations nginx. Cela permettra de rendre le profil compatible avec des installs qui utilisent la <code>XDGBase Directory Specification</code> :</p>
<p>
<a href="https://github.com/dev-sec/nginx-baseline/pull/43" target="_blank">softcoded nginx path by micheelengronne · Pull Request #43 · dev-sec/nginx-baseline</a></p>
<p>Pour la disposition des couples clé/certificat TLS et le certificat de la chaîne de confiance, je place tout ça dans <code>$HOME/.ssl</code> par analogie avec la disposition de <code>ssh</code>.
Je nomme les fichiers selon le nom de domaine qu’ils signent. Le certificat de la chaîne est nommé <code>root.crt</code> en rappel de la façon de nommer chez <code>Postgres</code>.</p>
<p>La génération de Diffie-Helman est longue mais m’a donné une idée. Un service qui génère à l’avance du Diffie-Helman. Il en existe déjà un basé sur <code>dhtools</code> :</p>
<p>
<a href="https://2ton.com.au/dhtool/" target="_blank">Public Diffie-Hellman Parameter Service/Tool</a></p>
<p>Donc un deuxième service serait pas mal (avec des fonctionnalités supplémentaires) ?</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 15 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210115-journal-de-bord/</link>
      <pubDate>Fri, 15 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210115-journal-de-bord/</guid>
      <description>Ce soir, on fait le role ansible de nginx pour construire le container portal GoHarbor correctement.</description>
      <content:encoded><![CDATA[<p>On va faire le role dans la collection <code>ansible-environments</code>.</p>
<p>Pour celà on va modifier et mettre à jour un vieux profil Inspec et l’adapter aux nouvelles façons de concevoir le code.</p>
<p>La question est de savoir si il est pertinent d’installer nginx en container en respectant l’arborescence classique
adaptée aux multi-users ou si il vaut mieux faire une arborescense mono-user selon les standards de containerisation.</p>
<p>On part donc sur une installation mono-user respectant la <code>XDG_Base_Directory</code>.</p>
<p>
<a href="https://wiki.archlinux.org/title/XDG_Base_Directory" target="_blank">XDG Base Directory</a></p>
<p>Pour les paramètres qui changent au démarrage du service, on souhaite n’utiliser que des variables d’environnement, comme dans tous les containers.</p>
<p>Ça veut dire que dans le cas de nginx, on va se servir de perl :</p>
<p>
<a href="https://medium.com/create-code/docker-environment-variables-and-nginx-93d7173f19ec" target="_blank">Docker environment variables and NGINX</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 14 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210114-journal-de-bord/</link>
      <pubDate>Thu, 14 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210114-journal-de-bord/</guid>
      <description>Ce soir, on construit le container portal GoHarbor.</description>
      <content:encoded><![CDATA[<p>Puis, on fait le docker-compose et on regarde si tout fonctionne.</p>
<p>La subtilité du container portal c’est que le code est un package nodejs qui ne provient pas d’un repo mais est extrait localement depuis la phase de compilation.</p>
<p>Donc, on va devoir faire avec pour le moment.</p>
<p>Plus tard, quand un repo npm sera installé, on uploadera ce paquet dans le repo dans une phase préparatoire (depuis un projet à part) et on utilisera ce paquet correctement installé depuis le repo.</p>
<p>Pourquoi ?</p>
<p>Pour profiter du système de dépendances de npm et ainsi coder d’autres packages qui se greffent à celui-là.</p>
<p>Mais pour ce soir, on va faire simple.</p>
<p>Premier truc à modifier, c’est l’appel des images containers depuis le docker-hub. En effet, pour éviter de heurter l’API rate limiting, on va essayer de changer ces appels et les remplacer par nos propres images.</p>
<p>On va placer le code de portal dans le répertoire <code>/home/goharbor/srv</code> car nos containers ne tournent pas en <code>root</code> et sont mono <code>USER</code> donc le code doit se trouver dans le <code>HOME</code> de ce <code>USER</code>.</p>
<p>Pourquoi <code>srv</code> ?</p>
<p>Parce que le code de portal est considéré comme du code nécessaire à exécution du service au sein du container.</p>
<p>Pour ref:</p>
<p>
<a href="https://serverfault.com/questions/144598/where-should-the-web-server-root-directory-go-in-linux" target="_blank">Where should the web server root directory go in linux?</a></p>
<p>Pour bien faire les choses, on va créer un role dans la collection ansible qui configure les environnements de base.</p>
<p>Ce role paramétrera nginx de façon sécurisée et il sera utilisé pour portal.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 12 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210112-journal-de-bord/</link>
      <pubDate>Tue, 12 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210112-journal-de-bord/</guid>
      <description>Encore de la construction du container registry officiel de Docker.</description>
      <content:encoded><![CDATA[<p>Enfin, le container démarre proprement. Allez, tests bats.</p>
<p>Pour les tests bats, on va tester l’upload, le download et l’access control d’images dans le Docker registry.</p>
<p>Le problème c’est qu’on ne peut pas utiliser la commande Docker pour ça.
Pourquoi ? Parceque dans DinD, le processus Docker est lié à l’host sous-jacent
et donc on peut se retrouver à avoir des disparités et des instabilités dans les tests dus aux réglages différents des host.</p>
<p>
<a href="https://www.instagram.com/p/CGritJJIVVu/" target="_blank">À noter au propre, les schémas de DinD depuis Instagram.</a></p>
<p>podman ayant un output différent, il faut écrire les tests en fonction.</p>
<p>Finalement les tests bats sont passés, le merge est fait et les artefacts de prod réalisés (container init et container registry).</p>
<p>On va donc pouvoir faire les tests côté GoHarbor.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 11 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210111-journal-de-bord/</link>
      <pubDate>Mon, 11 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210111-journal-de-bord/</guid>
      <description>Suite de la construction du container registry officiel de Docker.</description>
      <content:encoded><![CDATA[<p>Après avoir compris comment compiler malgré la désastreuse façon de gérer les releases par le projet officiel, on peut continuer.</p>
<p>On va donc faire des suites de tests bats pour s’assurer que notre container (à notre sauce) faisant tourner le registre officiel fonctionne bien.</p>
<p>Les suites de tests sont :</p>
<ul>
<li>contrôle d’accès</li>
<li>upload et download</li>
</ul>
<p>C’est des suites de tests de base. la grande majorité des tests sera faite au niveau de GoHarbor.</p>
<p>On a besoin malgré tout d’un container init pour créer un fichier de configurations minimaliste dont se sert registry.</p>
<p>L’essentiel de la configuration peut être pourtant gérée avec des variables d’environnement.</p>
<p>Le registre peut aussi avoir redis greffé, c’est cool.</p>
<p>Finalement, on a pas beaucoup avancé mais on a appris des trucs.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 08 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210108-journal-de-bord/</link>
      <pubDate>Fri, 08 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210108-journal-de-bord/</guid>
      <description>Construction du container registry officiel de Docker.</description>
      <content:encoded><![CDATA[<p>Comme GoHarbor dépend du registre officiel de Docker, on va le conteneuriser à notre sauce.</p>
<p>On va d’abord revenir sur la gestion des configurations dans les containers GoHarbor.</p>
<p>En effet, hier, on avait déterminé 3 types de configurations :</p>
<ul>
<li>L’hyperstatique</li>
<li>La statique</li>
<li>La dynamique</li>
</ul>
<p>Ces caractérisations sont superflues et on va simplifier ça avec la norme :</p>
<p>
<a href="https://wiki.debian.org/XDGBaseDirectorySpecification" target="_blank">XDGBaseDirectorySpecification</a></p>
<p>Dans notre cas, nous allons gérer les templates de configuration au niveau du container init.
Il aura la charge des les mettre dans les bons répertoires si il peut y accéder et si un fichier équivalent n’est pas déjà présent.</p>
<p>Après avoir essayé de compiler le registry officiel de docker, nous nous sommes rendu compte que la dernière release avait 2 ans et que sa façon de compiler avait changé.</p>
<p>
<a href="https://github.com/distribution/distribution/releases/tag/v2.7.1" target="_blank">Release registry 2.7.1 · docker/distribution</a></p>
<p>La mort dans l’âme, nous nous sommes résignés à utiliser un commit plutôt qu’un numéro de version pour assurer l’immutabilité et utiliser un code récent.</p>
<p>
<a href="https://github.com/distribution/distribution/commit/35f1369d377054088c4c2e9079ddbb6c1375105d" target="_blank">Merge pull request #3314 from crazy-max/dummy · docker/distribution@35f1369</a></p>
<p>Et la compilation a trés bien marché. On a un beau binaire registry qu’on va pouvoir mettre en container lundi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 07 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210107-journal-de-bord/</link>
      <pubDate>Thu, 07 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210107-journal-de-bord/</guid>
      <description>Construction des containers avec les binaires.</description>
      <content:encoded><![CDATA[<p>On a trouvé les binaires qui font GoHarbor. On va les mettre dans les containers, maintenant.</p>
<p>En plus, on va faire un container à notre sauce avec le projet officiel de docker registry.</p>
<p>
<a href="https://github.com/distribution/distribution" target="_blank">docker/distribution</a></p>
<p>Pourquoi ? Parceque Goharbor s’appuie sur le registre officiel de Docker en backend.</p>
<p>Il y a deux types de containers. Un qui gère des binaires et l’autre qui gère du nodejs.</p>
<p>Ces deux types ne faisant pas appel au même language de programmation et donc au même environnement, leurs configurations <code>vars.yml</code> doivent être différentes.</p>
<p>On va donc construire les containers binaires avec le role <code>coppint.environment.binaries</code> et le container nodejs avec le role <code>coppint.environment.nodejs</code>.</p>
<p>Le container <code>harbor_core</code> ne semble pas charger de configuration par défaut (ou il la charge silencieusement). Il faut donc trouver comment charger un fichier de configuration spécifique.</p>
<p>C’est semble-t-il le cas de l’ensemble des binaires. Cela semble être géré par des variables d’environnement. C’est plutôt cool dans un environnement conteneurisé !</p>
<p>Les fichiers de configurations au sein des containers sont de nature variée et donc doivent être gérés de façon différente.</p>
<p>Nous avons des fichiers de configuration hyperstatiques qui peuvent être gérés comme du code.</p>
<p>Nous avons des fichiers de configuration statiques qui peuvent être gérés par du templating ansible et sont valables pour la durée de vie du container-image.</p>
<p>Et nous avons des fichiers de configuration dynamiques qui sont gérés par dockerize au moment de l’initialisation du service.</p>
<p>Sur le plan des bases de données, GoHarbor n’a pas de base propre. Il utilise la base de données du projet <code>docker/distribution</code>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 05 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210105-journal-de-bord/</link>
      <pubDate>Tue, 05 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210105-journal-de-bord/</guid>
      <description>Compilation correcte des binaires de GoHarbor.</description>
      <content:encoded><![CDATA[<p>Ce soir, on va déterminer quels binaires doivent être compilés pour faire fonctionner GoHarbor.</p>
<p>Nous voulons uniquement ceux de Goharbor et pas des dépendances externes.</p>
<p>Les dépendances externes (Redis, nginx, postgres) ont ou auront leurs propres projets.</p>
<p>Premier travail de ce soir, déployer GoHarbor avec l’installer officiel pour déterminer quels containers sont créés et quels sont les fichiers de configuration générés.</p>
<p>On va donc tester ça dans un vagrant en local.</p>
<p>Le script nécessite sudo partout. C’est terrible dans un environnement de prod.</p>
<p>Bien sûr, ne pas oublier de faire tout ça dans un sous-répertoire de <code>/vagrant</code> sinon on perd tout au prochain <code>vagrant destroy</code>.</p>
<p>Après avoir générer les certificats TLS comme indiqué ici :</p>
<p>
<a href="https://goharbor.io/docs/2.1.0/install-config/configure-https/" target="_blank">Harbor - Configure HTTPS Access to Harbor</a></p>
<p>et mis tout ça dans les bons répertoires, le script <code>sudo ./prepare --with-notary --with-trivy --with-clair --with-chartmuseum</code> semble fonctionner :</p>
<pre><code>prepare base dir is set to /vagrant/harbor-test/harbor
Generated configuration file: /config/portal/nginx.conf
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/log/rsyslog_docker.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/registryctl/config.yml
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
loaded secret from file: /data/secret/keys/secretkey
Copying nginx configuration file for notary
Generated configuration file: /config/nginx/conf.d/notary.upstream.conf
Generated configuration file: /config/nginx/conf.d/notary.server.conf
Generated configuration file: /config/notary/server-config.postgres.json
Generated configuration file: /config/notary/server_env
loaded secret from file: /data/secret/keys/defaultalias
Generated configuration file: /config/notary/signer_env
Generated configuration file: /config/notary/signer-config.postgres.json
Generated configuration file: /config/clair/postgres_env
Generated configuration file: /config/clair/config.yaml
Generated configuration file: /config/clair/clair_env
Generated configuration file: /config/clair-adapter/env
Generated configuration file: /config/trivy-adapter/env
Generated configuration file: /config/chartserver/env
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir
</code></pre>
<p>Du coup on tente l’install.</p>
<p>L’install est très instable mais elle donne un docker-compose.yml et une liste de containers et de configurations.
Le but est de réduire le scope des containers propres à GoHarbor et d’évacuer les containers des services associés vers leurs propres projets (redis, postgres et éventuellement notary, clair, etc&hellip;).</p>
<p>En fouillant dans les projets officiels, je trouve des surprises. Notary, par exemple, n’a pas de release depuis quasiment 2 ans :</p>
<p>
<a href="https://github.com/notaryproject/notary/issues/1583" target="_blank">Publish a release · Issue #1583 · theupdateframework/notary</a></p>
<p>Pour chartmuseum, on est à quasiment 1 an :</p>
<p>
<a href="https://github.com/helm/chartmuseum/releases/tag/v0.12.0" target="_blank">Release ChartMuseum v0.12.0 · helm/chartmuseum</a></p>
<p>Kubernetes et donc Helm/Chart (vu qu’on veut faire du Gitops) ne sont pour le moment pas dans le scope du projet de forge logicielle, donc chartmuseum sera réévalué plus tard.</p>
<p>Au final, on a 3 binaires :</p>
<ul>
<li>harbor_core</li>
<li>harbor_jobservice</li>
<li>harbor_registryctl</li>
</ul>
<p>Et un package nodejs : portal</p>
<p>On a deux helpers à compiler aussi :</p>
<ul>
<li>migrate-patch</li>
<li>standalone-db-migrator</li>
</ul>
<p>Du coup, la story va consister à créer les containers harbor_core, harbor_jobservice, harbor_registryctl, un container init (avec les migrate) et le container portal.</p>
<p>On va faire communiquer tout ça ensemble avec les containers officiels postgres, redis et nginx.</p>
<p>On va appliquer des features cucumber et un profil Inspec là-dessus.</p>
<p>Puis, dans un second temps, on va ajouter les scanners et notary.</p>
<p>Tout ça pour ce projet de forge logicielle.</p>

<figure class="figure text-center">
  <img src="https://blog.limawi.io/fr-fr/posts/stream-20210105-journal-de-bord/images/forge-logicielle.png" class="figure-img img-fluid rounded" alt="Projet de forge logicielle immutable, containerisée et ductile">
  <figcaption class="figure-caption"><p>Forge logicielle Limawi</p>
    <small>Projet de forge logicielle immutable, containerisée et ductile</small>
  </figcaption>
</figure>

]]></content:encoded>
    </item>
    <item>
      <title>Journal de bord 04 janvier 2021</title>
      <link>https://blog.limawi.io/fr-fr/posts/stream-20210104-journal-de-bord/</link>
      <pubDate>Mon, 04 Jan 2021 18:00:00 +0000</pubDate>
      <guid>https://blog.limawi.io/fr-fr/posts/stream-20210104-journal-de-bord/</guid>
      <description>Journal de bord du stream du 04 janvier 2021</description>
      <content:encoded><![CDATA[<p>Tout d’abord bonne année.</p>
<p>Ce soir, on va démarrer la mise en containers de GoHarbor.</p>
<p>L’idée est de récupérer les binaires créés au sein du script d’install de GoHarbor.</p>
<p>Ensuite, on les installe à notre sauce :</p>
<ul>
<li>Container créé avec ansible</li>
<li>Init scripts avec pre-hook et post-hook</li>
<li>Pas de compilation au sein des containers</li>
<li>Tests dynamiques créés avec Cucumber</li>
<li>Tests statiques créés avec Inspec (CINC-auditor)</li>
<li>renovate pour gérer les dépendances de façon immutable</li>
<li>semantic-release pour gérer les releases (tags et artefacts)</li>
<li>Un contributing standard</li>
<li>Un dockerignore qui vide le contexte de Docker car on utilise ansible pour construire les containers</li>
<li>Un gitlab-ci.yml temporaire, le temps qu’on migre vers concourse-ci</li>
<li>Un test d’upgrade_path fait avec Cucumber</li>
<li>Un prepare.sh qui génère les binaires et les transmet entre les étapes</li>
<li>Un docker-compose d’exemple (autonome, sécurisé)</li>
<li>Des environnements de dev locaux basés sur docker-compose et déclenchables à partir de VSCodium dont un déclencheur qui nettoie complètement l’environnement</li>
</ul>
<p>Pour cela, il est nécessaire de réussir à compiler les binaires de Goharbor sans passer par une succession de containers Go afin d’extraire des binaires adaptés à notre OS (Ubuntu).</p>
<p>Dans un premier temps, on va faire du DinD (Docker in Docker) et utiliser leur flag de compilation tel quel, c’est à dire en appelant un container GO distant.</p>
<p>Mais ce n’est pas une solution durable car cela oblige à conserver Docker dans l’infrastructure ce qui est contraire à l’un des buts du projet global. On veut, en effet, se débarrasser de Docker au profit de podman/buildah.</p>
<p>Pour référence :</p>
<p>
<a href="https://github.com/goharbor/harbor/issues/13885" target="_blank">Compile binaries without docker · Issue #13885 · goharbor/harbor</a></p>
<p>Les dépendances externes seront traitées dans des projets séparés (Clair, Notary,…). Ceci afin d’augmenter la réutilisabilité des portions de l’infrastructure.</p>
<p>Notamment, les bases de données comme Redis ou PostgreSQL n’ont pas d’intérêt à être conçues uniquement pour l’usage de GoHarbor.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
