15/02/2015

Sismo et composer sur serveur OVH mutualisé, même sans SSH

Ceci n'est pas une documentation sur l'utilisation de Sismo et/ou composer mais uniquement un tutoriel sur comment faire tourner ces deux outils sur OVH.

Pour mes besoins personnels, je me suis pris dernièrement un serveur web mutualisé chez OVH. Et pourquoi pas en profiter pour y mettre un serveur d'intégration continue ? Et là, il n'y a pas trop de choix. Pas moyen de mettre un Jenkins, il nous faut quelque chose en PHP. Et ce sera donc Sismo !

Installation de Sismo

Sismo est un petit serveur d'intégration continue écrit en PHP et développé par Sensio, les mêmes que ceux qui ont fait Symfony. Normalement, pour l'installer il suffit de déposer le seul et unique fichier php qui le constitue sur notre serveur.

Une des choses à savoir, c'est que Sismo se configure par le biais de variables d'environnements.
La deuxième chose à savoir, c'est que OVH ne permet l'accès qu'aux variables d'environnement préfixées par PHP_
Et comme vous vous en doutez, les variables d'environnement utilisées par Sismo ne commencent pas par ce préfixe !

Heureusement, en bons programmeurs, les développeurs de Sismo ont pensé à mettre une valeur par défaut. Mais là aussi il y a un problème car elle est basée sur une autre variable d'environnement: HOME

Là, pas de solution miracle, il faut modifier le code de Sismo.

Commençons par cloner le projet github :
git clone https://github.com/FriendsOfPHP/Sismo.git sismo

Maintenant, il va falloir modifier le fichier src/app.php. Sachant que vous adaptez Sismo pour vos uniques besoins, vous pourriez simplement mettre des valeurs en dur. Mais avouez que ça manque quand même cruellement d'élégance !

Je vous propose de renommer les variables d'environnement pour ajouter le préfixe PHP_ et de remplacer le chemin par défaut par __DIR__ qui désigne le répertoire où est installé Sismo.
Avec ça, vous gardez la possibilité de configurer Sismo avec quelques SetEnv dans un fichier .htaccess et vous vous assurez d'avoir un chemin par défaut fonctionnel dans tous les cas.

Il suffit de remplacer ces lignes dans le fichier src/app.php (lignes 35 à 37):

$app['data.path'] = getenv('SISMO_DATA_PATH') ?: getenv('HOME').'/.sismo/data';
$app['config.file'] = getenv('SISMO_CONFIG_PATH') ?: getenv('HOME').'/.sismo/config.php';
$app['config.storage.file'] = getenv('SISMO_STORAGE_PATH') ?: getenv('HOME').'/.sismo/storage.php';
par celles-ci :
$app['data.path'] = getenv('PHP_SISMO_DATA_PATH') ?: __DIR__.'/.sismo/data';
$app['config.file'] = getenv('PHP_SISMO_CONFIG_PATH') ?: __DIR__.'/.sismo/config.php';
$app['config.storage.file'] = getenv('PHP_SISMO_STORAGE_PATH') ?: __DIR__.'/.sismo/storage.php';

Idéalement, il faudrait vérifier la valeur de safe_mode_allowed_env_vars où est défini ce préfixe et l'ajouter en début de nom des variables d'environnement utilisées dans le code. Je ne me suis pas encore penché sur cette question, mais si quelqu'un souhaite contribuer à Sismo je serai ravi que vous me piquiez cette idée ;-)

Vous pouvez maintenant recompiler Sismo avec le script prévu à cet effet et déployer le fichier build/sismo.php sur votre serveur OVH.

Installation et utilisation de Composer

Maintenant que Sismo est installé, nous pouvons nous attaquer à composer.
Comme c'est un outil qui a régulièrement des mises à jour, et qu'il nous rappelle à l'ordre si on n’exécute pas un self-update de temps à autres, on ne vas pas se contenter de l'installer une fois pour toute.
Il serait donc pratique de pouvoir demander à Sismo, grâce à son fichier de configuration, d'installer et maintenir à jour composer. Et c'est exactement ce que nous allons faire.

Mais il va y avoir quelques embûches à surmonter pour pouvoir travailler avec composer.

La première première difficulté, qui n'en est pas une tellement elle est simple à contourner, est qu'on ne peut pas appeler composer directement avec la commande ./composer.phar
Le shebang avec /usr/bin/var php ne fonctionne pas. Pas grave, me direz vous, il suffit de passer le script en paramètre à php avec une commande du type php ./composer.phar
Effectivement il suffira de faire quelque chose dans ce genre. Mais à cause des autres problèmes qui suivent, on va très vite modifier cette commande.

La deuxième difficulté, c'est que la version cli de php utilisable par défaut sur OVH date d'une époque antédiluvienne.
Car oui, accrochez-vous bien, un petit php -v vous apprendra que c'est une version 4 qui se lance...
Ca serait tellement mieux d'avoir un petit php 5 ! Pour ça, on peut utiliser php.ORIG.5 au lieu de php, mais ça reste une assez vieille version de php 5.
Mais ne pleurez pas, il y a d'autres versions d'installées et il suffit juste de savoir où chercher. Un petit php 5.6 ça vous va ?

La dernière difficulté, c'est que composer aussi utilise des variables d'environnement qui ne sont pas préfixées par PHP_
Et comme on a dit qu'on voulait faire des mises à jour régulières, pas question cette fois de bidouiller le code !
Donc c'est avec la configuration de php qu'on va jouer pour s'en sortir.
Grâce à la magie du -d pour virer la valeur du paramétrage safe_mode_allowed_env_vars, notre problème s'envole !

Maintenant que vous savez quelles difficultés se présentent, et plus ou moins comment les contourner, voila les détails du fichier de configuration :


use Symfony\Component\Process\Process;

/*
 * Paramétrage de composer
 */
$composer_filename = 'composer.phar';               // Nom à donner à l'executable de composer
$composer_installdir = __DIR__;                     // Dossier où installer composer
$composer_home = $composer_installdir.'/.composer'; // Dossier où composer a le droit de ranger ses petites affaires

/*
 * Préparation des lignes de commandes
 */
$php5 = '/usr/local/php5.6/bin/php -d safe_mode_allowed_env_vars=';
$composer_phar = $composer_installdir.'/'.$composer_filename;
$composer = 'COMPOSER_HOME="'.$composer_home.'" '.$php5.' '.$composer_phar;

/*
 * Installation ou mise à jour de composer
 */
if (!file_exists($composer_phar)) {
    $process = new Process('curl -sS https://getcomposer.org/installer | '.$php5.' -- --install-dir='.$composer_installdir.' --filename='.$composer_filename);
    $process->run();
}
else {
     $process = new Process($composer.' selfupdate');
     $process->run();
}

/* ... */
$projet->setCommand('date;'.$composer.' install && '.$php5.' ./vendor/bin/phpunit');
/* ... */

Le mot de la fin

Si vous avez des questions, si vous avez une remarque ou si vous voulez me remercier (ou m'insulter ^^), n'hésitez pas à me laisser un commentaire.
Ah oui, ce tutoriel a été écrit vers les 5h du matin et je l'ai posté sans le relire. Il est donc potentiellement truffé de fautes de français. Mais si je trouve le courage de me relire, je corrigerai peut-être ça un jour !