Versions
09/06/2012: Création
01/02/2013: Composer & sf2.1
Contactez-nous
Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81
Mettre en place travis-ci pour tester un bundle symfony2
Introduction
Ce tutoriel fait partie du cycle "Tests unitaires d'un bundle Symfony2"
Cette partie indique comment mettre en place travis-ci pour que le bundle puisse être testé automatiquement à chaque push par le système d'intégration continue "travis-ci".
Théorie de travis-ci
Travis-ci est un service relié à github qui permet de lancer automatiquement des tests unitaires (phpunit) à chaque push fait sur un repository github. Il fait partie des outils dit "d'intégration continue" (cruise controll ou continuous integration en angais).
On peut ainsi connaître en permanence la fiabilité de la branche master du projet et même l'avancement du développement si on travail en "test driven developpement".
Je ne vais pas plus loin, ça devrait suffire pour commencer à jouer avec.
Créer un compte travis-ci et l'activer pour mon bundle
Il faut un compte GitHub et être connecté dessus pour créer un compte travis-ci.
Quand on arrive sur la page d'accueil travis-ci.org, on a un bouton "connection GitHub".
En cliquant dessus, on arrive à une page indiquant l'ensemble des projets GitHub sur lesquels on peut pusher.
Là, je clique sur le bundle que je veux tester : le Kitpages/DataGridBundle. Il passe à "ON"
Activer le hook travis-ci dans GitHub
Aller sur la page GitHub de votre bundle (dans mon cas : https://github.com/kitpages/KitpagesDataGridBundle)
cliquer sur Admin > Service Hook > Travis
Entrez votre username GitHub et votre token travis-ci (cf votre page travis-ci) et valider.
Cette étape sert à ce que travis-ci soit prévenu à chaque "git push" sur votre bundle et puisse lancer les tests à ce moment.
Travis, comment ça marche en vrai ?
L'idée, c'est qu'au moment où on fait un git push, travis-ci est prévenu par github (le hook qu'on a configuré juste au dessus) et il fait les opérations suivantes :
- travis-ci lit le fichier .travis.yml et il en extrait les infos suivantes :
- La version de PHP à utiliser
- les variables d'environnement à définir
- un script à lancer (le "before-script") avant de lancer les tests
- à qui envoyer le mail avec le résultat des tests
- travis crée un environnement PHP qui va bien et initalise les variables d'environnement
- il clone le bundle dans kitpages/KitpagesDataGridBundle
- il lance le "before-script" (on verra dans notre cas que ce before-script permet de rappatrier symfony et les bundles nécessaires pour faire marcher le bundle)
- il va dans le répertoire kitpages/ et lance "phpunit" sans aucun argument
Faire marcher phpunit sans argument
Par défaut travis-ci lance phpunit sans aucun argument, il faut ajouter quelques fichiers pour que phpunit fonctionne comme ça :
- à la racine du bundle, un fichier phpunit.xml.dist qui dit en gros où est le script qui va initialiser l'application, le bootstrap de phpunit
- un script de bootstrap qui va initialiser l'application
phpunit.xml.dist
à la racine du bundle :
<?xml version="1.0" encoding="UTF-8"?> <phpunit bootstrap="./Tests/bootstrap.php" colors="true"> <!-- Les fichiers de tests à lancer --> <testsuites> <testsuite name="KitpagesDataGridBundle test suite"> <directory suffix="Test.php">./Tests</directory> </testsuite> </testsuites> <!-- Quels fichiers sont concernés par l'évaluation du code coverage --> <filter> <whitelist> <directory>./</directory> <exclude> <directory>./Resources</directory> <directory>./Tests</directory> <directory>./vendor</directory> </exclude> </whitelist> </filter> </phpunit>
Tests/bootstrap.php
<?php if (!is_file($autoloadFile = __DIR__.'/../vendor/autoload.php')) { throw new \LogicException('Could not find autoload.php in vendor/. Did you run "composer install --dev"?'); } require $autoloadFile;
Les 2 fichiers précédents sont faciles à lire, je ne détaille pas.
Il permettent de faire marcher votre bundle dans l'environnement travis.
Après normalement, vous pouvez vous mettre à la racine de votre bundle et lancer phpunit sans aucun argument.
Le résultat doit resssembler à ça :
[webadmin@vbox53 DataGridBundle]$ phpunit PHPUnit 3.6.11 by Sebastian Bergmann. Configuration read from /home/webadmin/eclipse/kit-site/vendor/Kitpages/DataGridBundle/phpunit.xml.dist . Time: 0 seconds, Memory: 2.75Mb OK (1 test, 1 assertion) [webadmin@vbox53 DataGridBundle]$
Maintenant les fichiers de travis-ci
une fois que phpunit fonctionne chez vous sans paramètre, comment configurer travis-ci ?
Prenons les fichiers à ajouter dans l'ordre :
Créer le fichier .travis.yml
language: php php: - 5.3 - 5.4 before_script: - composer install --dev script: phpunit --coverage-text notifications: email: - travis-ci@kitpages.fr
C'est globalement facile à lire.
- Le before-script permet d'installer l'environnement (ici, on va chercher les packages nécessaires pour que le bundle fonctionne)
- le script: indique les options que l'on veut donner à phpunit
- la notification indique l'email qui va recevoir les alertes quand les tests travis ne passent pas
Le status dans README.md
C'est pas le plus important, mais pour l'ego, ça tabasse : ajouter l'état du dernier tests travis dans le README.md du bundle :
KitpagesDataGridBundle ======================== [![Build Status](http://travis-ci.org/kitpages/KitpagesDataGridBundle.png)](http://travis-ci.org/#!/kitpages/KitpagesDataGridBundle) This Symfony2 Bundle is a simple datagrid bundle. It aims to be easy to use and extensible. Actual state ============ stable, production ready [....]
Commiter, pusher et voir si ça marche
Commitez tout ce que vous venez de faire, pushez et allez voir sur travis-ci.org ce qu'on donné vos tests.
(vous pouvez rechercher votre bundle avec le moteur de recherche de travis-ci.org)
Notez que le push peut-être un peu long, parce qu'il faut lancer les tests avant que le push soit visible dans github.
Conclusion
Normalement à ce stade, phpunit fonctionne chez vous, travis arrive à lancer phpunit sur votre bundle également.
Il est temps de faire quelques vrais tests dans la leçon suivante.
Commentaires
Ajouter un commentaire