Construire un environnement de développement réplicable

mardi 19 septembre 2023

Dans les systèmes UNIX, la configuration des outils spécifique à l'utilisateur est traditionnellement stockée dans ce que l'on appelle des dotfiles — littéralement, des fichiers dont le nom est préfixé d'un point.

En voici plusieurs exemples concrets :

Nom du programme Chemin du fichier de configuration
bash ~/.bashrc
git ~/.gitconfig
tmux ~/.tmux.conf
vim ~/.vimrc

Il est courant de traquer l'évolution de ses dotfiles à l'aide d'un système de contrôle de version tel que Git. C'est à dire : créer un dépôt (souvent public) (avec potentiellement plusieurs branches) dans lequel ces fichiers sont suivis. Cela permet de facilement répliquer un environnement d'une machine à l'autre.

Différentes approches existent pour maintenir ce dépôt Git :

  • Par exemple, il est possible de traquer directement les fichiers dans le répertoire personnel ;
  • Alternativement, il est aussi possible de les stocker dans un sous-répertoire arbitraire et créer un lien symbolique / copier / générer des fichiers avec un script shell ou un outil dedié tiers.

Dans la suite de cet article, je vais vous exposer la méthode que j'affectionne et que je trouve élégante : l'utilisation d'un dépôt Git nu.

Pour les néophytes, comme pour les plus accomplis, voici un tableau expliquant brièvement la différence entre dépôt classique et dépôt nu dans Git :

Type de dépôt Caractéristiques Schématisation
Classique Un dossier .git existe à la racine du dépôt et contient toutes les donnés et métadonnées liés à l'état dudit dépôt.
work_tree/
├── .git/
│   └── (data & metadata)
├── file_1
├── file_2
└── file_3
Nu
(bare en anglais)
La copie de travail (work tree en anglais) et l'équivalent du .git (git dir) sont stockés dans des répertoires différents.
work_tree/
├── file_1
├── file_2
└── file_3
 
git_dir/
└── (data & metadata)

Partir de zéro

La première chose à faire est d'initialiser le dépôt Git nu. Le processus à suivre est le suivant. Chaque étape est décrite ci-après.

# Define temporary variables
export GIT_DIR="$HOME/.dotfiles"
export WORK_TREE="$HOME"

# Initialize the repository
git init --bare "$GIT_DIR"
alias dotfiles='/usr/bin/git --git-dir="$GIT_DIR" --work-tree="$WORK_TREE"'
dotfiles config --local status.showUntrackedFiles no

# Persist the alias (bash only)
echo "alias dotfiles='/usr/bin/git --git-dir=\"$GIT_DIR\" --work-tree=\"$WORK_TREE\"'" >> $HOME/.bashrc
  • Premièrement, des variables sont définies par commodité.
  • Ensuite, le dépôt Git nu est initialisé.
  • Après, l'alias dotfiles est créé. Il est à utiliser à la place de la commande git.
  • Puis, un flag — local au dépôt — est positionné pour masquer les fichiers qui ne sont pas explicitement suivis. Ainsi, ces fichiers ne sont pas remontés dans la sortie de commandes telles que dotfiles status.
  • Enfin, l'alias est persisté pour une utilisation future.

Après que cette mise en place ai été effectuée, n'importe quel fichier du dossier $HOME peut être versionné avec des commandes Git normales, en remplaçant git par l'alias dotfiles créé précédemment, comme suit :

dotfiles add ~/.bashrc
dotfiles add ~/.gitconfig
dotfiles add ~/.tmux.conf
dotfiles add ~/.vimrc
dotfiles commit --message "Add various files"
dotfiles push [args]

Déloyer ses dotfiles sur une nouvelle machine

Les instructions à suivre sont sensiblement les mêmes que lors de la création. Au lieu d'être initialisé, le dépôt est cloné :

# Define temporary variables
export GIT_DIR="$HOME/.dotfiles"
export WORK_TREE="$HOME"

# Clone the repository
git clone --bare <repository> "$GIT_DIR"
alias dotfiles='/usr/bin/git --git-dir="$GIT_DIR" --work-tree="$WORK_TREE"'
dotfiles checkout <branch> -f
dotfiles config --local status.showUntrackedFiles no

Conclusion

Comme énoncé précédemment, d'autres méthodes de synchronisation existent. En tout cas, je vous encourage à traquer vos dotfiles en utilisant celle qui vous convient le mieux.

Pour les curieux, mes dotfiles sont publics.


Profile picture

Blog personnel de Bryton Lacquement.
Leader technique. Coincé dans Vim. Sûrement nerd.