Bedrock logo

Whoami

Louis-Michel Couture

Wordpress en 2015

Les problèmes de Wordpress vus de la perspective des devops.

  • Difficile d’avoir plusieurs environnements (Dev, Staging, Production)
  • Commiter les plugins? (Problèmes de version, lourd, compliqué a synchroniser entre les environnements)
  • Commiter le core? (ewww)
  • Difficile de synchroniser les uploads entre les différents environnements.
  • Structure de fichier non idéale (pas de séparation entre notre code et les vendors / core

Bedrock

12 factor appliqué (dans la mesure du possible) à Wordpress. Version Wordpress

Les requis

Bedrock

  • Git
  • PHP >= 5.4
  • Ruby >= 1.9 (for Capistrano)
  • Dans le cas d’un hébergement partagé: (trois requis pour installer Composer)
    • allow_url_fopen = on dans php.ini (important ça doit être dans le php.ini du PHP CLI)
    • apc.enable_cli=Off dans php.ini (important ça doit être dans le php.ini du PHP CLI)
    • la possibilité d’exécuter les fichier .phar

Les requis

Bedrock Ansible

  • Ansible >= 1.6
  • Virtualbox >= 4.3.10
  • Vagrant >= 1.5.4
  • Vagrant-bindfs >= 0.3.1 - Docs (Pas nécessaire pour les utilisateur Windows)
  • Ubuntu 14.04 guest OS

Fonctionalités de Bedrock

  • Gestion des dépendances Composer
  • Déploiement automatisé Capistrano
  • Structure de dossier améliorée
  • Configuration de Wordpress avec des fichier d’environnement
  • Environment variables avec Dotenv
  • Environnement de développement et de déploiement avec Vagrant et Ansible
  • Autoloader pour les mu-plugins (Permet d’utiliser des plugins normaux comme des mu-plugins)

Gestion des dépendances Composer

Fini les téléchargement de plugins wordpress en .zip, et les mise-à-jour en FTP

  • Chaque plugin Wordpress est un package Composer
  • http://wpackagist.org/
  • Gestion des dépendances dans le ficheir composer.json
  • Possibilité de locker les version
"require": {
  "php": ">=5.4",
  "johnpbloch/wordpress": "4.1.1",
  "composer/installers": "v1.0.12",
  "vlucas/phpdotenv": "~1.0.9",
  "koodimonni-language/core-fr_fr": "*",
  "acf/advanced-custom-fields": "5.2.1",
  "wpackagist-plugin/intuitive-custom-post-order": "3.0.4",
  "wpackagist-plugin/regenerate-thumbnails": "2.2.4",
  "gavityforms/gravityforms": "1.9.3"
},

Ajouter un plugin externe

Il est possible d’ajouter des plugins externes, n’utilisant pas Composer, en tant que packages Composer. Example (ACF pro):

{
  "type": "package",
  "package": {
    "name": "acf/advanced-custom-fields",
    "version": "5.2.1",
    "type": "wordpress-plugin",
    "dist": {
      "type": "zip",
      "url": "http://connect.advancedcustomfields.com/index.php?p=pro&a=download&k=licencekey"
    },
    "require" : {
      "composer/installers": "~1.0"
    }
  }
},

Struture de fichier

├── Capfile
├── composer.json
├── config
│   ├── application.php
│   ├── deploy
│   │   ├── staging.rb
│   │   └── production.rb
│   ├── deploy.rb
│   └── environments
│       ├── development.php
│       ├── staging.php
│       └── production.php
├── Gemfile
├── vendor
└── web
    ├── app
    │   ├── mu-plugins
    │   ├── plugins
    │   └── themes
    ├── wp-config.php
    ├── index.php
    └── wp

Configuration d’environnement

Par défault, Bedrock inclue 3 fichiers d’environnement:

  • Development (local)
  • Staging
  • Production
<?php
/* Production */
define('DB_NAME', getenv('DB_NAME'));
define('DB_USER', getenv('DB_USER'));
define('DB_PASSWORD', getenv('DB_PASSWORD'));
define('DB_HOST', getenv('DB_HOST') ? getenv('DB_HOST') : 'localhost');

define('WP_HOME', getenv('WP_HOME'));
define('WP_SITEURL', getenv('WP_SITEURL'));

ini_set('display_errors', 0);
define('WP_DEBUG_DISPLAY', false);
define('SCRIPT_DEBUG', false);
define('DISALLOW_FILE_MODS', true); // this disables all file modifications including updates and update notifications

Variables d’environnement

Permet de charger les configurations comme les information de la connection BD et tout autre configuration comme les clef d’API externe. Les configurations sont gardées dans un fichier .env qui n’est pas commité. On garde ainsi les données sensible en dehors du repo git.

Exemple d’un fichier .env de développement:

DB_NAME=db_developement
DB_USER=db_user
DB_PASSWORD=password
DB_HOST=localhost

WP_ENV=development
WP_HOME=http://wordpress.dev/
WP_SITEURL=http://wordpress.dev/wp

Déploiement avec capistrano

Il est très facile de déployer avec Capistrano, s’agit de configuer les fichiers suivant avec les bonnes informations: config/deploy.rb avec les bonnes info de votre application:

  • set :application, 'lenomdevotreapplication'
  • set :repo_url, 'git@github.com:votre-projet.git'
  • set :deploy_to, -> { "/srv/www/#{fetch(:application)}" } Si vous ne voulez pas déployer à l’endroit par défaut (l’endroit par défaut est celui qui concorde avec le code de déploiement de Bedrock-Ansible).

Dans les fichier d’environnement config/deploy/*.rb, les information de connection au serveur(s).

  • server 'example.com', user: 'deploy', roles: %w{web app db}

Package de langues

Pour pouvoir utiliser Wordpress avec plus qu’une langue (anglais et français par exemple), il faut obtenir les fichiers de traduction relié au langage voulu.

Heureusement grace au travail de Onni Hakala, qui a préparé les packages de langue sur le site http://languages.koodimonni.fi. Il ne suffit que d’ajouter dans son composer.json:

Dans la section repository:

{
  "type": "composer",
  "url": "http://languages.koodimonni.fi"
},

Dans la section require:

"koodimonni-language/core-fr_fr": "*",

Package de langues

Dans la section extra:

"dropin-paths": {
  "web/app/languages/": ["vendor:koodimonni-language"],
  "web/app/languages/plugins/": ["vendor:koodimonni-plugin-language"],
  "web/app/languages/themes/": ["vendor:koodimonni-theme-language"]
}

WP-CLI

capistrano-wpcli permet d’utiliser les commandes de WP-CLI pour effectuer des synchronisation de base de donnée ou encore de fichier d’uploads.

Ajouter dans le gemfile:

gem 'capistrano-wpcli'

Puis dans le Capfile:

require 'capistrano/wpcli'

Rouler un bundle install

WP-CLI

Pour la BD

wpcli:db:push
wpcli:db:pull

Pour les uploads:

wpcli:uploads:rsync:push
wpcli:uploads:rsync:pull

DEMO

Ressources