
Ma première Pull Request 😍
Comme je l'ai mentionné dans le post sur la stack technique du blog, j'utilise le logiciel Publii.
Pour publier sur le bucket S3 de Clever Cloud, il me fallait générer l'arborescence des fichiers dans un dossier local puis synchroniser ce dossier avec le bucket à l'aide de rclone. Bon pas vraiment la mer à boire mais j'avais noté dans les options de Publii qu'il était possible de publier directement sur un bucket S3 AWS (sans passer par une étape intermédiaire en local). Du coup une question m'est vite venue à l'esprit:
Si on peut publier directement sur un S3 AWS et que le service cellar de Clever Cloud est compatible S3, ne serait-il pas possible de rendre compatible Publii avec le service de Clever ?
Au-delà de mon confort personnel, je me suis dis qu'en plus c'était pas déconnant de faciliter l'accès aux alternatives d'AWS (GAFAM, Cloud Act, toussa toussa). Et puis ça me fait un sujet supplémentaire pour le blog 😉
Etape 1 : Forker le dépôt
Vous l'aurez compris, Publii étant opensource ❤️, il est assez facile d'aller voir comment ça tourne sous le capot. Le plus simple quand on veut contribuer, c'est de forker le repo Github et de faire tourner le bouzin en local. C'est parti !
Tout d'abord on va voir le dépôt Github de Publii, on s'assure d'être connecté à Github avec son propre compte et on fork (bifurquer en bon français) le dépôt:


Une fois que c'est fait, on récupère le dépôt en local, on crée une branche dédiée à la fonctionnalité et on ouvre son éditeur préféré.
❯ git clone https://github.com/Irbiis/Publii.git
Cloning into 'Publii'...
remote: Enumerating objects: 27, done.
remote: Counting objects: 100% (27/27), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 13495 (delta 4), reused 8 (delta 2), pack-reused 13468
Receiving objects: 100% (13495/13495), 11.29 MiB | 76.00 KiB/s, done.
Resolving deltas: 100% (9809/9809), done.
❯ cd Publii/
❯ git co -b s3_compatible_providers
Switched to a new branch 's3_compatible_providers'
❯ code .
Etape 2 : Etudier l'existant
Pour commencer on va essayer de faire tourner l'appli en local, et pour ça on va s'aider de la doc :

Bon je vous passe les détails, j'en ai un peu chié au début (je sais pas trop pourquoi mais l'app ne voulais pas builder avant que je fasse un reboot du PC).
En vrai ça se résume en quelques lignes (après avoir installé tous les paquets nécessaires) :
# Dans un premier shell, on fait tourner webpack en mode dev qui va gérer la partie VueJS
❯ npm run dev
# Dans un deuxième, on lance un gulp qui va gérer le reste et lancer electron en mode dev
❯ npm run build
# Et si on veut voir les autre commandes npm à notre disposition, on peut rapidement aller regarder le package.json
❯ less package.json
En regardant un peu le code et la doc, on voit très vite la stack technique de l'appli :
- le moteur est codé en NodeJS
- Handlebars est utilisé pour le templating
- l'interface est en VueJS
Electron est utilisé pour que l'app soit empaquetée comme une application "native", que ce soit sur Linux, Mac ou Windows alors même qu'elle est basée sur des technologies web. C'est pas mal foutu mais Electron est souvent accusé de bouffer beaucoup de ressources (et je confirme, Publii ne fait pas exception).
Bon, du coup on est sur une stack 100% javascript. Ça part pas très bien, j'ai quelques notions en JS et en Vue mais rien d'extraordinaire. Mais bon, on se démonte pas. Du coup on commence par essayer de relier ce qu'on voit dans l'interface avec le code et voir comment tout ça réagit quand on bouge 2-3 trucs.
Ensuite j'essaye de voir où se trouve le code qui a la charge de la connexion avec le service s3 qui est sensé hébergé le site. Je me rends compte assez vite que cette partie est gérée par une librairie externe (aws-sdk).
Et merde
Là je me dis que si c'est le SDK d'Amazon, y a moyen que les types aient verrouillé le truc pour qu'on puisse utiliser la lib uniquement avec AWS, que je vais devoir réécrire beaucoup plus de trucs que prévu... Que nenni ! Le SDK est compatible avec n'importe quel service S3 (il y a juste besoin de préciser le endpoint custom), et c'est une très bonne surprise 🎉
Etape 3 : Mettre les mains dans le cambouis
Bon je vais pas rentrer dans les détails des modifs qui ont été faites, mais au moins présenter ce je voulais voir apparaître dans l'appli et le résultat final.
Du coup sur la partie backend, pas de grosses modifications en vue : il suffit de rajouter le endpoint dans la méthode qui permet la connexion au bucket si la variable s3.customProvider est à true.
Côté Vue JS en revanche, j'en ai un peu chié pour aller au bout (j'y ai passé une bonne partie de mon weekend). Bref. Voici le résultat :
Pour l'occasion j'ai ouvert un compte AWS au moins pour tester qu'il n'y avait pas de régression et j'ai pu tester que ça marchait comme attendu avec mon compte Clever.
Dernière étape : La Pull Request
Et voilà, les modifications faites, il faut donc commiter tout ça et faire une Pull Request au dépôt principal (upstream) pour espérer voir ces changements dans l'appli.
C'est tipart mon canard :
# J'en entends déjà certains s'étrangler, mais ici c'est pour simplifier
❯ git add .
# Notez le "Closes #596", il permet de fermer une issue ouverte dans le repo principal (quand la PR sera mergée)
❯ git ci -m "Allow publishing to any S3 provider (not only AWS).Closes #596"
# Et on pousse sur notre dépôt
❯ git push -u origin s3_compliant_support
Jusque là on a simplement ajouter ces modifs à notre repo forké. Ne reste plus qu'à créer la PR dans l'interface de Github, de mettre un texte gentil (en anglais) et basta !
Aussitôt dit, aussitôt fait :

Et on va attendre de voir si c'est mergé dans la branche master 🤞
Conclusion : Une Pull Request est sûrement quelque chose de tout à fait banal pour de très nombreux développeurs, pour autant ce n'est pas forcément un réflexe pour les non-initiés dont je fais partie.
Et je me suis bien amusé à faire ces modifs 😃 Ça m'a appris qu'il n'y avait pas forcément besoin d'être un expert pour pouvoir contribuer (je dis ça, la PR est pas encore approuvée 😉). Par contre, ça prends du temps, surtout quand on n'est pas à l'aise avec la techno.
Edit : PR approuvée et mergée. Les modifs ont été intégrées dans la version 0.38 de l'app.





