<?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>Forem: Kevin LARQUEMIN</title>
    <description>The latest articles on Forem by Kevin LARQUEMIN (@vixsty).</description>
    <link>https://forem.com/vixsty</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%2F406710%2F3c476104-942a-4ed8-ad74-ac37aa85fe17.jpg</url>
      <title>Forem: Kevin LARQUEMIN</title>
      <link>https://forem.com/vixsty</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/vixsty"/>
    <language>en</language>
    <item>
      <title>Utiliser Git avec plusieurs identités</title>
      <dc:creator>Kevin LARQUEMIN</dc:creator>
      <pubDate>Wed, 25 Aug 2021 12:33:27 +0000</pubDate>
      <link>https://forem.com/stack-labs/utiliser-git-avec-plusieurs-identites-f05</link>
      <guid>https://forem.com/stack-labs/utiliser-git-avec-plusieurs-identites-f05</guid>
      <description>&lt;p&gt;Dès le premier commit, Git ne manque pas de nous rappeler de renseigner un nom et un email.&lt;/p&gt;

&lt;p&gt;Pour configurer une identité dans Git, tout se passe dans le fichier de configuration global. Ce fichier de configuration &lt;code&gt;.gitconfig&lt;/code&gt; se trouve généralement dans votre dossier &lt;code&gt;$HOME&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;On peut le configurer en ligne de commande :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou encore avec notre éditeur préféré. Le principal est que Git puisse trouver et lire ce fichier.&lt;/p&gt;

&lt;p&gt;On peut afficher ces paramètres de plusieurs façon. En lisant directement tous les fichier &lt;code&gt;.gitconfig&lt;/code&gt; ou en utilisant la ligne de commande.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cat ~/.gitconfig
[user]
    name = John Doe
    email = johndoe@example.com

$ git config --list
user.name=John Doe
user.email=johndoe@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Et si vous y rajoutez l'option &lt;code&gt;--show-origin&lt;/code&gt;, vous saurez en plus de quel fichier provient la configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git config --list --show-origin
file:/Users/vixsty/.gitconfig   user.name=John Doe
file:/Users/vixsty/.gitconfig   user.email=johndoe@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Je préfère cette solution à un simple &lt;code&gt;cat ~/.gitconfig&lt;/code&gt; car elle a l'avantage de montrer la configuration résolue par Git en agrégeant les configurations system, global et local.&lt;/p&gt;

&lt;p&gt;Ainsi, chaque commit Git se fera en utilisant ces paramètres. Mais voilà, ils sont définis une fois pour tous les projets, indépendamment du serveur Git qui peut changer, d'un projet différent ou tout autre facteurs pouvant vous conduire à utiliser une autre adresse email ou un autre nom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Plusieurs Identités
&lt;/h2&gt;

&lt;p&gt;Certaines interfaces graphiques de Git viennent instrumenter cette fonctionnalité et permettent de changer entre différentes identités lors des commits. Mais j'utilise autant les applications que la ligne de commande. Je préfère une solution qui fonctionne à un plus bas niveau et de façon transparente.&lt;/p&gt;

&lt;p&gt;En regardant de plus près la documentation officielle sur &lt;a href="https://git-scm.com/docs/git-config#_includes" rel="noopener noreferrer"&gt;git-scm.com&lt;/a&gt;. On y trouve l'instruction &lt;code&gt;includeIf&lt;/code&gt; :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The include and includeIf sections allow you to include config directives from another source. These sections behave identically to each other with the exception that includeIf sections may be ignored if their condition does not evaluate to true; see "Conditional includes" below.&lt;/p&gt;

&lt;p&gt;You can include a config file from another by setting the special include.path (or includeIf.*.path) variable to the name of the file to be included. The variable takes a pathname as its value, and is subject to tilde expansion. These variables can be given multiple times.&lt;/p&gt;

&lt;p&gt;The contents of the included file are inserted immediately, as if they had been found at the location of the include directive. If the value of the variable is a relative path, the path is considered to be relative to the configuration file in which the include directive was found. See below for examples.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cette instruction m'offre la possibilité de charger une configuration alternative selon où ce trouve mon repository Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  Organisation par dossier
&lt;/h2&gt;

&lt;p&gt;J'ai surtout une identité reliée à mon travail et mon identité personnelle. Et ça tombe plutôt bien, j'ai déjà une organisation de mes dossiers pour ne pas mélanger boulot et perso.&lt;/p&gt;

&lt;p&gt;J'ai donc deux dossier&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/Documents/dev/work&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/Documents/dev/perso&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;mais l'on peut imaginer la même chose pour séparer GitHub, gitlab.com et un GitLab interne.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/Documents/dev/github.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/Documents/dev/gitlab.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/Documents/dev/gitlab.example.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuration Git
&lt;/h2&gt;

&lt;p&gt;Je crée un fichier de configuration Git dans mon dossier &lt;code&gt;work&lt;/code&gt; qui contiendra les paramètres de mon identité professionnelle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# en ligne de commande
$ git config -f ~/Documents/dev/work/.gitconfig user.name "Jack Sparrow"
$ git config -f ~/Documents/dev/work/.gitconfig user.email jack.sparrow@example.com

# ou directement en modifiant le fichier
$ cat &amp;gt;&amp;gt; ~/Documents/dev/work/.gitconfig &amp;lt;&amp;lt;EOL
[user]
        name = Jack Sparrow
        email = jack.sparrow@example.com
EOL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dans ma configuration global, j'ajoute un &lt;code&gt;includeIf&lt;/code&gt; vers mon dossier &lt;code&gt;work&lt;/code&gt; qui inclura le fichier de configuration précédemment créé.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cat &amp;gt;&amp;gt; ~/.gitconfig &amp;lt;&amp;lt;EOL
[includeIf "gitdir:~/Documents/dev/work/"]
    path = ~/Documents/dev/work/.gitconfig
EOL

# et je vérifie que le fichier soit cohérent.
$ git config --list --show-origin
file:/Users/vixsty/.gitconfig   user.name=John Doe
file:/Users/vixsty/.gitconfig   user.email=johndoe@example.com
file:/Users/vixsty/.gitconfig   includeif.gitdir:~/Documents/dev/work/.path=~/Documents/dev/work/.gitconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Vérification
&lt;/h2&gt;

&lt;p&gt;Pour vérifier que cette configuration fonctionne, il me suffit d'aller dans un repo Git présent dans mon dossier &lt;code&gt;~/Documents/dev/work/&lt;/code&gt; et d'afficher la configuration&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir -p ~/Documents/dev/work/multipass-test

$ cd ~/Documents/dev/work/multipass-test

$ git init
Initialized empty Git repository in /Users/vixsty/Documents/dev/work/multipass-test/.git/

$ git config --list --show-origin
file:/Users/vixsty/.gitconfig   user.name=John Doe
file:/Users/vixsty/.gitconfig   user.email=johndoe@example.com
file:/Users/vixsty/.gitconfig   includeif.gitdir:~/Documents/dev/work/.path=~/Documents/dev/work/.gitconfig
file:/Users/vixsty/Documents/dev/work/.gitconfig        user.name=Jack Sparrow
file:/Users/vixsty/Documents/dev/work/.gitconfig        user.email=jack.sparrow@example.com
file:.git/config        core.repositoryformatversion=0
file:.git/config        core.filemode=true
file:.git/config        core.bare=false
file:.git/config        core.logallrefupdates=true
file:.git/config        core.ignorecase=true
file:.git/config        core.precomposeunicode=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On peut voir des valeurs de &lt;code&gt;user.name&lt;/code&gt; et de &lt;code&gt;user.email&lt;/code&gt; provenant de &lt;code&gt;/Users/vixsty/.gitconfig&lt;/code&gt; ainsi que de &lt;code&gt;/Users/vixsty/Documents/dev/work/.gitconfig&lt;/code&gt; et ces dernières valeur remplacent les premières.&lt;/p&gt;

&lt;p&gt;Si je fais la même chose dans mon dossier perso, les valeurs de &lt;code&gt;work&lt;/code&gt; ne sont pas chargées&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir -p ~/Documents/dev/perso/multipass-test

$ cd ~/Documents/dev/perso/multipass-test

$ git init
Initialized empty Git repository in /Users/vixsty/Documents/dev/perso/multipass-test/.git/

$ git config --list --show-origin
file:/Users/vixsty/.gitconfig   user.name=John Doe
file:/Users/vixsty/.gitconfig   user.email=johndoe@example.com
file:/Users/vixsty/.gitconfig   includeif.gitdir:~/Documents/dev/work/.path=~/Documents/dev/work/.gitconfig
file:.git/config        core.repositoryformatversion=0
file:.git/config        core.filemode=true
file:.git/config        core.bare=false
file:.git/config        core.logallrefupdates=true
file:.git/config        core.ignorecase=true
file:.git/config        core.precomposeunicode=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On peut aller plus loin en vérifiant avec un simple commit dans chaque repository que l'identité correspond à notre configuration.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;professionnelle
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commit d57dcd1729f4f7bcaab7472fb8a98a33e8d356b3 (HEAD -&amp;gt; master)
Author: Jack Sparrow &amp;lt;jack.sparrow@example.com&amp;gt;
Date:   Fri Jun 12 18:46:58 2020 +0200

    first commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;personnelle
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commit ce6967bcdb9f0c9f652e5b8756e3857712e258a9 (HEAD -&amp;gt; master)
Author: John Doe &amp;lt;johndoe@example.com&amp;gt;
Date:   Fri Jun 12 18:45:12 2020 +0200

    first commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Le fichier &lt;code&gt;.gitconfig&lt;/code&gt; peut contenir tous les paramètres reconnus par Git. Avec cette méthode, ceci me permet notamment d'activer la signature GPG en associant mes identités Git avec les identités GPG leur correspondant.&lt;/p&gt;

&lt;p&gt;Par exemple :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;file:/Users/vixsty/.gitconfig   user.signingkey=3E5D********************************8F3A
file:/Users/vixsty/.gitconfig   commit.gpgsign=true
file:/Users/vixsty/Documents/dev/work/.gitconfig        user.signingkey=C16C********************************CFBB
file:/Users/vixsty/Documents/dev/work/.gitconfig        commit.gpgsign=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si vous cherchez comment gérer vos clés GPG pour signer vos commits, je vous recommande l'utilisation de &lt;a href="https://keybase.io/" rel="noopener noreferrer"&gt;keybase.io&lt;/a&gt; et je vous invite à lire cette article &lt;a href="https://blog.stack-labs.com/code/gerer_clefs_gpg_github_keybaseio/" rel="noopener noreferrer"&gt;Gérer ses clefs GPG sous MacOS avec Keybase.io&lt;/a&gt; qui traite très bien le sujet.&lt;/p&gt;

</description>
      <category>git</category>
    </item>
    <item>
      <title>How to fix your automation broken by Terraform output formatting change in 0.14</title>
      <dc:creator>Kevin LARQUEMIN</dc:creator>
      <pubDate>Wed, 16 Dec 2020 10:43:34 +0000</pubDate>
      <link>https://forem.com/stack-labs/how-to-fix-your-automation-broken-by-terraform-output-formatting-change-in-0-14-3g0o</link>
      <guid>https://forem.com/stack-labs/how-to-fix-your-automation-broken-by-terraform-output-formatting-change-in-0-14-3g0o</guid>
      <description>&lt;p&gt;If you move to &lt;a href="https://www.terraform.io/" rel="noopener noreferrer"&gt;Terraform 0.14&lt;/a&gt; from previous version and you are a user of the &lt;code&gt;terraform output&lt;/code&gt; feature in your CI. You probably will be surprised because working automation isn't anymore.&lt;/p&gt;

&lt;p&gt;In Terraform 0.14, the formatting of &lt;code&gt;terraform output&lt;/code&gt; is modified to match the formatting of &lt;code&gt;terraform show&lt;/code&gt;. Like it's explained in the &lt;a href="https://www.terraform.io/upgrade-guides/0-14.html#terraform-output-formatting" rel="noopener noreferrer"&gt;upgrade guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, to get the name of a kubernetes cluster in Gke&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output "kubernetes_cluster_name" {
  value       = google_container_cluster.primary.name
  description = "GKE Cluster Name"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Terraform 0.13.5&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Λ\: terraform output kubernetes_cluster_name
dev-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Terraform 0.14.2&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Λ\: terraform output kubernetes_cluster_name
"dev-cluster"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not a big difference, but quoted and unquoted string aren't the same value in automation. &lt;/p&gt;

&lt;p&gt;For example, a shell script&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;CLUSTER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;terraform output kubernetes_cluster_name&lt;span class="sb"&gt;`&lt;/span&gt;
gcloud config configurations create &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CLUSTER_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
gcloud auth activate-service-account ...
gcloud container clusters get-credentials ... &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CLUSTER_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And of course, quoted string in an error message isn't as anormal as it is in this case ^^&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERROR: (gcloud.config.configurations.create) Invalid name ["dev-cluster"] for a configuration.  Except for special cases (NONE), configuration names start with a lower case letter and contain only lower case letters a-z, digits 0-9, and hyphens '-'.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://www.terraform.io/upgrade-guides/0-14.html#terraform-output-formatting" rel="noopener noreferrer"&gt;upgrade guide&lt;/a&gt; give some information :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We consider the console output of Terraform human readable;&lt;br&gt;
[...]&lt;br&gt;
If you rely on &lt;code&gt;terraform output&lt;/code&gt; in automation, please use &lt;code&gt;terraform output -json&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In my test, I can't see any difference just with &lt;code&gt;-json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Λ\: terraform output -json kubernetes_cluster_name
"dev-cluster"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answer to how to use it in automation and get unquoted value is more deeper in &lt;a href="https://www.terraform.io/docs/commands/output.html#use-in-automation" rel="noopener noreferrer"&gt;the documentation of the output command&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Λ\: terraform output -json kubernetes_cluster_name | jq -r .
dev-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here we are! &lt;/p&gt;

&lt;p&gt;Thanks &lt;a href="https://github.com/stedolan/jq" rel="noopener noreferrer"&gt;jq&lt;/a&gt; to be there 😁&lt;/p&gt;

&lt;p&gt;We can find some other alternative, like using &lt;code&gt;tr -d '"'&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform output -json kubernetes_cluster_name | tr -d '"'
dev-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this will delete every &lt;code&gt;"&lt;/code&gt; from the output, not only the surround one. &lt;/p&gt;

&lt;p&gt;I will prefer using &lt;code&gt;jq&lt;/code&gt; to digest a json input.&lt;/p&gt;

</description>
      <category>terraform</category>
    </item>
  </channel>
</rss>
