I. Composants de l'usine de développement▲
Le tableau ci-dessous liste les différentes briques de l'usine de développement ainsi que les motivations qui m'ont poussé à les choisir.
Brique de l'usine logicielle |
Outil |
Plateforme |
Raisons |
---|---|---|---|
Gestionnaire de Code Source (SCM) |
Git |
GitHub |
Pour utiliser la pleine puissance de Git, bridé jusque-là par l'utilisation en entreprise du bridge git-svn. |
Outil de build |
Maven |
Poste de Dev |
L'incontournable Maven. Mais cela aurait pu être l'occasion de tester Gradle. |
Intégration continue |
Jenkins |
CloudBees |
Un comble : probablement celui que je connaissais le moins par rapport à Continuum, Bamboo et TeamCity. |
Dépôt de binaires |
Entrepôt Maven |
CloudBees |
Offre de base de CloudBees suffisante. Accès par WebDAV. |
Espace documentaire |
Wiki |
GitHub |
Pages versionnées avec Git Syntax MarkDown Le XWiki de CloudBees aurait pu être un autre choix. |
BugTracker |
Navigateur Web |
GitHub |
Projets OSS personnels pas suffisamment actifs pour bénéficier d'un Jira (ni même d'une licence JRebel). |
Afin de vous donner une idée du résultat, je vous invite à jeter un coup d'œil aux différentes URL :
- Jenkins DEV@Cloud : https://javaetmoi.ci.cloudbees.com
- Entrepôt Maven : https://repository-javaetmoi.forge.cloudbees.com/
- Compte GitHub : https://github.com/arey
II. Prérequis▲
Deux prérequis sont nécessaires au déploiement d'une telle usine de développement :
- Disposer d'un compte GitHub et d'un entrepôt contenant un projet Java déjà mavenisé ;
- Avoir accès à la plateforme de build de CloudBees, soit en souscrivant à l'une des offres gratuites ou payantes, soit en souscrivant au Free FOSS Programm.
III. Configuration Maven▲
Afin de pouvoir intégrer un projet mavenisé dans l'usine de développement, il est préalablement nécessaire de compléter sa configuration Maven pour prendre en compte :
- le gestionnaire de code source pour que Maven ait accès en lecture/écriture à l'entrepôt Git distant (hébergé ici sur GitHub), ce qui est, par exemple, nécessaire pour tagger et faire des releases Maven ;
- les entrepôts Maven des releases et des snapshots, ce qui est utile à Jenkins ou au plugin release de Maven pour déployer un artefact, et par Maven pour télécharger des artefacts ;
- la configuration de l'extension Maven wagon-webdav, utile lors du déploiement d'un artefact sur le repo Maven CloudBees utilisant le protocole WebDAV ;
- les credentials d'accès en écriture au WebDAV, là encore utiles pendant la phase de déploiement d'un artefact.
Toute cette configuration est détaillée dans un précédent billet intitulé Release Maven sous Windows d'un projet GitHub déployé sur CloudBees. Vous y trouverez notamment comment configurer les différentes balises Maven au travers de deux fichiers :
- pom.xml : <scm>, <distributionManagement>, <repositories> et <extensions> ;
- settings.xml : <servers>.
Gage de son intérêt, le projet github maven-config-github-cloudbees à l'origine de l'article a été forké par Ryan Cambell et est désormais proposé dans la CloudBees Community de GitHub.
Une fois le pom.xml commité dans GitHub avec le reste du code source, le build Jenkins correspondant peut être configuré.
IV. Configuration Jenkins▲
Depuis la console d'administration de Jenkins, vérifier que le Jenkins GIT plugin est installé, puis installer le GitHub plugin.
Dans la section CloudBees DEV@Cloud Authorization, configurer l'URL du chemin d'accès à l'entrepôt GitHub qui sera utilisé par le plugin GitHub :
Dans la section « Gestion de code source » du build Jenkins, sélectionner l'option « Git Repositories », puis renseigner l'URL de l'entrepôt.
La syntaxe à utiliser est la suivante :https://github.com/<username>/<repository name>.git
Exemple : https://github.com/arey/hibernate-hydrate.git
Afin que Jenkins lance le build lors de la réception d'un hook en provenance de GitHub, sélectionner la case « Build when a change is pushed to GitHub » dans le panneau ci-dessous :
La version de Maven, le chemin vers le pom.xml racine ainsi que le Goal à exécuter peuvent être configurés dans la section Build :
Lorsqu'aucun goal n'est précisé, Jenkins exécute un install.
À la fin du build, on indique à Jenkins de déployer les artefacts dans l'entrepôt CloudBees des snapshots :
Afin d'exploiter au mieux le plugin GitHub de Jenkins et laisser Jenkins configurer les hooks dans GitHub, il est possible de renseigner votre login/mot de passe dans l'encart GitHub Web Hook accessible depuis le menu « Administration Jenkins > Configurer le Système ».
Dernière étape de la mise en place de notre usine de développement : la configuration de GitHub.
V. Configuration GitHub▲
Pour que Jenkins soit notifié à chaque push dans GitHub et relancer ainsi le build Maven configuré précédemment, il est nécessaire de configurer un Hook Web dans GitHub.
La WebHook URL doit référencer votre forge logicielle CloudBees.
Syntaxe : https://<cloudbees username>.ci.cloudbees.com/github-webhook/
Exemple : https://javaetmoi.ci.cloudbees.com/github-webhook/
Cette configuration n'est à priori pas nécessaire si vous utilisez le plugin GitHub Jenkins. Ce dernier se charge en effet d'ajouter les WebHooks pour vous.
Pour que CloudBees ait les habilitations nécessaires pour accéder à l'ensemble de vos entrepôts GitHub, sa clé publique doit être ajoutée dans la partie SSH Keys accessible via le menu d'administration de GitHub :
En principe, si je n'ai rien omis de mentionner dans ce guide, tout est prêt. Et pour vérifier que votre usine de développement est opérationnelle, vous avez le choix entre :
- Pousser une modification dans votre entrepôt GitHub.
- Ou simuler un hook depuis GitHub.
VI. Conclusion▲
Suivant CloudBees depuis son lancement, il y a plus de deux ans, j'ai eu la chance de pouvoir bénéficier début 2012 de l'offre gratuite Free and Open-Source Software. Après avoir passé un peu de temps au départ pour mettre en place mon usine, j'en suis aujourd'hui pleinement satisfait et je serais prêt à l'expérimenter en entreprise.
N'ayant utilisé qu'une infime partie des services proposés par CloudBees, de nombreuses découvertes s'offrent encore à moi : utiliser le plugin release de Jenkins, tester SauceLabs ou bien encore déployer une application Web sur la plateforme RUN@CloudBees.
Apparu quelques mois après mes débuts sur DEV@cloud, CloudBees propose le produit BuildHive aux développeurs utilisant GitHub et qui souhaitent mettre en place de l'intégration continue sur leur projet. Non seulement ce produit est gratuit, mais il simplifie considérablement la configuration de votre build, à la fois côté Jenkins et côté GitHub grâce au protocole Oauth. Tout est automatisé. Je me suis inscrit et j'ai créé mon premier build en à peine deux minutes. Un hook sur les pull request permet même de lancer un build afin de valider le code soumis. Néanmoins, il y a tout de même quelques limitations par rapport à la solution que je vous ai proposée : pas d'entrepôt Maven, impossibilité d'installer des plugins Jenkins… À vous de décider lequel vous convient !
VII. Remerciements▲
Cet article a été publié avec l'aimable autorisation d'Antoine Rey. L'article original (Ma petite usine logicielle) a été rédigé par Antoine Rey.
Nous tenons à remercier zoom61 pour la relecture orthographique attentive de cet article et milkoseck pour la mise au gabarit.