Aller au contenu | Aller au menu | Aller à la recherche

Comparatif des outils d'intégration continue

En ce moment j'ai pour mission de mettre en place une plateforme de développement. Gitlab a été choisi pour héberger les sources des projets internes et clients. Il faut maintenant mettre en place un outils d'intégration continue, open source si possible. Le premier qui vient en tête est Jenkins. Mais il a des défauts, aussi je suis allé à la recherche d'alternatives, que j'ai installé et testé.

Gitlab-CI

Nous utilisons GitLab, alors pourquoi ne pas utiliser Gitlab-CI ? Interface épuré, forte intégration avec Gitlab, il semble être un bon candidat, même si, en lisant les caractéristiques sur le site, il semble léger. Vérifions tout cela. C'est parti donc pour une installation. Il faut savoir que c'est réalisé avec Ruby On rails et utilise mysql ou Postgresql pour ses données.

Première déconvenue : autant la documentation de Gitlab est très précise et claire (vous tapez toutes les commandes indiquées, dans le bon ordre, ça s'installe sans accro, en 20 minutes à peine), autant celle de Gitlab-CI est incomplète. Une impression de doc inachevée. Du coup ça a été un peu plus sport, avec, au hasard, des problèmes de création de la base de donnée avec PostgreSQL, l'absence totale de doc pour l'installer derrière un Apache (j'ai finalement pris le vhost créé pour Gitlab, renommé 2-3 trucs et ça roulait), des problèmes de configurations avec Puma, le serveur http utilisé par Gitlab-Ci (alors qu'ils utilisent Unicorn pour Gitlab...). M'enfin, on s'en sort quand même, avec un peu de temps et de patience.

Deuxième déconvenue : le manque de fonctionnalité s'est confirmé. C'est un outil trés, trés, trés simpliste par rapport à la concurrence. Ce n'est au final qu'un super hook pour git :

  • Gitlab-ci se "branche" sur un dépôt Gitlab (pour des dépôts hébergés par d'autres outils, oubliez)
  • à l'arrivée des commits, il clone ou fetch le dépot, et lance un script (que vous devez écrire) via un des "runners" installés en local ou sur d'autres machines.
  • selon le code de sortie du script, alors la tâche est considérée comme un succès ou un échec.
  • le rapport d’exécution se limite à la sortie console de votre script. pas de prise en charge des sorties xunit etc
  • une notification du résultat par email peut être faite.

Et... c'est tout.

Cela veut dire que vous devez tout faire à la main dans le script de la tâche : lancement des tests, déploiements etc... Il n'y a pas de système de plugins pour lui rajouter des fonctionnalités. Le seul intérêt est son intégration avec Gitlab : il partage le même système d'authentification, il sait lister tout les projets, et la création d'une tâche se fait en cliquant sur un bouton en face du projet dans la liste. (Mais une seule tâche par projet).

C'est vraiment très light. Trop light pour nos besoins.

Strider-CD

Pendant mes recherches, je suis tombé sur cet outils que je ne connaissais même pas de nom : Strider-CD. Il a attiré mon attention grâce à quelques aspects originaux :

  • il est basé sur NodeJS et utilise MongoDb pour le stockage de ses données
  • il met en avant l'aspect déploiement d'un projet

Et il semble un peu plus riche en fonctionnalité que Gitlab-CI. L'installation pour un simple essai est plus simple (si nodejs et mongodb sont déjà installés) :

  • clonage des sources
  • un coup de npm install
  • strider addUser pour créer un premier utilisateur
  • strider pour lancer le serveur qui est disponible alors sur le port 3000

Par contre la documentation ne donne aucune instruction supplémentaire pour une installation sécurisée en production, la conf Apache pour faire du reverse proxy etc... Mais on s'en sort avec Google. Je n'ai pas essayé de configuré l'appli en HTTPS...

Strider-cd est orienté pas uniquement tests et intégration, mais aussi déploiement. Cela veut dire que les tâches de tests et de déploiements sont des étapes distinctes.

Il a un système de plugin. Les plugins sont des modules NodeJS. Ce système permet d'ajouter :

  • des "runner" : ce sont les plugins chargés de lancer les tâches. Par défaut on a un simple runner qui lance les tâches sur la même machine. Il y en a un autre permettant de lancer les tâches via Docker. Mais ça devient un peu lourd. Aucun runner existant à déployer sur une autre machine (!)
  • des "providers" : ils sont chargés de récupérer les sources d'un projet. Par défaut, il y a des providers pour github, bitbucket, et un générique pour récupérer un dépôt git quelconque (par exemple hébergé par gitlab)
  • des "tâches" : ce type de plugin savent lancer un build, ou déployer des fichiers etc.. On a par exemple un plugin pour lancer les tests d'un module Node (qui va en gros faire un "npm test").
  • des "basic" : ce sont des plugins dans lesquels vous faites de ce que vous voulez. Mais l'API exposée par strider sera moins spécifique que pour les autres types de plugin.

Le concept est plutôt attrayant. La réalisation de plugins n'a pas l'air trop compliquée. Un point noir cependant, l'offre est quasi nulle : il n'y a pratiquement pas de plugin existant. Le projet étant probablement trop jeune. il ne semble pas non plus y avoir la possibilité d'afficher des résultats sous une autre forme que du texte brute : comme Gitlab-CI, vous n'avez que la sortie console.

Aussi le choix de Strider implique :

  • soit l'utilisation du plugin fourni "custom scripts" pour écrire les scripts shell qui lanceront les tests, qui feront les déploiements etc.. Bref, pas de clickodrome qui vous mâche le travail
  • soit le développement de plugins qui permettront à terme de créer plus facilement les tâches. Mais il faut du temps.

Contrairement à Gitlab-Ci, Strider a du potentiel grâce à son système de plugin. Mais pour le moment, vu le manque de plugins et si on manque de temps pour en développer, il n'apporte pas grand chose de plus que GitLab-CI.

TeamCity

Avec Jenkins, TeamCity est un des outils que j'ai pu utiliser au quotidien dans des projets précédents. C'est certainement le plus complet que je connaisse, avec la possibilité entre autre d'organiser les builds de manière hiérarchique. Il a lui aussi un système de plugins. L'interface est toutefois un peu fouilli à mon goût, même si elle est plus moderne que celle de Jenkins. Et la principale ombre au tableau : c'est du bon bloatware J2EE powered avec tous les défauts qui vont avec : il faut une machine de guerre pour faire fonctionner le truc. En tout cas, c'est un mammouth par rapport à une appli NodeJs comme StriderCD.

Autre point : c'est payant. Ou presque : il y a bien une version gratuite, mais elle est limitée à 20 builds. Donc insuffisant pour une entreprise. Donc payant :-) Ça peut être un frein si le budget est limité..

Jenkins

Aaah Jenkins... Ce bon vieux Jenkins... Je te hais. Quelle interface horrible ! Quel bloatware ! Installation fraiche sur mon poste, 0 projet géré : pauvre machine, elle se fait déjà bouffer 6Go de mémoire virtuelle, et près de 800Mo de mémoire réellement utilisée. Sans rien faire hein ! Pas de tâche en cours, rien. Sans compter le processus jetty à coté. Non, lui, je n'en parlerais pas, ça fait trop mal. Bref, encore du bon bloatware Java. Tout comme TeamCity, il y a intérêt à avoir une machine bien dimensionnée.

Enfin bon, même si mes souvenirs ne sont pas très bon sur l'utilisation de cet outils, je reconnais, (à regret), qu'après l'avoir installé de nouveau, il semble la solution open-source la plus complète. Des plugins à profusion (il y a à priori tout ceux que l'on a besoin pour notre plateforme), de la doc un peu partout sur le web. Et puis j'ai découvert un plugin, "simple theme", qui permet de relooker un peu cette interface illisible par le biais d'une feuille CSS, celle-là par exemple.

Conclusion

Par rapport à nos besoins, j'ai finalement éliminé Gitlab-CI et Strider-CD. Je continuerai toutefois à surveiller du coin de l'oeil Strider-CD, il me semble prometteur. Il aura le potentiel de Jenkins quand il y aura suffisamment de plugins. Reste Jenkins et TeamCity. Ils ont tout deux le problème d'être gourmand en ressources. TeamCity est toutefois plus sympa. Si vous avez du budget, prenez TeamCity. Sinon Jenkins reste un bon outils dans l'ensemble. À la condition d'avoir une machine costaud.

Si vous utilisez d'autres outils d'intégration continue (autre que des formules Saas, que je ne veux pas), n'hésitez pas à m'en faire part :-)

Mise à jour 06/03/2014 : j'ai changé d'avis ! Voici un retour d’expérience.

Commentaires

1. Le mercredi, février 5 2014, 10:37 par yohang

Pour le coup, c'est bien résumé.

Personnellement, j'utilise TeamCity, à noter que niveau ressources c'est quand même beaucoup moins gourmand que Jenkins.

A citer aussi, Bamboo (https://www.atlassian.com/software/...) de chez Atlassian, payant également.

Pour PHP, il existe aussi PHPCI (http://www.phptesting.org/), à voir si ça a évolué depuis la première release qui n'était vraiment pas suffisante / stable.

2. Le mercredi, février 5 2014, 11:58 par perrick

Côté No Parking, nous avons mis sur GitHub notre outil "maison" qui s'appelle Norska : https://github.com/noparking/norska

Et on en a profité pour créer un projet tout simple qui permet de démarrer au plus vite :
https://github.com/noparking/norska...

Bien sûr aucune doc, un nombre de plugin restreint. Mais c'est du Vanilla PHP donc on est loin du bloatware. Très léger je te l'accorde, mais qui comme en PHP, il n'y a pas grand chose, c'était l'occasion.

3. Le mercredi, février 5 2014, 12:35 par teriiehina

un doute m'habite: TeamCity permet 20 configuration de builds, i.e. 20 projets différents, c'est bien ça ? Parce que tu parles de "20 builds"…

et https://travis-ci.com/ ?

4. Le mercredi, février 5 2014, 14:19 par Laurentj

@teriiehina : non, tu peux avoir plusieurs config de build par projet. genre un build pour lancer des tests, un build pour mettre en prod, un build pour windows, un build pour linux, etc, etc. En gros, buid = tâche. et 20, ça peut vite être atteint dans une boîte.

5. Le mercredi, février 5 2014, 18:28 par Rodolphe

Merci pour cette comparaison et son résumé, c'est le genre de taff que l'on a pas envie de se coltiner soit même et qui est bien utile. Par contre la conclusion me désole un peu car je sens que je vais devoir maintenir mon Jenkins encore quelques temps :-( Je suis visiblement allergique autant que toi aux bloatware, mais pour sa défense j'ajouterai tout de même que si tu as une VM dédiée pour lui Jnekins et "install and forget", c'est déjà ça.

6. Le mercredi, février 5 2014, 23:09 par eric

Attention avec gitlab, beaucoup de pb mémoire (avec git over http), nombreux crash (quotidien, maintenant que c'est en charge, on a pas encore trouvé le problème).
Bref, très déçu (après un an paisible de gitlab.com...).
Au final on tourne sur bitbucket.org. Atlassian Stash avait l'air pas mal aussi.




Après des années d'Hudson (et oui) et Jenkins, avec plus de 100 "projets" 10 remote executors...

J'aurais aimé avoir le temps d'évaluer Go: (pas le langage) http://www.thoughtworks.com/product... vraiment sexy.

Mais au final, j'en suis revenu à:

  • un unique cronjob "git pull && make ci" qui va bien.
  • un serveur http de contenu "statique" qui tourne en permanence au dessus du working directory. En l'occurence "godoc" de http://golang.org . Mais c'est spécifique au projet.

Gratuit:

  • rapport console (make est pipé dans un .html)
  • autodoc accessible (readme.md -> .html, et toute doc générée à partir du code est visible en direct).
  • nimporte quel développeur peut très facilement faire tourner son CI sur sa machine.

les notifs par mail ? depuis longtemps filtrés dans la poubelle de ma boite mail.

7. Le vendredi, février 7 2014, 16:14 par ChonUnca

Je n'ai pas encore eut le temps de tester celui ci :
https://github.com/travis-ci/docs-t...

Mais oui même constat que toi, jenkins je te hais mon amour