Travis CI l'intégration continue sans effort
Aujourd’hui je souhaite vous parler d’un projet qui me tient particulièrement à cœur : Travis CI, une plateforme d’intégration continue simple et efficace. C’est un projet auquel je tiens puisque j’y contribue et gère le support de PHP avec l’aide et aux côtés de l’équipe de contributeurs.
Sa devise ? “A distributed build system for the open source community.” A l’initiative de la communauté Ruby, Travis est donc une plateforme d’intégration continue ouverte et distribuée mise à disposition sous forme de service. Ouverte car tout projet public publié sur Github peut mettre en place son intégration continue sur Travis. Et distribuée car Travis s’occupe de distribuer les builds de vos projets sur des workers dont nous détaillerons le fonctionnement plus loin.
Face aux autres plateformes d’intégration continue
Et donc quels avantages face aux Jenkins/Hudson, CruiseControl et autres ? En quoi Travis CI se démarque-t-il de la concurrence ?
Tout d’abord, Travis se présente en mode service, aucune installation nécessaire, pas d’infrastructure à mettre en place ! Travis héberge gratuitement l’intégration continue des projets open source et sa mise en place est très facile comme nous le verrons un peu plus loin.
Chaque build de votre projet s’exécute dans une machine virtuelle dédiée : vous disposez d’un environnement complet pour votre build, vous pouvez installer ce que vous voulez sur cet environnement et cela n’affectera pas les autres projets buildés par Travis de la même manière que les autres projets ne viendront pas perturber le votre.
De plus chaque build se déroule dans une sandbox : après l’exécution du build, une snapshot réinitialisée de la machine virtuelle restaure son état, aucun risque de casser votre environnement.
Enfin, l’infrastructure est distribuée, tout d’abord le front est totalement découplé des workers puis Travis provisionne pour vous un pool de workers capable de dépiler le flot de build de tous les projets gérés par Travis. Les charges du front et de chacun des workers sont indépendantes.
Travis supporte actuellement les langages suivants :
- Clojure
- Erlang
- JavaScript avec Node.js
- PHP
- Ruby
Une des forces de Travis est de permettre de tester vos applications sur plusieurs versions du langage que vous utilisez. Vous faites du Ruby ? Vous pouvez tester votre projet sur Ruby 1.8.7, Ruby 1.9.3 ou même Ruby HEAD (version de développement courante), JRuby ou Rubinius. Vous faites du nodejs, hop testez vos packages sur nodejs 0.4 ou 0.6. Vous faites du PHP, vous pouvez tester votre projet sur PHP 5.3.9, 5.4.0RC5 et même 5.2.17 !
Votre application doit être testée sur plusieurs bases de données différentes ? Travis supporte MySQL, PostGreSQL, SQLite, MongoDB, CouchDB, Riak et Redis. En combinant les versions du langage testées et les différents envronnements à votre disposition, vous obtenez une build matrix garantissant que vos tests passent sur l’ensemble de ces combinaisons !
Ainsi il est possible de tester vos projets sur des dizaines de combinaisons de version de langage et de configuration d’environnement différentes. Voyez par exemple comment Sinatra joue ses tests sur près de 30 combinaisons différentes. De la même manière, FOSUserBundle garanti son bon fonctionnement non seulement sur PHP 5.3 et 5.4 mais aussi sur 3 versions différentes de Symfony2 ! Tout ceci grace à Travis qui permet d’améliorer de façon significative la robustesse et la fiabilité de nombreux projets open source ! Il est aussi fréquent de découvrir des bugs sur les différentes versions en cours de développements des langages supportés par Travis.
Contraintes
Bien entendu Travis vient aussi avec quelques contraintes qu’il faudra mesurer en fonction de ce que vous attendez de votre intégration continue.
Tout d’abord, Travis est pour l’instant fortement couplé à Git et Github, il est nécessaire que votre projet soit public sur Github pour profiter de Travis. Cependant le support d’autres repositories Git et des repositories privés est dans le pipe.
Pour l’instant et même si toutes les briques de Travis sont open source, il n’est pas aisé d’installer un environnement Travis privé et dédié.
Travis a tout d’abord été conçu pour la communauté open source.
Mise en place
Vous avez un projet sur Github ? La première étape pour mettre en place son itégration continue sur Travis est d’y placer à la racine un fichier .travis.yml décrivant comment doit se dérouler votre build. La configuration de Travis est très souple et permet la définition des fameuses combinaisons mentionnées un peu plus tôt.
Pour la seconde étape il suffit de vous rendre sur travis-ci.org, de vous authentifier automatiquement via l’OAuth de Github et vous pourrez activer l’intégration continue de vos projets, c’est aussi simple que cela !
Pour plus d’informations, référez-vous au Getting Started de la documentation. N’hésitez pas à suivre les sections spécifiques à votre langage de prédilection.
Technologies
Travis est principalement écrit en Ruby et repose sur un ensemble de technologies modernes et innovantes qui lui donnent les caractéristiques détaillées plus haut :
- AMQP avec RabbitMQ pour le messaging et la distribution des builds. Plusieurs clients sont utilisés en particulier Hot Bunnies, projet dans lequel l’un des core contributor de Travis est fortement impliqué. Il s’agit d’un client JRuby construit sur la base du client Java pour RabbitMQ maintenu par SpringSource, une preuve de la pertinence de la cohabitation JVM/JRuby.
- JRuby pour profiter de certaines librairies Java et des performances
- Vagrant pour la gestion des machines virtuelles
- Chef pour le provisionning des machines virtuelles
- WebSockets par l’intermédiaire de Pusher pour la mise à jour des logs de build en temps réel
- Rails pour le front côté serveur
- Ember.js (successeur de SproutCore 2) pour la RIA côté client
Son architecture étant découplée, une partie des applications qui composent Travis sont déployées sur Heroku (le site web, le hub) alors que les workers, qui exécutent les builds, tournent sur des machines dédiées fournies généreusement par des sponsors.
Pour plus de détails sur les rouages de Travis, vous pouvez vous référez à cette technical overview.
A ce jour
A ce jour, Travis lance les builds de plus de 4200 repositories à raison de 2000 builds par jour en moyenne ! L’intégration continue de projets très prestigieux est gérée par Travis, en particulier :
- Dans la communauté Ruby :
- Ruby on Rails
- Bundler
- Sinatra
- Rack
- RSpec
- Cucumber
- HAML
- SASS
- RubyGems
- rubygems.org
- Mongoid
- Rubinius
- Factory Girl
- Spree
- Devise
- amqp gem
- et même le miroir GitHub de CRuby (MRI) itself
- Dans la communauté JavaScript :
- Dans la communauté PHP :
- Dans la communauté Clojure :
- Dans la communauté Erlang :
- On y trouve même quelques plugins Eclipse qui profitent de la disponibilité de Maven sur la plateforme :
Conclusion
Nous avons vu ici ce qu’est Travis CI et comment il se positionne vis-à-vis des autres systèmes d’intégration continue. Vous avez un projet open source sur Github ? Le langage est supporté par Travis ? Alors allez vite installer son intégration continue sur Travis si ce n’est pas déjà fait !
Pour plus d’informations, n’hésitez pas à parcourir la documentation, à suivre @Travis sur Twitter ou à nous rejoindre sur le channel #travis de irc.freenode.net.
Merci à Michael Klishin pour la relecture approfondie et à tous les contributeurs Travis qui participent à la mise à disposition de cet outil si pratique !