Mettez à jour facilement vos projets basés sur des templates Github avec template-sync
Publié le 05 décembre 2023
Pour lancer de nouveaux projets, plusieurs framework populaires comme API Platform, Next.js ou Symfony Docker nous simplifient la tâche en proposant des distributions prêtes à l’emploi. Vous n’êtes donc pas sans savoir que les templates sont régulièrement mis à jour dans le but d’améliorer les performances des technologies existantes ou de s’adapter aux nouvelles. Il se peut alors que vous ayez rencontré les mêmes difficultés que nous lorsque vous avez voulu mettre à jour votre projet.
Mettre à jour les templates sur un projet existant peut en effet être fastidieux et source de nombreuses interrogations :
- Que garder ?
- Que jeter ?
- Pourquoi cela ne marche pas ?
Pour s’y retrouver plus facilement et gagner du temps lors de cette démarche, nous avons voulu automatiser un maximum le processus, c’est pour cela que nous avons créé template-sync.
Qu’est ce qu’un template repository ?
Avant de se lancer dans les explications concernant l’outil, définissons ce qu’est un template repository. La définition donnée sur la doc Github est la suivante : “You can create a template from an existing repository. Anyone with access to the template repository can create a new repository based on the template with the same directory structure, branches, and files”.
L’avantage de passer par ce biais est donc clairement d’avoir accès rapidement à la création d’un nouveau repository, reprenant toute la structure les branches et fichiers du dépôt template. Le dépôt créé est donc utilisable quasi instantanément.
La création de template-sync
Lors de la mise en ligne de FrankenPHP, nous avons voulu tester son fonctionnement et le gain de performance qu’il engendre sur des projets. Au départ, nous créions des projets simples à partir du template que nous avons complexifié petit à petit. Puis nous avons voulu le tester sur des projets existants. C’est à partir de ce moment-là que nous nous sommes aperçus de la difficulté que pouvait poser ce genre de mise à jour, notamment, dans notre cas, sur des projets avec des Dockerfile un peu plus complexes.
Nous avons donc décidé de créer un script automatisant le processus pour les prochaines fois où cette situation se représentera (c’est dommage de perdre trop de temps en installant un outil censé nous faire gagner en performance ^^).
D’abord, il faut choisir la technologie à utiliser. Comme notre objectif est de proposer une utilisation la plus générique possible, nous avons décidé de l’écrire en shell. À partir de là, plusieurs solutions ont été envisagées : ajout, suppression et modification de fichiers, mais cela nous obligeait à gérer trop de structures différentes en fonction de la distribution ciblée. Nous avions également pensé à utiliser les commandes diff et patch car elles sont présentes par défaut sur la plupart des systèmes UNIX. Cependant, si cela facilitait le travail sur les fichiers, l’interface n’était pas des plus user friendly et la gestion de certains conflits et des renommages manquaient d’options built-in. C’est pourquoi nous avons choisi d'utiliser Git qui propose à la fois des commandes puissantes et hautement personnalisables mais aussi des interfaces dédiées dans la plupart des IDE.
Le fonctionnement de template-sync
Template-sync permet de :
- Créer un algorithme permettant de calculer un “indice de similarité” entre la distribution et le projet ciblé.
- À l’aide de cet algorithme, identifier ensuite dans l’historique de la distribution le commit le plus proche de l’état actuel du projet
- Créer un diff entre ce commit et l’état actuel de la distribution
- Appliquer ces modifications sur le projet.
Après une exploration de la documentation de Git et la découverte d’options obscures (et encore une fois de la puissance de cet outil) pour franchir les différentes embûches, nous sommes arrivés à une version fonctionnelle qui donnait satisfaction sur les différents projets où nous l’avions testée. Nous avons testé notre outil avec Next.js et avons constaté des dysfonctionnements. Nous avons effectivement réalisé que l'outil fonctionne de manière efficace avec les modèles qui ont leur propre référentiel. Or, Next.js propose une variété de modèles, tous regroupés dans le dépôt principal.
Une fois de plus, la puissance des commandes Git (utilisées ici pour recréer un historique spécifique à un sous-dossier) s'est avérée d'une grande utilité. N’hésitez pas à tester notre outil et à nous dire ce que vous en pensez !