Pulse de zutubi distribuent les builds en fonction des compatibilités entre le build et l'agent (ex : un projet Maven 2.0.6 avec le jdk 1.4 sur un agent ayant ces caractéristiques). Si vous n'avez que des projets Maven 2.0.9, jdk 1.5, l'intérêt est assez limité. On peut cependant s'en tirer en jouant sur les noms des jdk, les noms des "builder" (Maven)... et en répartissant les projets sur ces différentes config :
D'autres, comme TeamCity de JetBrains (l'éditeur d'IntelliJ IDEA) et Hudson (gratuit) permettent de spécifier directement quel build s'exécutera sur quel agent, fonctionnalité bien pratique pour disperser équitablement la charge sur les différents serveurs sans se compliquer la tâche :
• Il y a également tout intérêt à distribuer les tests, car aujourd'hui, plus que la compilation ou le packaging, ce sont bien eux qui prennent le plus de temps et de ressources. Pour le moment, il n'y a pas beaucoup d'outils qui proposent ce genre de fonctionnalités : GridGain pour JUnit, SeleniumGrid ou Greenpapper (remote agents) pour les tests d'interface web. Malheureusement, pour l'heure, il n'est pas simple de les utiliser en intégration continue. Je pense tout de même que c'est une piste à approfondir et si les outils parviennent à distribuer les builds, il fait nul doute que ce sera possible avec les tests.
• Outre le serveur lui même, si l'on utilise un repository d'entreprise (référentiel de librairies tels que artifactory, archiva ou nexus), qui permet de stocker l'ensemble des api utilisées au sein de l'entreprise (proxy vers le repo Maven) ainsi que les projets / frameworks créés en interne, il faut veiller à la disponibilité de cet espace de stockage. En effet, le serveur d'intégration continue se base sur ce référentiel pour construire les packages et donc sans librairies, la plupart des builds échoueraient. Au delà de ça, c'est surtout au niveau du poste de travail des développeurs que le risque est le plus élevé : songez au temps perdu par un développeur qui ne peux plus compiler son application, alors quand il y a des dizaines voire des centaines de développeurs qui comptent sur ce référentiel pour travailler, on imagine bien l'importance de ce composant. On doit donc garantir la haute disponibilité de cet espace (redondance, cluster... les éléments habituels).
Voilà quelques solutions pour amortir la charge du serveur d'intégration continue. Toutefois, si le build distribué ne convient pas ou si malgré tout, le serveur peine, il faudra certainement songer à mettre en place plusieurs usines (dédiés à des lignes métier par exemple, ou à certains gros projets stratégiques). Dans ce dernier cas, conserver la main sur les différentes instances permettra de ne pas en multiplier inutilement le nombre.
Dans le prochain épisode, nous parlerons des builds incassables...
[1] : Vincent Massol mentionnait déjà les build incassables, et les build distribués en 2004, preuve que ces pratiques (tests, intégration continue, agilité) entrent difficilement dans les entreprises (Françaises notamment).