I. INTRODUCTION▲
Mylyn est un plugin d'Eclipse. Il s'agit d'un gestionnaire de tâches. Il permet de visualiser des tâches depuis un dépôt de tâches (Bugzilla, Mantis, Jira, Redmine, etc.) et les résultats de construction depuis un serveur d'intégration continue (Hudson, Jenkins).
L'objectif de Mylyn est de permettre au développeur de se concentrer sur la réalisation et de perdre moins de temps avec les tâches liées (recherche de documentation, de sources à modifier, saisie de commentaires pour la gestion de versions).
Les principales fonctionnalités de Mylyn sont la visualisation et la mise à jour d'une demande (description, pièces jointes, temps, statut, commentaires…), le préremplissage du commentaire lorsque l'on pousse les sources sur un gestionnaire de versions et le contexte. Le contexte est l'association d'un certain nombre de fichiers à une tâche. En fait, Mylyn retient les fichiers auxquels le développeur accède durant l'exécution d'une tâche. Cela est visible dans le contexte de la tâche et peut être partagé dans le gestionnaire de tâches. De plus depuis la version 3.5, Mylyn comporte un connecteur avec les serveurs d'intégration continue Hudson et Jenkins permettant de visualiser les résultats des constructions.
Dans cet article, nous allons voir l'intégration de Mylyn avec Redmine. Les codes source seront poussés sous Gitblit. Ces sources seront récupérées dans Jenkins pour que le projet soit construit. Et nous visualiserons les résultats des constructions dans Mylyn.
Si vous avez besoin d'aide sur Gitblit ou Redmine, nous pouvez consulter les articles suivants : Tutoriel sur la mise en place d'un entrepôt distant GIT à partir de l'outil GITBlit et Installation du gestionnaire de projets Redmine sous Windows.
II. CRÉATION DES DONNÉES D'EXEMPLE▲
II-A. Création des données d'exemple dans Gitblit▲
II-A-1. Création de l'utilisateur dans Gitblit▲
Créer dans Gitblit l'utilisateur qui sera utilisé depuis Eclipse pour pousser les sources (dans cet exemple, l'utilisateur est « rpouiller » et il a un e‑mail chez Google).
II-A-2. Création du dépôt dans Gitblit▲
Créer dans Gitblit le dépôt où seront poussées les sources (dans cet exemple, le dépôt s'appelle « exempleMylyn » et l'utilisateur « rpouiller » a tous les droits dessus).
II-B. Création des données d'exemple dans Redmine▲
II-B-1. Création de l'utilisateur dans Redmine▲
Dans Redmine (dans « Administration »/« Utilisateurs »), cliquer sur « Nouvel utilisateur ».
Saisir les informations et cliquer sur le bouton « Créer » (dans l'exemple un identifiant « regis » avec la même adresse e‑mail que celui de Gitblit).
On peut remarquer que la seule valeur qui est semblable entre l'utilisateur sous Gitblit et celui sous Redmine c'est l'adresse e‑mail. C'est l'adresse e‑mail qui est utilisée par Redmine pour associer automatiquement ces deux utilisateurs (toutefois, il est possible d'associer manuellement un utilisateur Redmine et un utilisateur Gitblit comme évoqué dans le chapitre IV-JVisualisation des sources dans Redmine).
II-B-2. Création du projet dans Redmine▲
Dans Redmine (dans « Projets »), cliquer sur « Nouveau projet ».
Saisir les informations et cliquer sur le bouton « Créer ».
Cliquer sur l'onglet « Membres » afin de sélectionner des membres.
Rajouter l'utilisateur Redmine que l'on vient de créer dans les membres du projet.
III. INSTALLATION DE LA CONNEXION ENTRE REDMINE ET MYLYN▲
La connexion entre Redmine et Mylyn nécessite un connecteur pour Mylyn dans Redmine et un connecteur pour Redmine dans Mylyn.
III-A. Plugin Redmine : Mylyn Connector▲
Dans le dossier « plugins » de l'installation de Redmine, exécuter les commandes suivantes :
D:\redmine\redmine\plugins>
git clone git://github.com/ajacques/redmine_mylyn_connector.git
Cloning into 'redmine_mylyn_connector'
...
remote: Reusing existing pack: 1556
, done
.
remote: Counting objects: 156
, done
.
remote: Compressing objects: 100
%
(
93
/93
), done
.
rRemote: Total 1712
(
delta 69
), reused 124
(
delta 50
)eceiving objects: 98
%
(
1678
/1712
), 236
.00
KiB
Receiving objects: 100
%
(
1712
/1712
), 241
.08
KiB |
221
.00
KiB/s, done
.
Resolving deltas: 100
%
(
800
/800
), done
.
Checking connectivity... done
.
D:\redmine\redmine\plugins>
cd ..
D:\redmine\redmine>
bundle install --without development test
Using rake (
10
.1
.1
)
Using i18n (
0
.6
.9
)
Using multi_json (
1
.8
.4
)
Using activesupport (
3
.2
.16
)
Using builder (
3
.0
.0
)
Using activemodel (
3
.2
.16
)
Using erubis (
2
.7
.0
)
Using journey (
1
.0
.4
)
Using rack (
1
.4
.5
)
Using rack-cache (
1
.2
)
Using rack-test (
0
.6
.2
)
Using hike (
1
.2
.3
)
Using tilt (
1
.4
.1
)
Using sprockets (
2
.2
.2
)
Using actionpack (
3
.2
.16
)
Using mime-types (
1
.25
.1
)
Using polyglot (
0
.3
.3
)
Using treetop (
1
.4
.15
)
Using mail (
2
.5
.4
)
Using actionmailer (
3
.2
.16
)
Using arel (
3
.0
.3
)
Using tzinfo (
0
.3
.38
)
Using activerecord (
3
.2
.16
)
Using activeresource (
3
.2
.16
)
Using coderay (
1
.1
.0
)
Using daemons (
1
.1
.9
)
Using eventmachine (
1
.0
.3
)
Using rack-ssl (
1
.3
.3
)
Using json (
1
.8
.1
)
Using rdoc (
3
.12
.2
)
Using thor (
0
.18
.1
)
Using railties (
3
.2
.16
)
Using jquery-rails (
2
.0
.3
)
Using net-ldap (
0
.3
.1
)
Using pg (
0
.17
.1
)
Using ruby-openid (
2
.3
.0
)
Using rack-openid (
1
.4
.1
)
Using bundler (
1
.5
.2
)
Using rails (
3
.2
.16
)
Using rmagick (
2
.13
.2
)
Using thin (
1
.3
.1
)
Your bundle is complete!
Gems in
the groups development and test were not installed.
Use `bundle show [gemname]`
to see where a bundled gem is installed.
D:\redmine\redmine>
Toutefois (suite à un retour de lecteur) dans certains cas, il peut-être nécessaire d'utiliser la commande
bundle install
bundle install --without development test
Redémarrer le service de Redmine et le serveur web Apache.
Le plugin est visible dans Redmine (dans « Administration » / « Plugins »)
Il faut également activer l'API REST de Redmine (dans « Administration » / « Configuration » / « Authentification »).
III-B. Plugin Mylyn : Redmine Connector▲
Télécharger le zip du plugin depuis la page https://github.com/ljader/redmine-mylyn-plugin (depuis le lien de « Download latest build version of plugin as p2 repo from link: ZIP with built plugin as P2 repo » de la partie « Installation »).
Dans Eclipse, aller dans le menu « Help » / « Install New Software… ».
Cliquer sur le bouton « Add… ».
Sélectionner le zip précédemment téléchargé.
Cocher « Mylyn Integration ». Puis cliquer sur le bouton « Next > ».
Vous pouvez obtenir le message ci-dessous :
Cannot complete the install because one or more required items could not be found.
Software being installed: Mylyn Connector: Redmine 0.4.0.201309270836 (net.sf.redmine_mylyn.feature.feature.group 0.4.0.201309270836)
Missing requirement: Logback Native SLF4J Logger Module 0.9.27.v20110224-1110 (ch.qos.logback.slf4j 0.9.27.v20110224-1110) requires 'bundle org.slf4j.api [1.6.1,1.7.0)' but it could not be found
Cannot satisfy dependency:
From: Mylyn Connector: Redmine 0.4.0.201309270836 (net.sf.redmine_mylyn.feature.feature.group 0.4.0.201309270836)
To: ch.qos.logback.slf4j [0.9.27.v20110224-1110]
Si cela se produit, il faut copier le fichier org.slf4j.api_1.6.4.v20120130-2120.jar dans le dossier « plugins » de Eclipse et recommencer après avoir relancé Eclipse.
Cliquer sur le bouton « Next > ».
Sélectionner « I accept the terms of the license agreement ». Puis, cliquer sur le bouton « Finish ».
Cliquer sur le bouton « OK ».
Attendre la fin de l'installation.
Cliquer sur le bouton « Yes ».
IV. UTILISATION DE MYLYN ET REDMINE▲
IV-A. Ajout du dépôt de tâches de Redmine dans Mylyn▲
Faire un clic droit dans la vue « Task Repositories » et choisir « Add Task Repository… ».
Sélectionner « Redmine (supports Redmine 1.0 with enabled REST-API and Mylyn-Plugin) » et cliquer sur le bouton « Next > ».
Saisir les informations et cliquer sur le bouton « Validate Settings ».
Cliquer sur le bouton « Finish ».
Cliquer sur le bouton « No ».
Le nouveau dépôt de tâches a été rajouté.
IV-B. Création d'une requête pour afficher les tâches▲
Faire un clic droit dans la vue « Task List » et choisir « New » / « Query… ».
Sélectionner « Redmine » et cliquer sur le bouton « Next > ».
Cliquer sur le bouton « Next > ».
Saisir les critères et cliquer sur le bouton « Finish ».
La requête apparaît dorénavant dans la vue « Task List ».
IV-C. Création d'une demande dans Redmine▲
Dans l'onglet « Nouvelle demande », saisir les informations et cliquer sur le bouton « Créer ».
La demande a été créée.
IV-D. Traitement de la demande dans Eclipse▲
La demande est visible sous Eclipse après une synchronisation (manuelle ou automatique). Il est possible de visualiser le détail de tâche en double-cliquant dessus.
Lorsque l'on commence à travailler sur une demande, il faut activer cette tâche en effectuant un clic droit sur la tâche et choisissant « Activate ».
Indiquer que la demande est en cours en cliquant sur la tâche et sélectionnant « Mark as »/« En cours ». Ensuite, cliquer sur le bouton « Submit » du détail de la tâche.
Le changement de statut apparaît dans Redmine.
Lorsque l'on pousse les sources vers le gestionnaire de versions, le commentaire est rempli automatiquement avec les informations fournies par Mylyn.
Il faut mettre à jour le « Done ratio » et le « Status ».
Il est également possible de saisir un temps de travail avant de soumettre la mise à jour en cliquant sur le bouton « Submit ».
Après il faut désactiver cette tâche en effectuant un clic droit sur la tâche et choisissant « Desactivate ».
IV-E. Clôture de la demande dans Redmine▲
Les changements apparaissent dans Redmine.
Il est possible de mettre à jour le statut en « Fermé ».
Le résultat après mise à jour.
IV-F. Cas de demandes plus complexes▲
Créer la demande suivante « Transformation en majuscules » ainsi que les sous-tâches (il n'est pas nécessaire de saisir le temps estimé de la tâche parente : il sera calculé en fonction de ceux des tâches enfants).
Ci-dessous les deux tâches enfants « Classe utilitaire de transformation » et « Test de la transformation ».
Créer la demande suivante « Classe principale (main) appelant la transformation en majuscules » liée à la tâche « Transformation en majuscules ».
Cela donne le diagramme de Gantt suivant.
Lorsque la tâche « Classe utilitaire de transformation » est résolue à 100 %, cela donne le diagramme de Gantt suivant.
IV-G. Ajout d'un commentaire depuis Mylyn▲
Il est possible directement depuis Mylyn de rajouter un commentaire à la demande.
Le commentaire est visible dans Redmine.
IV-H. Ajout d'une pièce jointe depuis Mylyn▲
Mylyn permet d'attacher une pièce jointe simple (bouton « Attach… ») ou à partir d'une capture d'écran (bouton « Attach Screenshoot… »).
Après avoir ajouté la pièce jointe, il suffit de la soumettre en cliquant sur le bouton « Submit ».
La pièce jointe est accessible dans Redmine.
IV-I. Contexte Mylyn▲
Une fonctionnalité très intéressante de Mylyn est le contexte. Le contexte permet de connaître les fichiers correspondant (c'est-à-dire créés ou modifiés) à une tâche donnée.
Mylyn permet d'attacher le contexte à la tâche.
Le contexte est transmis à Redmine sous forme de fichier zip. Toute personne travaillant par la suite sur cette tâche aura accès au contexte.
IV-J. Visualisation des sources dans Redmine▲
Dans le dossier de l'installation de Redmine, exécuter les commandes suivantes afin de cloner le dépôt :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
D:\redmine\redmine>
md repos
D:\redmine\redmine>
cd repos
D:\redmine\redmine\repos>
git clone --bare git://localhost/exempleMylyn.git exempleMylyn.git
Cloning into bare repository 'exempleMylyn.git'
...
remote: Counting objects: 27
, done
remote: Finding sources: 100
%
(
27
/27
)
remote: Getting sizes: 100
%
(
23
/23
)
remote: Total 27
(
delta 0
), reused 27
(
delta 0
)
Receiving objects: 100
%
(
27
/27
), done
.
Dans « Configuration »/« Dépôts » du projet, cliquer sur « Nouveau dépôt ».
Saisir les informations et cliquer sur le bouton « Créer ».
Le dépôt est maintenant configuré. Le lien « Utilisateurs » permet d'associer manuellement un utilisateur Git (ici Gitblit) à un utilisateur Redmine.
Les modifications des sources sont maintenant visibles dans « Dépôt » du projet.
Les commandes suivantes permettent de récupérer les dernières versions de sources (il est souhaitable de planifier un lancement régulier de cette commande).
2.
3.
4.
5.
6.
7.
D:\redmine\redmine\repos\exempleMylyn.git>
git fetch
From git://localhost/exempleMylyn
* branch HEAD ->
FETCH_HEAD
D:\redmine\redmine\repos\exempleMylyn.git>
git reset --soft FETCH_HEAD
D:\redmine\redmine\repos\exempleMylyn.git>
V. INSTALLATION DE JENKINS ET CREATION DU JOB▲
V-A. Installation de Jenkins▲
Pour cet article, j'ai choisi Jenkins mais cela fonctionne de manière similaire avec Hudson (testé avec la version 3.1.1).
Au moment de la rédaction de cet article, la dernière version LTS (Long-Term Support Release) de Jenkins est 1.532.1. Mais cette version ne fonctionne pas correctement avec Mylyn (lorsque l'on lance une construction, elle est bien lancée mais Mylyn affiche un message d'erreur). Aussi, j'utilise la version 1.509.1.
Pour installer Jenkins, il faut copier le fichier « jenkins.war » dans le dossier « webapps » de Tomcat.
Jenkins est accessible à l'adresse http://localhost:8080/jenkins.
V-B. Installation du plugin Git dans Jenkins▲
Par défaut, Jenkins ne permet pas de récupérer des sources depuis une dépôt de la famille Git. Il est donc nécessaire d'installer le plugin (en fait deux plugins).
Cliquer sur le lien « Administrer Jenkins ».
Normalement, il serait bien de régler le premier warning sur l'encodage UTF-8. Mais nous ne le verrons pas ici pour ne pas surcharger cet article.
Cliquer sur le lien « Gestion des plugins ».
Sélectionner l'onglet « Disponibles » et entrer le filtre « git ».
Sélectionner « Git Client Plugin » et « Git Plugin ». Puis, cliquer sur le bouton « Download now andinstall after restart ».
L'installation s'effectue.
Redémarrer le serveur Tomcat (normalement le redémarrage de l'application Jenkins suffit).
Les plugins sont installés.
V-C. Configuration du JDK et de Maven▲
Cliquer sur le lien « Administrer Jenkins ».
Cliquer sur le lien « Configurer le système ».
Cliquer sur le bouton « Ajouter JDK ».
Renseigner les champs « Nom » (comme dans Continuum, il est possible d'installer plusieurs JDK, cela permet de les distinguer) et « JAVA_HOME » (après avoir décocher « Install automatically »).
Cliquer sur le bouton « Ajouter Maven ».
Renseigner les champs « Nom » et « MAVEN_HOME » (après avoir décoché « Install automatically »). Puis, cliquer sur le bouton « Enregistrer ».
V-D. Création du job▲
Cliquer sur le lien « Nouveau Job ».
Nommer le job (ici « Exemple ») à créer et sélectionner « Construire un projet maven2/3 ». Puis, cliquer sur le bouton « OK ».
Sélectionner la gestion de code source Git, indiquer l'URL du dépôt et le chemin du POM Racine. Puis, cliquer sur le bouton « Sauver ».
Tester le job en cliquant sur le lien « Lancer un build ».
La construction est en cours.
Au bout d'un moment, la construction s'achève avec succès.
En survolant la construction, un menu apparaît. Choisir « Sortie Console ».
Ci-dessous, la trace de Maven indique « BUILD SUCCESSFUL ».
VI. UTILISATION DE MYLYN ET JENKINS▲
VI-A. Ajout du serveur Jenkins dans Mylyn▲
Dans la vue « Builds », choisir « Add Build Server… » dans le menu de l'icône d'ajout d'un serveur (ou cliquer directement sur l'icône d'ajout).
Sélectionner « Hudson (supports Jenkins) » et cliquer sur le bouton « Next > ».
Comme pour Redmine, entrer l'URL et un nom (nous n'avons pas activé l'authentification sur Jenkins alors elle n'est pas nécessaire dans cet article). Puis cliquer que le bouton « Validate ».
Une fois que le serveur est validé, sélectionner le projet « Exemple ». Puis, cliquer que le bouton « Finish ».
Le serveur et le projet sont maintenant visibles dans la vue.
VI-B. Lancement d'une construction depuis Mylyn▲
Faire un clic droit sur le projet et choisir « Run Build ».
On peut voir la construction dans Jenkins.
VI-C. Visualisation de l'historique des constructions▲
Faire un clic droit sur le projet et choisir « History ».
La vue « Historique » affiche les différentes constructions avec leur résultat. Le double-clic sur une construction affiche les détails de cette construction.
VI-D. Visualisation de la trace d'exécution▲
Le clic sur le lien « Show output in Console » affiche la trace d'exécution dans la vue « console ».
VI-E. Visualisation de la trace d'exécution▲
Le clic sur le lien « Show test results in JUnit View » affiche les résultats des tests JUnit dans la vue « JUnit ».
VI-F. Création d'une tâche dans Redmine depuis les résultats de Jenkins▲
Faire un clic droit sur un test et choisir « New Task from Failure… ».
Choisir « Redmine » et choisir « Finish ».
La description est remplie en automatique.
Entrer le titre et cliquer sur le bouton « Submit ».
On retrouve la tâche dans Redmine. Le boucle est bouclée.
VII. CONCLUSION▲
Cet article est centré sur l'association de Mylyn avec Redmine et Jenkins. Il ne montre pas d'autres fonctionnalités de Redmine : gestion de la documentation, wiki, forums, etc. Par ailleurs, Redmine peut être connecté avec un logiciel d'intégration continue comme Jenkins afin que les résultats des constructions soient visibles dans Redmine (grâce à ce plugin). Il ne montre pas non plus des aspects importants de l'administration de Jenkins comme l'encodage UTF-8 et la sécurité (miniliste non exhaustive).
Nous avons pu voir que ces associations entre Mylyn, Redmine et Jenkins permettent de simplifier la communication dans un projet et sa gestion. Le diagramme ci-dessous donne un aperçu des flux évoqués dans cet article. Dans cet exemple, sur chaque poste développeur, on installe un Eclipse packagé (installation simplifiée et homogénéité des postes). Dans ce package, on trouve Mylyn (inclus dans Eclipse) configuré avec le connecteur Redmine, le dépôt de tâches et Jenkins.
De plus, Mylyn, Redmine et Jenkins (associé avec un gestionnaire de versions) peuvent être une solution intéressante (sans prétendre à les résoudre complètement) à plusieurs points du test de Joël : « Utilisez-vous un système de gestion de code source ? » (amélioration de la qualité des commentaires), « Pouvez-vous faire un build en une seule étape ? » (l'intégration continue implique une construction automatisée), « Faites-vous des builds quotidiens ? » (l'intégration continue est planifiable et les anomalies peuvent être remontées dans Mylyn), « Avez-vous une base de données de bogues ? », « Avez-vous un planning à jour ? » (saisie des temps dans Mylyn puis remontée dans Redmine), « Avez-vous une spec ? » (rédaction dans le wiki, publication de documentation) et « Les programmeurs bénéficient-ils d'un environnement de travail calme ? » (l'objectif est de détourner au minimum le développeur des tâches non productives).
VIII. REMERCIEMENTS▲
Je remercie très sincèrement :
- www.developpez.com qui me permet de publier cet article ;
- Nono40 et djibril pour leurs outils ;
- Gueritarish et Mickael Baron pour leur relecture technique ;
- Claude Leloup et Philippe Duval pour leur relecture orthographique.