<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Guilhem Bonnefille</title>
    <description>The latest articles on DEV Community by Guilhem Bonnefille (@gbonnefille).</description>
    <link>https://dev.to/gbonnefille</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F809403%2F7213359a-fb10-4fb6-90ba-250cd82a398e.png</url>
      <title>DEV Community: Guilhem Bonnefille</title>
      <link>https://dev.to/gbonnefille</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gbonnefille"/>
    <language>en</language>
    <item>
      <title>Récupérer un accès root sur les noeuds du cluster</title>
      <dc:creator>Guilhem Bonnefille</dc:creator>
      <pubDate>Tue, 10 Oct 2023 08:50:36 +0000</pubDate>
      <link>https://dev.to/gbonnefille/recuperer-un-acces-root-sur-les-noeuds-du-cluster-3a7l</link>
      <guid>https://dev.to/gbonnefille/recuperer-un-acces-root-sur-les-noeuds-du-cluster-3a7l</guid>
      <description>&lt;p&gt;Suite à une erreur de manipulation, j'ai perdu mes accès root sur les noeuds du cluster. Dernier espoir : passer par des Pods pour corriger le tir.&lt;/p&gt;

&lt;p&gt;Sur le principe c'est assez simple : créer des Pod qui &lt;code&gt;mount&lt;/code&gt; le &lt;code&gt;/&lt;/code&gt; avant de faire un &lt;code&gt;chroot&lt;/code&gt; pour enfin changer le mot de passe via &lt;code&gt;passwd&lt;/code&gt;. Afin de pouvoir agir sur chacun des noeuds du cluster de manière déterministe, j'ai choisi l'option d'utiliser un &lt;code&gt;DaemonSet&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DaemonSet&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;debug-console-deployment&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;debug-console&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;component&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;debug-console&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;console-config&lt;/span&gt;
          &lt;span class="na"&gt;hostPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;debug-console&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu:22.04&lt;/span&gt;
          &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tail'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-f'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
          &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;console-config&lt;/span&gt;
              &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/mnt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Une fois le fichier créé, il ne reste plus que &lt;code&gt;kubectl apply -f debug.yml&lt;/code&gt;. Après, un coup de &lt;a href="https://k9scli.io/"&gt;k9s&lt;/a&gt; pour accéder facilement à ces Pods.&lt;/p&gt;

</description>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Un générateur de graphe Git</title>
      <dc:creator>Guilhem Bonnefille</dc:creator>
      <pubDate>Thu, 28 Sep 2023 06:36:16 +0000</pubDate>
      <link>https://dev.to/gbonnefille/un-generateur-de-graphe-git-13mo</link>
      <guid>https://dev.to/gbonnefille/un-generateur-de-graphe-git-13mo</guid>
      <description>&lt;p&gt;Afin d'illustrer mes supports de formations avec des graphes Git, j'ai développé un outil que j'ai nommé &lt;a href="https://gitlab.com/csgroup-oss/gitgraph2dot/" rel="noopener noreferrer"&gt;gitgraph2dot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Il y a environ dix ans, quand j'ai initié mes supports de formation à Git, j'ai assez naturellement récupéré les illustrations du livre &lt;a href="https://git-scm.com/book/en/v2" rel="noopener noreferrer"&gt;Pro Git&lt;/a&gt;.&lt;br&gt;
Les illustrations étant réalisées avec un outil non libre, je me suis contenté à l'époque des images.&lt;br&gt;
Et lorsque j'ai voulu rajouter des exemples, j'ai bricolé comme j'ai pu.&lt;/p&gt;

&lt;p&gt;Mais récemment, j'ai considéré que c'était vraiment trop limitant et que ça me conduisait parfois à un manque d'homogénéité ou tout simplement que ça me freinait dans la créativité.&lt;br&gt;
J'ai alors entrepris un chantier consistant à remettre en cause cet état de fait et partir sur une nouvelle base.&lt;/p&gt;

&lt;h2&gt;
  
  
  Les prérequis
&lt;/h2&gt;

&lt;p&gt;Facilitateur DevOps ascendant maniaco-scripteur, hors de question de partir sur un clicodrome où on passe des heures à ajuster le look &amp;amp; feel ou l'alignement.&lt;br&gt;
Au contraire, la solution doit s'appuyer sur une description, de préférence en textuelle, facile à gérer dans Git.&lt;/p&gt;

&lt;p&gt;Et des outils pour générer des graphes Git à partir d'une description textuelle, finalement on en trouve pas mal.&lt;br&gt;
Voire, comme toujours, on en trouve trop et il faut identifier le bon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mermaid
&lt;/h2&gt;

&lt;p&gt;Quand on fouille dans ce tas, naturellement on en trouve beaucoup à l'abandon et pas mal dont on ne sait pas prédire l'avenir.&lt;br&gt;
Du coup, il parait naturel de se réorienter vers la solution qui semble faire l'unanimité dans beaucoup de solutions Web : &lt;a href="https://mermaid.js.org/" rel="noopener noreferrer"&gt;mermaid&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Et très franchement, son extension &lt;a href="https://mermaid.js.org/syntax/gitgraph.html" rel="noopener noreferrer"&gt;pour les diagrammes Git&lt;/a&gt; est vraiment séduisante.&lt;br&gt;
Jugez plutôt : on énumère les commit, les branches, les merges... comme si on saisissait les commandes dans un terminal et l'outil nous génère un graphe.&lt;br&gt;
C'est simple, explicite, facile à relire et à faire évoluer.&lt;/p&gt;

&lt;p&gt;Mais... les schémas sont trop orientés « workflow » à mon gout.&lt;br&gt;
Qu'est-ce que j'entends par là ?&lt;br&gt;
Dans les diagrammes généré par mermaid, les branches sont représentées comme des lignes de chemin de fer sur lesquelles viennent se poser des commits, des débranchements et des fusions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8hpn0ises96iky57c1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8hpn0ises96iky57c1g.png" alt="Un exemple de graphe Git généré avec Mermaid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;D'un point de vue « workflow » c'est tout à fait acceptable et explicite.&lt;br&gt;
Mais d'un point de vue « formation Git » c'est trompeur, ça laisserait penser qu'un commit &lt;em&gt;appartient&lt;/em&gt; à une branche.&lt;br&gt;
Or, justement, dans mes formations Git, ce sur quoi j'insiste, c'est que « les branches n'existent pas » ou en tout cas les commits vivent leur vie indépendamment des branches et que ces dernières ne sont qu'un moyen d'accéder au graphe des commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  gitgraph2dot
&lt;/h2&gt;

&lt;p&gt;L'outil &lt;code&gt;gitgraph2dot&lt;/code&gt; reprend les concepts du fichier d'entrée décrivant une séquence de commandes Git mais génère un graphe dans lequel les branches sont présentées, comme dans le livre « Pro Git », comme des références qui pointent des commits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstuslcc0dnmmfbp33c47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstuslcc0dnmmfbp33c47.png" alt="Exemple de graphe Git généré avec gitgraph2dot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et comme j'aime bien la simplicité, il s'agit d'un simple script Bash qui se limite a traduire la description textuelle du graphe Git en instructions pour la commande &lt;code&gt;dot&lt;/code&gt; du projet &lt;a href="https://graphviz.org/" rel="noopener noreferrer"&gt;Graphviz&lt;/a&gt;.&lt;br&gt;
« Keep it simple » on vous dit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;En attendant que mermaid propose un graphe Git dans lequel on puise ajuster la logique de rendu des branches, n'hésitez pas à télécharger ce script et à l'utiliser pour vos schéma, voire venir contribuer au projet, c'est sous GPL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitlab.com/csgroup-oss/gitgraph2dot/" rel="noopener noreferrer"&gt;https://gitlab.com/csgroup-oss/gitgraph2dot/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>graphviz</category>
      <category>bash</category>
    </item>
  </channel>
</rss>
