S’il vous plait ! Et je m’explique.

J’utilise, comme outil d’intégration continue, Integrity.
Avec un « post-receive » sur le repository github, à chacun de mes commits, Integrity est mis au courant et il exécute les tests.

Ca fonctionne à merveille avec mes projets Rails (l’API RefStats et mon portfolio); mes projets Django (la documentation de RefStats).
Mais pour les projets Zend Framework (l’appli web RefStats) et un autre sur lequel je vais bosser en aout et qui sera fait avec Symfony, c’est pas cool.
Les tests, bien qu’ils ne passent pas tous, sont considérés par Integrity, comme valides.

La raison de cela est très simple : lorsqu’un processus console est exécuté, il peut retourner un code de status. Un peu comme le code HTTP sur les pages web.
Ce code doit être à 0 pour que les tests soient valides et à une autre valeur, quelconque, si les tests ne passent pas.
Voir notamment la documentation Integrity.
En PHP, un simple exit(0) ou exit(1) à la fin des tests suffirait à exécuter la chose correctement.

Et vraissemblablement, Symfony tout comme le Zend Framework ne renvoient pas le bon code de status.
Alors s’il vous plait, PHP a déjà pas mal de retard au niveau des tests automatisés d’applications, qu’il serait cool de rattraper. Faire ceci serait déjà un premier pas :)

Le cas « général »

Lorsque l’on utilise un framework tel que Zend, Symfony ou encore n’importe quelle librairie, il y a deux écoles :

  • Installer une fois le framework dans un répertoire spécifique. Et toutes les applications situées sur la machine utilisent cette version.
  • Installer une version du framework pour chaque application.

A première vue, la première solution pourrait paraitre intéressante. On y gagne en place disque et on a pas des copies de fichiers similaires partout sur sa machine.

Cependant il s’agit d’une très mauvaise idée.
Vous allez en effet vous retrouver bloqué sur une version de la librairie à utiliser pour toutes vos applications. Et lorsque une nouvelle version majeure sortira et que la rétrocompatibilité avec la version précédente ne sera pas forcément très poussée, soit vous ne mettrez pas à jour.
Soit vous devrez mettre à jour toutes vos applications en même temps pour faire cette mise à jour. C’est un petit peu lourd. Autant donc dire que vous ne mettrez pas à jour.
Et si vous le faites, vous ne prendrez probablement pas le temps de tester chaque application correctement et vous retrouverez avec des bugs.

En revanche si vous avez une version spécifique de la librairie spécialement pour l’application, vous pouvez mettre la librairie à jour pour une application, tester celle-ci proprement et puis passer à l’application suivante.

Et en versionnant la librairie globale

Avec Rails

Rails propose quelque chose d’assez sympatique. Dans le fichier config/environment.rb, vous avez
RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION

Vous définissez la version de la librairie utilisée dans l’application.
A côté de cela, vous avez donc plusieurs versions de rails installées dans le répertoire des librairies globales. Et vous pouvez choisir celle que vous désirez en fonction de l’application.

Plus de librairie inclue directement dans l’application (ce qui est tout de même assez crade).
Plus de problèmes de changement de version multi applications. Vous pouvez installer Rails 2.3.2 et l’utiliser dans l’une de vos applications tout en ayant toutes les autres qui tournent encore avec Rails 2.2.

Symfony

Symfony possède un fichier config/ProjectConfiguration.class.php
Dans lequel vous trouverez
require_once dirname(__FILE__).'/../lib/symfony/autoload/sfCoreAutoload.class.php';
Remplacez le chemin par celui vers la version de Symfony de votre choix. Et le tour est joué !

Zend Framework

Avec Zend Framework, c’est en définissant le include_path que vous pouvez définir la version de la librairie que vous utilisez.
Si vous avez, dans votre document public/index.php
set_include_path(
APPLICATION_PATH . '/../library' . PATH_SEPARATOR
. APPLICATION_PATH . PATH_SEPARATOR
. get_include_path()
);

require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

Il vous suffit de remplacer ‘/../library’ par le chemin vers le dossier library versionné pour votre application.

Alors après entre utiliser des librairies versionnées et implémenter directement la version de votre choix dans l’application, c’est à vous de faire la part des choses. Je pense que cela dépends surtout des gouts.
La seule chose à éviter est bien évidemment la librairie installée une seule fois, utilisée par toutes les applications et impossible à mettre à jour.
Et ceci est bien évidemment faisable avec d’autres frameworks et librairies que les 3 mentionnés ici. Documentez vous ! ;)

Pour l’instant du moins.

Comme vous le savez peut-être déjà, Zend a publié hier la première beta publique de son Zend Server.
L’idée est en soi sympa. Le produit, qui a des versions Windows, Mac et Linux, inclut :

  • Apache (ou le support de IIS si vous êtes un grand fou sous windows)
  • PHP
  • Zend Framework
  • MySQL (optionnel)

Alors après un petit test rapide, le produit est sympa.
L’interface web d’administration du serveur est toute jolie, ergonomique toussa (même si sans licence on ne peut pas voir grand chose).
A savoir qu’elle a été développée avec le Zend Framework et Dojo.

Mais cette interface ne permet de gérer que PHP, les extensions installées et les logiciels Zend installés.
C’est bien maigre lorsque l’on sait que pour faire fonctionner PHP il faut aussi un Apache correctement configuré. Du coup pour configurer son Apache, il faut passer par le fichier de configuration normal.

Ainsi en « natif », pas de multi projets. Vous placez votre application développée avec Zend à la base du DocumentRoot et puis c’est tout.
Quand j’ai vu l’interface, j’ai tout de suite pensé à une génération automatique de virtualhosts moi (je me suis même pris à rêver de modification automatique du fichier hosts, c’est dire).

Pour finir le Apache utilisé est celui disponible chez apache.org, sans aucune implémentation native dans le Zend Server.
Du coup vous avez (sous windows) deux icônes, une pour le ZS et une pour Apache. Quand des logiciels comme WAMP sont capables de monitorer seuls le serveur http ainsi que le serveur mysql, c’est plutôt dommage.

Du coup je me tâte pour regarder si ce serveur est intégrable à wamp justement. Même si l’intérêt en est finalement assez faible puisque ce dernier permet de gérer les extensions php installées de manière parfaitement correcte.

Du coup je vire le Zend Server et je reste avec wamp pour l’instant. On verra d’ici un an ou deux si la version stable intègre une gestion plus avancée des serveurs http et mysql.

P.S. : Aujourd’hui, O2Sources vient de sortir son premier projet Open Source, développé avec Zend Framework justement.

 
Fork me on GitHub