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 !

06/12/2012

Débloquer proprement Linux en cas de freeze

Une fonctionnalité du noyau Linux permet, par une combinaison de touches, de lancer des commandes de bas niveau. Pour cela, elle doit être activée à la compilation du noyau. Et c'est justement le cas, par défaut, sur la plupart des distributions actuelles.

La principale utilité de cette fonctionnalité, présentée dans cet article, est de pouvoir redémarrer un système bloqué sans corrompre le système de fichier. En effet, cela permet de démonter correctement les systèmes de fichiers, ce qui évite de risquer des corruptions de données et de devoir exécuter fsck au redémarrage. De plus les processus ont du temps pour enregistrer des sauvegardes d'urgence le cas échéant. C'est toujours mieux qu'un reboot sauvage !

Sur architecture x86, on actionne cette fonctionnalité en maintenant simultanément les touches Alt et Syst tout en tappant la séquence REISUB, en attendant au moins 2 secondes entre chaque lettre.

Au delà de cette précieuse séquence à retenir, les raccourcis Alt+Syst peuvent servir à d'autres choses en fonction de la touche utilisée simultanément :

  • r : récupérer le clavier, monopolisé généralement par l'interface graphique.
  • e : envoie le signal SIGTERM à tous les processus excepté init.
  • i : envoie le signal SIGKILL à tous les processus excepté init.
  • s : synchronise tous les systèmes de fichiers montés. Cette fonctionnalité peut être très utile si on doit faire un arrêt rapide de l'ordinateur, car elle permet de ne pas perdre les données en mémoire cache.
  • u : passe tous les systèmes de fichiers montés en lecture seule.
  • b : redémarrer immédiatement le système. Cette fonctionnalité peut provoquer des pertes de données car ce qui est en mémoire cache n'est pas écrit que les disques ; c'est beaucoup plus violent que le Ctrl+Alt+Suppr de Windows (ou de Linux, lorsque ce n'est pas désactivé comme sur Ubuntu).
  • k : tue tous les processus de la console virtuelle active.
  • c : redémarre le processus kexec et affiche le message du crash.
  • o : arrête le système.
  • p : affiche les registres courants et les flags dans la console.
  • t : affiche la liste des différentes tâches actives ainsi que des informations pour chacune.
  • m (sur clavier QWERTY et ,(virgule) sur clavier AZERTY) : affiche les informations relatives à la mémoire dans la console.
  • f : appelle la fonction oom_kill qui tue le processus qui consomme toute la mémoire disponnible.
  • l : envoie le signal SIGKILL à tous les processus, y compris init. de 0 à 9 : permet de définir le type de message du noyau qui s'affichent dans la console.

11/05/2011

Coder en dotnet à moindre coût en entreprise

Dans la société où je travaille, d'habitude plutôt orientée Java, nous avons eu besoin de travailler sur une application dotnet. Seul problème, nous ne possédions pas de licence Visual Studio et le coût de celle-ci était complètement démesurée par rapport au projet sur lequel nous avions à travailler.

Plusieurs possibilités s'offraient donc à nous : utiliser un IDE alternatif, tel que SharpDevelop, ou utiliser une version Express Edition de Visual Studio.

Cependant, la légalité d'utiliser cette dernière pour un usage commercial ne paraissait pas évidente au premier abord. Et bien bonne nouvelle, c'est permis !
Voici ce qu'on a trouvé sur la FAQ de Microsoft :
Can I use Express Editions for commercial use?
Yes, there are no licensing restrictions for applications built using Visual Studio Express Editions.

Il faut avouer que Microsoft nous a très agréablement surpris sur ce point là !

28/12/2009

Problème réseau sous Ubuntu 9.10

M'étant acheté un nouvel ordinateur portable, un Acer aspire 7730G, j'ai eu envie de rompre avec mes habitudes pour essayer une nouvelle distribution. C'est ainsi que j'ai essayé Ubuntu.
Après un essai concluant du live CD de la version Jaunty Jackalope (9.04), j'ai récupéré un dvd de la toute nouvelle Karmic Koala (9.10) que je me suis empressé d'installer. Et là, mauvaise surprise : pas moyen d'activer ma carte WiFi. Pourtant cette dernière fonctionnait parfaitement avec Jaunty...

Mais j'ai finalement trouvé la solution miracle pour faire fonctionner le chipset récalcitrant. Et puisqu'en cette fin d'année je suis généreux, je vais vous livrer en guise de cadeau de Noël.

Le problème vient en fait de l'amorce de Grub ! Il faut donc modifier son fichier de configuration. Pour se faire, la marche à suivre est la suivante :

  • executer la commande sudo gedit /etc/grub.d/10_linux (et taper votre mot de passe lorsqu'il vous sera demandé, comme toujours avec sudo)

  • rechercher la ligne save_default_entry, un peu en dessous vous devriez trouver une ligne contenant :
    linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro $2
    Rajoutez à la fin de cette ligne pci=use_crs afin qu'elle devienne
    linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro $2 pci=use_crs
    Sauvegardez et fermez le fichier.

  • La dernière étape consiste à mettre à jour le fichier /boot/grub/grub.cfg en executant la commande update-grub et de rebooter (normal de rebooter si on veut appliquer les modifications du gestionnaire de boot...)

06/08/2009

Eclipse Galileo + SVN

La nouvelle version d'Eclipse (Galileo) est sortie, et le support de SVN n'étant toujours pas intégré par défaut, voila la marche à suivre pour pouvoir l'intégrer manuellement.

Comme pour tout ajout de plugin dans Eclipse, vous devez vous rendre dans le menu "Help -> Install New Software..."

Vous devez chercher sur le site de Galileo (déjà inclus, heureusement ^^) et installer ce premier plugin :
"Collaboration -> Subversive SVN Team Provider (incubation)"

Pour le deuxième plugin à ajouter, il faut tout d'abord ajouter le site suivant :
http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
Maintenant, vous pouvez tranquilement installer le plugin :
"Subversive SVN Connectors -> SVNKit 1.3.0 Implementation"

05/12/2008

Initialisation de collections en VB

Une des nouveautés annoncées pour VB10 concerne l'initialisation des collections.

Si nous prenons l'exemple d'une collection de type List(Of String) que nous remplissons avec les valeurs tata, titi, tutu et bien sûr le célèbre toto, jusqu'à maintenant nous devions écrire ce code:

Dim maListe As New List(Of String)
maListe.Add("tata")
maListe.Add("titi")
maListe.Add("tutu")
maListe.Add("toto")


Mais à partir de VB10, une nouvelle syntaxe équivalente mais plus courte à écrire sera disponible :

Dim maListe As New List(Of String) From {
"tata",
"titi",
"tutu",
"toto"
}

Et si on remplace notre collection List(Of String) par un Dictionnary(Of Int16, String), le code sera :

Dim monDico As New Dictionary(Of Int16, String) From {
{1,"tata"},
{2,"titi"},
{3,"tutu"},
{4,"toto"}
}


Note : Comme le montrent également ces deux exemples, les retours à la ligne ne seront plus obligatoirement marqués par des _

04/12/2008

Enfin les propriétés automatiques en VB

Cette année lors de sa conférence PDC, Microsoft a annoncé bon nombre d'évolutions pour la prochaine version de ses deux principaux langages dotnet : VB et C#

L'une de ces évolutions concerne l'intégration des propriétés automatiques (auto properties) dans Visual Basic 10.

Jusqu'à maintenant, pour créer une propriété dans une classe en VB, il fallait écrire quelque chose de ce genre :

Public Class Personne

Private m_Nom As String
Public Property Nom() As String
Get
Return m_Nom
End Get
Set(ByVal value As String)
m_Nom = value
End Set
End Property

Private m_Prenom As String
Public Property Prenom() As String
Get
Return m_Prenom
End Get
Set(ByVal value As String)
m_Prenom = value
End Set
End Property

End Class


Mais à partir de VB10, grâce aux propriétés automatiques, il suffira d'écrire ceci :

Public Class Personne

Public Property Nom As String
Public Property Prenom As String

End Class


Message personnel à mes étudiants (et aux autres !):
Notez que malgré la syntaxe plus courte, les commandes exécutées par le programme sont équivalentes : le compilateur rajoute pour vous le code que vous n'aviez pas tapé. Donc pour ceux qui pensent que raccourcir le code permet d'accélérer l'exécution du programme...... oubliez ce mythe !