Drush Make Driven Development

Qui suis-je ?


Sébastien Corbin
@SebCorbin

Développeur chez Makina Corpus

Drupal depuis 2009

Petit historique de la gestion de code sous Drupal

  1. En premier le FTP, pour les vieux des années 80

  2. Après y'a eu Git, pour éviter de perdre ses fichiers durant le transfert, mais c'est so 2005

  3. Ensuite y'a eu Features, parce que la conf en BDD: pas top, mais ça c'est encore so 2009

Le présent :
Drush Make

Au programme


  1. Quelques rappels (Drush et Make, Features, profils, Git, Migrate)

  2. Bonnes pratiques et bénéfices

  3. Retour d'expérience

Quelques rappels

Drush & Drush Make



"Drush, c'est la vie"
~ tout développeur ayant installé drush

Installation : https://drupal.org/project/drush

Documentation : http://www.drush.org/

Features

Projet : https://drupal.org/project/features

Features 1.0

  • Toujours viable tant que la v2 n'est pas stable

Features 2.0-rc1

  • Meilleure gestion des permissions
  • Meilleure gestion des instances de champs
  • Rétro-compatible

Quelques commandes utiles

drush fc # (features-components) liste les providers:components
drush fe feature_name provider:component # (features-export) exporte un composant
drush fu feature_name # (features-update) met à jour les composants
drush fr feature_name # (features-revert) rétablit la feature
drush fra # (features-revert-all) rétablit toutes les features activées
drush si profile_name # (site-install) installe le profil
drush make file.make # construit la base de code
drush cc all # prépare le café
    

Migrate

On a pas trouvé mieux pour intégrer rapidement du contenu à partir de fichiers XML

<?xml version="1.0"?>
      <nodes>
        <node id="actualites-page" title="Nos actualités" language="fr">
          <fields>
          <body>
            Lorem Ipsum Dolor Est Lorem Ipsum Dolor Est Lorem Ipsum Dolor Est Ipsum Dolor Est Lorem Ipsum Dolor Est Lorem Ipsum Dolor Est Lorem Dolor Est Lorem Ipsum Dolor Est Lorem Ipsum Dolor Est
          </body>
          <field_image>**GENERATE**</field_image>
          <field_date>now -10 days</field_date>
          </fields>
        </node>
      </nodes>

Migrate


Seule contrainte, faire les gestionnaires d'import

Permet une génération / import poussés

Plus parlant que le contenu de devel_generate

Astuces et Bonnes pratiques

Drush Make

  • Utile pour avoir la dernière version des projets

  • Spécifier les versions des projets que vous voulez patcher

  • Penser aux includes pour les modules souvent utilisées

  • Les patchs, c'est la vie, mangez-en

Un module en dev sans traduction ?

Oubliez :
projects[nodequeue][version] = 3.x-dev
libraries[nodequeue_fr][download][type] = "file"
libraries[nodequeue_fr][download][url] = "http://ftp.drupal.org/files/translations/7.x/nodequeue/nodequeue-7.x-2.0-beta1.fr.po"
libraries[nodequeue_fr][destination] = "modules/nodequeue"
libraries[nodequeue_fr][directory_name] = "translations"
libraries[nodequeue_fr][download][filename] = "fr.po"
La traduction sera installée à l'activation du module

Exemple bête de contrib


CKEditor ajoute des CRLF au lieu de LF à sa config exportée via Features (dû au navigateur)
drush clone ckeditor 
Fix du code embêtant, puis
git diff > adieu_souci.patch 
Partage/Mise en ligne de la solution sur drupal.org  https://drupal.org/node/1960268

Et enfin utilisation dans le projet
 projects[ckeditor][patch][] = "http://drupal.org/files/CRLF-issue.patch"

Drush et ses plugins

  • Drush issue queue
 drush patch 1960268#4 #applique le patch du 4e comment de l'issue
 drush iq-diff > file.patch #crée un patch formaté avec les infos de l'auteur

Support de git et des branches, indispensable au maintainers de module

  • Drush issue queue extras
 drush iq-submit

Poste directement le diff courant (formaté) dans l'issue

  • Pensez aux alias drush, dans drushrc.php
 $options['shell-aliases']['clone'] = "dl --package-handler=git_drupalorg --select";

Clone un module depuis git.drupal.org avec choix de la version

Exemple de fichier bash d'install

#!/bin/bash
if [[ "$#" > 0 && $1 = "make" ]]
then
#execute drush make
./"`dirname "$0"`/make.sh";
fi
. "profile_conf.sh";

#store session informations if site already installed
SESSIONS="$(mktemp 'sessions_XXXXXXXXXX')"; trap 'rm "${SESSIONS}"' EXIT
test "`drush st bootstrap --pipe 2>/dev/null`" == "Successful" && drush sql-dump --tables-list=sessions > "${SESSIONS}"

$drush si "${PROFILE}" --locale="${LOCALE}" --account-mail="${MAIL}" # etc...

#restore sessions if they were saved
test -f "${SESSIONS}" && drush sqlc < "${SESSIONS}" && echo "Sessions restored"

# features
drush fra -y --force || exit 1
drush cc all

# migration
drush mar
drush mi My_Migrate_Handler

# generation
drush en devel_generate asset_generate nodequeue_generate -y
drush gena 100 # assets
drush gent ville 15 # terms
drush genc 50 --types=actu,page,faq # content
drush dis devel_generate nodequeue_generate -y

drush sapi-r # index search api
      

Scroller...

Retour d'XP

L'intégrateur arrivant dans le projet à un site représentatif et qui fonctionne

../bin/make.sh

Un peu de configuration...

../bin/install.sh

Démo ! (ouais je suis un fou)

La génération du site permet à un dev d'entrer facilement dans un projet en cours

Lors de la mise en prod

chmod -x install.sh
puis ne fonctionner que sur des hook_update_N()

Le recettage est toujours possible (sous réserve de commits clean)

Possibilité de coupler ceci en mode intégration continue avec jenkins ou des git-hooks

Development -> re-génération automatique du site

Pré-production -> génération manuelle par le chef de projet

Contribution


Les fichiers d'exemple de Migrate, *.make seront bientôt mis en ligne sur le blog de Makina

Merci