WordPress, Git et l'intégration continue

Retour d'expérience et outils...

WordCamp Lyon / 5 juin 2015

Qui suis-je ?
Consultant technique web

Développements spécifiques, création de site, constitution d'équipes, accompagnement, méthodes agiles...

Mon crédo, si c'est technique et web, ça m'intéresse 

  https://chstudio.fr

  s.hulard@chstudio.fr

  @s_hulard

  http://github.com/shulard

Pendant cette session...

  1. L'intégration continue
  2. Avec WordPress
  3. Méthodes et outils

L'intégration continue

Qu'est-ce que c'est ?

Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly.
Martin Flower

À quoi ça sert ?

  • Se rendre compte de ses erreurs automatiquement
  • Avoir accès aux derniers développements
  • Suivre l'évolution du travail en cours

Bénéfices

  • Fiabilisation des développements
  • Automatisation des tâches récurentes
  • Gain de temps

Pour qui ?

  • Les grandes équipes
  • Les utilisateurs des méthodes agiles
  • Les gros projets
  • Mais pas que...

Avec WordPress

Vraiment, mais pourquoi ?

J'entends tout le temps :

  • WordPress c'est juste pour faire des blogs !
  • WordPress c'est mal codé !
  • WordPress c'est pas fait pour les devs !

Alors, pourquoi autant de sites l'utilisent ?

Il a ses avantages

  • Utilisé sur plus de 23% des sites web
  • Une interface claire, et très intuitive
  • Facile à mettre en place
  • Très bien documenté
  • Une importante communauté
  • Une modularité incroyable

C'est seulement un outil !

  • Il faut le comprendre, le connaitre...
  • S'il n'est pas adapté, il faut en choisir un autre...

Quelles contraintes ?

Différents environnements avec différentes configurations :

  • Développement en local, ici tout et possible!
  • Production sur serveur client (mutualisé, dédié, ...) on ne maitrise rien ici...

Un cycle de vie des données (BDD, images) à gérer !

Méthodes et outils

Le contrôle de version

Sécurisation du code et historique des modifications :

L'automatisation

  • Initialisation du fichier wp-config.php
  • Initialisation de la base de données
  • Sauvegarde / Restauration des contenus (images et BDD)
  • Gestion des différents environnements (dev, préprod, prod)

Objectif: Simplifier les tâches critiques et automatiser !

Des besoins compliqués ...

  • Versionning, tag, branches
  • Imports SQL en ligne de commande
  • RSync: Synchronisation de fichiers vers un serveur distant par SSH
  • Validation du code (PHPLint, Behat/Mink, PHPUnit...)

... mais des solutions existent

Beaucoup se sont posés la question, leur expérience est précieuse !

Des outils sont capables de manipuler :

  • Un environnement PHP
  • Git / SVN
  • MySQL
  • Configuration du serveur web

Un modèle de projet

Création d'un projet type pour l'intégration WordPress :

  • Une structure duplicable très rapidement
  • Versionné sous Git et dispo sur GitHub

  https://github.com/CHStudio/wordpress-project1

La commande est mon amie

La plupart des outils s'utilisent en ligne de commande.

Il faut apprendre à dompter le terminal, Bash, SSH pour qu'ils deviennent des alliés.

Phing

Phing est un système de build basé sur Apache Ant :

  • Un fichier XML décrit les tâches1
								
  
    
      
      
    
    
      
    
    
      
      
    
  
								
							
  1. https://github.com/CHStudio/wordpress-project/blob/develop/build.xml

WP-CLI

WP-CLI est une série de commandes pour gérer les installations WordPress :

  • Ajout d'utilisateurs, gestion des droits
  • Gestion de termes, des posts, des thèmes, des sidebars...
  • Tout ça en ligne de commande
								
  $ bin/wp export
  $ bin/wp is-installed
  $ bin/wp install --url="http://monsite.com" --title="un super site !"
  $ bin/wp post create
  $ bin/wp rewrite list
								
							

Combinés pour simplifier

								
  $ phing env:init		-> Générer la configuration
  $ phing env:install		-> Initialser configuration et BDD
  $ phing db:backup		-> Créer un dump de la BDD au format SQL
  $ phing wp:uploads:restore	-> Restaurer une archive des images
  $ phing sync:execute		-> Synchroniser un environnement distant
								
							

Dépendances avec Composer

Quels outils sont utiles au projet ?

								
  {
  	"name": "chstudio/wordpress-project",
  	"description": "A sample initialization project for WordPress website",
  	"license": "Apache-2.0",
  	"authors": [
  		{ "name": "Stephane HULARD", "email": "s.hulard@chstudio.fr" }
  	],
  	"config": {
  		"bin-dir": "bin"
  	},
  	"require": {},
  	"require-dev": {
  		"phing/phing": "2.*",
  		"wp-cli/wp-cli": "0.*"
  	}
  }

								
							

Installation avec Composer

Une commande pour les trouver !
Une commande pour les amener tous !
Et dans un projet les lier...

								
  # En local
  $ composer install

  # En production
  $ composer install --no-dev --optimize-autoloader --prefer-dist --no-interaction
								
							

 Le fichier composer.lock doit être versionné!

Git branching model

Structurer et normaliser le flux de développement avec git: Git Flow

  • Développement
  • Releases
  • Production
  • Maintenance

Et HOP dans le Cloud !

GitLab pour gérer les dépôts, gratuit et avec la possibilité de créer des dépôts privés !

GitLab

  • Des dépôts centralisés et accessibles en HTTP / SSH
  • Installation simplifiée et accès sécurisé par clé SSH
  • Gestion des tickets
  • Sauvegarde du code source des projets

Récupérer les sources et installer le projet :

								
  $ git clone
  $ composer install --no-dev --optimize-autoloader --prefer-dist --no-interaction
  $ bin/phing env:install --Dbuild.env=PROD
  $ bin/phing db:restore --Dbuild.env=PROD
  $ bin/phing wp:uploads:restore --Dbuild.env=PROD
  $ bin/phing wp:migrate --Ddomain.previous=http://monsite.dev --Ddomain.previous=http://monsite.com
								
							

GitLab CI

  • Plateforme d'intégration continue gratuite avec GitLab
  • Un build est généré pour chaque commit sur le projet

GitLab CI: Un build ?

Un build est une série d'étapes totalement automatisées, qui seront exécutées sur chaque commit.

Il permet de faire tout ce qui est nécessaire :

  • Tests unitaires et fonctionnels
  • Validation du code (PHP CodeSniffer par exemple)
  • Déploiement automatique en cas de succès

Le projet devient autonome...

GitLab CI: Liste des builds

  • Visualisation de l'état de chaque commit
  • Accès aux statistiques sur le projet

GitLab CI: Log d'un build

  • Visualisation du retour d'exécution des commandes
  • Utile pour savoir d'où viennent les soucis

Un couple efficace

  • L'intégration native entre les deux plateformes simplifie fortement l'installation...
  • Les builds peuvent être exécutés n'importe où :
    • Aucune nécessité d'avoir un serveur
    • Lancement en local très simple

D'autres solutions existent

Avec de nouvelles contraintes et possibilités !

Merci pour votre attention !
Des questions ?

https://shulard.github.io/talks/wordcamp-lyon-2015/