Tutoriel sur la mise en place d'une petite usine logicielle GitHub, CloudBees et Jenkins

Antoine Rey

Dans cet article, je vais vous expliquer comment créer votre propre usine logicielle en déployant sur GitHub et en utilisant l'offre DEV@Cloud de CloudBees où vous retrouverez les briques les plus classiques : SCM, intégration continue, dépôt de binaires, bug tracker, wiki…

Le gain : à chaque commit poussé dans GitHub, votre code est compilé, testé unitairement puis déployé dans un entrepôt Maven public dédié aux snapshots. Par ailleurs, vous pourrez effectuer des releases Maven en local depuis votre poste de développement ; les artefacts construits seront mis à disposition dans un entrepôt Maven dédié. Tout développeur pourra librement référencer l'un ou l'autre de ces entrepôts et utiliser votre code.

En bonus, si vous développez des projets open source, vous n'aurez même pas à sortir votre carte bancaire.

Pour réagir à ce tutoriel, un espace de dialogue vous est proposé sur le forum Commentez .

- Titre : Tutoriel sur la mise en place d'une petite usine logicielle GitHub, CloudBees et Jenkins

- Auteur : Antoine Rey

- Parution : 28 août 2015

- Licence : Copyright ® 2015 Antoine Rey. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Composants de l'usine de développement

- II. Prérequis

- III. Configuration Maven

- IV. Configuration Jenkins

- V. Configuration GitHub

- VI. Conclusion

- VII. Remerciements

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
+ CloudBees

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 :

1. Disposer d'un compte GitHub et d'un entrepôt contenant un projet Java déjà mavenisé ;

2. 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 :

1. Pousser une modification dans votre entrepôt GitHub.

2. 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.