Quelle version de Drupal est supportée + gestion de la compatibilité ascendante ?

Pour un DSI, un site se gère sur la longueur. Il doit minimiser le fardeau de la maintenance et des évolutions tout en assurant sa pérennité maximale.

Deux problématiques principaux se posent à lui par rapport au cycle de vie du produit qu’il à choisi : les corrections de bug et les mises à jour de sécurité d’une part et la gestion de la compatibilité ascendante d’autre part.

Pour Drupal la politique est la suivante. Les  nouvelles releases sont numérotés par 2 chiffres : une version majeure, et une version mineure. Par exemple actuellement nous sommes en Drupal 7.24

  • les changements de version majeure brisent la compatibilité ascendante mais permettent des évolutions fonctionnelles et d’API majeures. Si on veut monter en version il faut donc le prévoir en amont.
  • les changements de version mineures apportent surtout des corrections de bugs, des patch de sécurités, et des évolutions mineurs, mais surtout, ne brisent pas la compatibilité ascendante. On peut donc (et c’est même recommandé pour des questions de sécurité) faire ces mise à jour « les yeux fermés » (idéalement, car dans la pratique il faut quand même prendre des précautions élémentaires).
  • La communauté supporte la version n-1. C’est à dire que Drupal 6 ne sera supporté que jusqu’à la sortie de Drupal 8.

Mais les difficultés de développement de Drupal 8, ainsi que l’évolution rapide de web imposent de revoir cette politique. Même si ce n’est pas encore définitif, il semble que la communauté Drupal s’achemine vers une nouvelle manière de gérer le cycle de vie de Drupal, dite, « release sémantique« .

De quoi s’agit-il ?

  • Les évolutions « mineures » (celles qui ne brisent pas ou très peu la compatibilité ascendante) de Drupal se feront selon un cycle de 6 mois, afin de pouvoir intégrer plus rapidement les nouveautés dans le cœur.
  • Les évolutions « majeures » (celles qui brisent la compatibilité ascendante) disposeront d’un support LTS assuré en version n-1 pour les correction de bugs et en version n-2 pour les patchs de sécurité, mais uniquement à partir de la dernière évolution mineure.

Dans la pratique cela devrait permettre un cycle de vie d’un site d’environ 5 ans avec une fenêtre d’un peu plus d’un an pour faire évoluer son site en version n+2. Ce qui semble assez raisonnable comme compromis.

Les montées en version de Drupal ne sont pas sans poser de problèmes. Il y a 4 aspects à considérer :

  • le coeur de Drupal en principe dispose d’un « chemin d’upgrade » qui fait évoluer la base de donnée afin que le site soit toujours fonctionnel
  • les thèmes (l’habillage) est à revoir en grande partie. D’une part parce que les API changent, d’autre part pour s’adapter aux nouveaux standards du web en la matière.
  • pour les modules communautaires, c’est au cas par cas. Les plus populaires disposent en général d’un chemin d’upgrade comme le coeur de Drupal, mais c’est loin d’être une règle générale. Il faut donc s’attendre devoir faire évoluer les données en base soi même, avec des requêtes SQL.
  • reste ensuite le code custum. Plus il sera important en proportion, plus l’opération sera lourde et risquée.

Le cas de Drupal 8 est la encore différent. Il n’y aura pas de « chemin d’upgrade » depuis Drupal 7 car les architectures sont trop différentes. Pour l’instant, il semble que le choix se porte sur le module « Migrate » qui aura en charge d’aspirer les données des anciens sites. Mais ce module n’est pas magique et demande un certain travail de configuration / développement. C’est un choix stratégique qui, même s’il pénalise un peu les usager de Drupal, pourrait permettre de convertir plus facilement des sites non Drupal (WordPress, Typo3, phpBB) et d’attirer encore plus de monde vers Drupal.

Drupal, histoire et part de marchés

Quelques dates clés :

  • 1999 : Dries Buytaert commence à travailler sur ce qui deviendra Drupal.
  • 2001 : C’est en janvier 2001 que le site Drupal.org est mis en ligne et que le code de Drupal est mis à disposition.
  • 2005 : avec la version 4.5, Drupal commence à faire effet boule de neige et à attirer de plus en plus de monde dans sa communauté (multiplication des conférences et sprints de code).
  • 2008 : Drupal commence à s’imposer en entreprise avec sa version 6 grâce la réputation de son code « developer friendly » et grâce à ses awards en tant que meilleur CMS.
  • 2011 : Drupal 7, sorti en 2011 signe la consécration en tant que leader des CMS d’entreprise Open Source.

Actuellement Drupal, WordPress et Joomla sont les 3 leaders pour la conception des sites web mais ne s’adressent pas au même  segments de marchés :

  • WordPress détient la plus grosse part de marché des CMS avec presque 60% (soit 20% des sites web en général). Mais il s’adresse principalement aux blogueurs.
  • Joomla, qui est orienté petites communautés / associations détient 9% des parts de marchés des CMS et pèse 3.2% des sites web.
  • Drupal, leader en entreprise représente 5.6% des part de marchés des CMS pour 1.9% des sites web.

Mais alors que Joomla est en perte de vitesse, la croissance annuelle de Drupal est 2X plus rapide que celle de WordPress, grâce au charisme de son leader et au dynamisme de sa communauté, entre autre.

Drupal est utilisé par des sites prestigieux : Twitter, Maison Blanche, NASA, MTV, portail du gouvernement, France culture, Rue89, le Figaro, etc…

Au sein de Drupal lui même plus de 50 % des sites sont en version 7, le reste étant du Drupal 6 (43.5%), Drupal 5 étant marginal (3.5%).

Comparatif Drupal 7 et 8 : page hello world

Voici les différences entre un module « hello world » le plus simple possible, entre Drupal 7 (code source) et Drupal 8 (code source).

Drupal 7 Drupal 8
hello.info hello.info.yml
name = Hello world
description = Minimanlist Hello World in Drupal 7
package = helloworld
core = 7.x
files[] = hello.module
name: Hello World module
type: module
description: An Hello World module showing D8 capabilites
package: Example modules
core: 8.x
hello.module hello.module
<?php

function hello_menu() {

  $items = array(
      'hello_world' => array(
        'title' => 'Hello world',
        'page callback' => '_page_hello_world',
        'access callback' => TRUE,
      ),
    );

  return $items;
}

function _page_hello_world() {
  return array(    '#markup' => '<p>Hello world page text (from module) !</p>' );
}
<?php
function hello_menu() {
  $items['hello'] = array(
    'title' => 'Hello Page',
    'route_name' => 'hello.world',
  );
  return $items;
}
 hello.routing.yml
# hello.routing.yml
hello.world:
  path: 'helloworld'
  defaults:
    _content: '\Drupal\hello\HelloRouteController::index'
  requirements:
    _permission: 'access content'
 /lib/Drupal/hello/HelloRouteController.php
<?php

namespace Drupal\hello;

class HelloRouteController {

  public function index() {
    return array('#markup' => 'Hello workd page text (from controller) !');
  }

}

Comme on peut le voir, le .info est convertit en fichier YAML .info.yml. Pas de grosses différences à ce stade.

Par contre le .module est éclaté en 3 parties. Le hook_menu persiste mais est scindé en 2. Le routing se fait maintenant dans un fichier .routing.yml. Il ne reste plus que la définition du titre du menu dans le module. La callback est quand à elle transformée en controller. En effet, le système de menu de Drupal 7 est remplacé par le routing Symfony2. C’est plus compliqué à écrire, mais c’est aussi plus puissant.