Edit :
Le 5&6 février 2016 se tenait le WCParis 2016 auquel j’ai été conférencier le samedi 6 février « WP & GIT : déployer un projet sur plusieurs environnements » à voir aussi ici.
J’y ai évoqué les principes de GIT puis enchaîné sur les méthodes telles que capistrano, wp-config mutualisé, deploy, deploybot …
Quand on est un développeur abouti, on utilise forcément un outil de versioning. Que ce soit svn ou git, en centralisation sur un serveur local ou chez un hébergeur, je pense qu’il ne faut pas se dispenser de son utilisation que je qualifie de triple emploi et que je compare souvent aux fonctionnalités d’un google doc :
– outil de versioning : un historique permet de voir ce qui a été modifié et quand, ainsi pour une raison x ou y, il est possible de restaurer une version fonctionnelle, ou mieux comprendre les modifications ainsi réalisées.
– outil collaboratif : toutes les personnes autorisées ont accès aux dernières versions partagées et peuvent visualiser les contributions apportées par chacun.
– outil de déploiement: le partage/livraison et le contrôle sur l’intégrité des fichiers sont facilités.
Les basics sur GIT :
Je connais un tweeter, aussi développeur, pratiquant également du WordPress et qui plus est dans ma boîte, (le monde est petit) qui a déjà fait un assez gros travail, proposant ainsi un tutoriel complet pour s’initier à l’utilisation de GIT.
Allez lui rendre visite sur son blog (http://dev73.tweetpress.fr/dev/git-cest-la-vie.html) ça lui fera plaisir ! 🙂
Sinon, j’ai une autre source en anglais sur laquelle j’ai fait mes débuts : Learn version control with GIT
WordPress et GIT :
A partir de maintenant on considère que toutes les mises au point sont faites et on peut se lancer dans la structuration de son projet pour faire cohabiter WordPress sur de multiples environnements …
L’astuce consiste à créer autant de wp-config que d’environnements. Prenons l’exemple avec un écosystème disposant d’environnements de développement, qualification, pré-production et production. Nous allons donc avoir 4 wp-config : wp-config-dev, wp-config-qualif, wp-config-preprod et un wp-config.
1 – Des wp-configs dédiés
Chaque environnement a son propre wp-config avec ses variables qui lui sont propres, des fichiers bien particuliers à inclure et j’en passe. Nous allons donc créer un wp-config pour chaque environnement, que je nomme habituellement wp-config-{nom_de_l_environnement}.
Dans notre exemple nous aurions donc un wp-config-dev, wp-config-qualif, wp-config-preprod et c’est tout. Tout ce qui concerne la production reste dans le wp-config, ce n’est que dans un des trois autres cas qu’un autre wp-config prend le relais.
Le contenu de ces wp-config n’a rien de particulier, il peut reprendre l’équivalent du wp-config-sample et avec les configurations supplémentaires susceptibles de s’appliquer sur un environnement plus que sur un autre. Si on utilise ACF, on peut ajouter la variable ‘acf_lite’ qui vient masquer la page d’ACF dans le BO sur le serveur de pre-production et production, par exemple, afin que le client n’y parvienne pas par erreur et casse tout.
Voici les paramètres supplémentaires qui pourraient justifier cette implémentation sur un wp-config de production, clairement différent de celui de développement, par exemple :
[pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »%2F*%20Hide%20ACF%20BO%20page%20*%2F%0Adefine(%20’ACF_LITE’%2C%20true%20)%3B%0A%0Adefine(%20’WP_DEBUG’%2C%20false%20)%3B%0A%0A%2F*%20Disable%20plugins%20editor%20%26%20upgrades%20*%2F%0Adefine(%20’DISALLOW_FILE_MODS’%2C%20true%20)%3B%0Adefine(%20’DISALLOW_FILE_EDIT’%2C%20true%20)%3B%0A%0A%2F*%20Disable%20all%20core%20automatic%20updates%20*%2F%0Adefine(%20’WP_AUTO_UPDATE_CORE’%2C%20false%20)%3B%0A%0A%2F*%20Production%20Facebook%20App%20ID%20*%2F%0Adefine(%20’FACEBOOK_ID’%2C%20154789625484554%20)%3B%0A%0A%2F*%20Change%20revisions%20limitation%20%26%20autosave%20interval%20*%2F%0Adefine(%20’WP_POST_REVISIONS’%2C%205%20)%3B%0Adefine(%20’AUTOSAVE_INTERVAL’%2C%20300%20)%3B »/]
Maintenant que nos wp-configs sont créés pour tous nos environnements il faut faire en sorte que le bon se charge. Ces tests vont se réaliser dans le wp-config avant les variables de la production.
2 – Le wp-config, une plateforme tournante :
Il existe deux méthodes afin d’automatiquement détecter l’environnement et ainsi charger/utiliser des fichiers/variables propres à ce dernier. Le choix de l’une ou l’autre dépendra en grande partie de vos droits sur les serveurs. Il faudra donc recopier et adapter l’une des deux méthodes suivantes autant de fois que d’environnements. Cela se passe dans un premier temps dans le wp-config :
a – par détection d’un fichier :
[pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »if%20(%20is_file(%20dirname(%20__FILE__%20)%20.%20’%2F..%2Fenv_dev’%20)%20)%20%7B%0A%20%20%20%20%20%2F*%20Development%20Server%20*%2F%0A%0A%20%20%20%20%20if%20(%20is_file(%20dirname(%20__FILE__%20)%20.%20’%2F..%2Fwp-config-dev.php’%20)%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20require(%20dirname(%20__FILE__%20)%20.%20’%2F..%2Fwp-config-dev.php’%20)%3B%0A%20%20%20%20%20%7D%20elseif%20(%20is_file(%20dirname(%20__FILE__%20)%20.%20’%2Fwp-config-dev.php’%20)%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20require(%20dirname(%20__FILE__%20)%20.%20’%2Fwp-config-dev.php’%20)%3B%0A%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20die(%20’No%20dev%20config’%20)%3B%0A%20%20%20%20%20%7D%0A%7D%20%2F*%20Add%20as%20many%20configs%20as%20you%20want%20with%20elseif%20statement%20*%2F »/]
Je recommande cette première méthode car on n’est jamais mieux servi que par soit-même. Il faut néanmoins avoir la possibilité de créer un fichier avec la commande suivante :
[pastacode lang= »bash » message= » » highlight= » » provider= »manual » manual= »touch%20env_dev »/]
Il faut de préférence créer ce fichier au-dessus de la racine WP (ici public_html).
Sinon à la racine de WP, en ajoutant le fichier au .gitignore du projet et en transformant la ligne 1 en :
[pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »is_file(%20dirname(%20__FILE__%20)%20.%20’%2Fenv_dev’%20) »/]
b – par détection de l’url :
[pastacode lang= »php » message= » » highlight= » » provider= »manual » manual= »if%20(%20’dev_server.fr’%20%3D%3D%3D%20%24_SERVER%5B’SERVER_NAME’%5D%20)%20%7B%0A%20%20%20%20%20%2F*%20Development%20Server%20*%2F%0A%0A%20%20%20%20%20if%20(%20is_file(%20dirname(__FILE__)%20.%20’%2F..%2Fwp-config-dev.php’)%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20require(%20dirname(__FILE__)%20.%20’%2F..%2Fwp-config-dev.php’%20)%3B%0A%20%20%20%20%20%7D%20elseif(%20is_file(dirname(__FILE__)%20.%20’%2Fwp-config-dev.php’)%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20require(%20dirname(__FILE__)%20.%20’%2Fwp-config-dev.php’%20)%3B%0A%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20die(‘No%20dev%20config’)%3B%0A%20%20%20%20%20%7D%0A%7D%20%2F*%20Add%20as%20many%20configs%20as%20you%20want%20with%20elseif%20statement%20*%2F »/]
La méthode que je recommande le moins, car l’url n’est jamais safe, mais nécessaire quand on n’a pas la main/accès au serveur.
3 – Conclusion
Cette mutualisation du wp-config permet de gagner en efficacité et en flexibilité, c’est pourquoi je la recommande dès lors que l’on veut travailler avec plusieurs serveurs en simultané et que l’on utilise GIT comme outil de versioning et mais également afin de réaliser des livraisons de modifications.
Bonus sur GIT :
- GIT n’est pas forcément un prérequis sur les serveurs sur lesquels on travaille. En cherchant sur internet j’ai trouvé une alternative que je dois encore beaucoup mieux benchmarker, mais que je peux d’ores et déjà recommander.
C’est une extension qui permet depuis le BO d’un site d’avoir un tableau de bord pour GIT et faire les commandes de base. Vous trouverez l’extension ainsi qu’une review à l’adresse suivante : http://www.blogduwebdesign.com/plugin-wordpress/Revisr–Git-sauvegarder-production-plugin-Wordpress/1469 - Pour ceux qui sont encore sur SVN ou qui récupèrent de tels projets, je vous partage une méthode qui permet de convertir un SVN en GIT : https://github.com/nirvdrum/svn2git
Contribution :
Merci à Tita Créa pour la relecture.