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 !

5 commentaires:

Hamdi FOUZAI a dit…

Merci pour ce tuto....
je suis en train de l'appliquer....
j'y comprend rien...
je suis totalement novice
je sais meme pas ce que tu veux dire par "git clone...."
j'ai besoin de composer sur mon mutu ovh car je veux installer le SDK PHP de Facebook....

Franck Jousseaume a dit…

Git est un logiciel de gestion de version (un peu comme CVS ou SVN) mais décentralisé.
Je l'utilise pour télécharger la dernière version du code source de Sismo, qui est hébergé sur github.

Mon tuto est beaucoup plus axé sur Sismo que sur composer. Les explications sur l'utilisation de composer sont données dans le cadre d'une utilisation conjointe avec Sismo pour l'intégration continue. Ce n'est pas forcément idéal à suivre pour une utilisation seule.

Ceci dit, avec un peu d'astuce, il doit être possible d'en tirer quelque chose quand même :
Dans les grandes lignes, tu peux télécharger composer.phar et le déposer en FTP sur ton serveur.
Toute la partie "bidouillage" de la configuration PHP pour utiliser une version récente de PHP reste peut-être d'actualité (à vérifier s'ils ont mis à jour la version de PHP utilisable en CLI), dans ce cas, ça te sera utile.
Mais en ce qui concerne le lancement de commande via composer, j'ai utilisé le fichier de configuration de Sismo. Dans ton cas, tu vas devoir coder tes propres scripts PHP pour lancer les commandes.

Unknown a dit…
Ce commentaire a été supprimé par l'auteur.
Unknown a dit…

Salut Franck, merci beaucoup pour ce tutoriel ! Cela dit j'ai encore quelques difficultés à le faire fonctionner pour de vrai :) Dis-moi si je me trompe mais dans l'ordre il faut :
1 - Cloner Sismo en local avec git clone https://github.com/FriendsOfPHP/Sismo.git sismo
2 - Modifier son fichier app.php comme tu l'écris
3 - Recompiler en double-cliquant sur le fichier Compile
4 - Placer le nouveau fichier sismo.php sur mon serveur distant

Ensuite pour faire fonctionner Composer il faut configurer Sismo c'est bien ça ? De ce que je comprends du site officiel de Sismo ça se fait dans ~/.sismo/config.php
Leur fichier de configuration de base ne ressemble pas vraiment à ce que tu as mis en ligne du coup je me demande s'il faut que j'ajoute ce que tu as mis en plus des paramètres de configuration standards ? Je ne sais pas vraiment où mettre ton code en somme :) Ensuite dois-je recompiler Sismo ? Et comment le faire fonctionner en ligne ensuite ?

Merci d'avance mais c'est vrai que ça serait super utile de faire fonctionner composer en sur ovh ;)

Hugo

Franck Jousseaume a dit…

Salut.

Effectivement, le fichier de configuration est bien ~/.sismo/config.php
Le morceau de configuration que je donne est a faire au début du fichier, afin que composer soit en place pour la suite des opérations.

La partie entre les /* ... */ correspond à la définitions de tes projets.
Comme ça dépend si ton projet est sur github, bitbucket ou un dépôt que tu héberges toi-même, je n'ai volontairement pas détaillé cette partie qui sera à adapter selon tes propres besoins.
Mais c'est là que tu devras mettre ce qui correspond à ce que tu trouves dans la doc officielle, en n'oubliant pas de retourner le tableau de projets à la fin.