Configurez un Fil d’Ariane pour organiser vos demandes liées dans JIRA


Publié par
Jérémie MARTINEZ

13 mai 2015

De plus en plus de problématiques intégrées dans JIRA impliquent la mise en place de demandes liées sur plusieurs niveaux hiérarchiques, créant au final une arborescence de demandes.

Vous pouvez créer ces types d’organisations grâce à certains add-ons : EXOCET par exemple, fournit des opérations pour créer des demandes et des tableaux listant les demandes liées. Cependant, aucune des solutions actuelles ne permettent d’avoir une vue globale de l’arborescence. Ainsi, si on imagine une architecture de demandes sur 3 niveaux, lorsqu’on se positionne sur la demande de troisième niveau, nous aurons un lien vers la demande de deuxième niveau (fourni par JIRA ou enrichi par Exocet) mais nous n’aurons pas d’information concernant la demande de premier niveau.

Pour pallier à ce manque, nous pouvons créer un fil d’Ariane dynamique qui vous donnera une vue de la hiérarchie de la demande et vous permettra de remonter aux demandes « parents ».

Comment faire ?

Le pré-requis à cette méthode est que l’add-on gratuit Script Runner soit installé. Le champ personnalisé « Scripted Field » qu’il fournit sera largement utilisé dans cet article.

Pour illustrer cette problématique, nous allons implémenter le cas d’utilisation de la gestion des notes de frais :

Pour un Projet informatique en cours, un consultant a la possibilité de créer une ou plusieurs notes de frais. Pour chacune des notes de frais, les types de dépenses devront être distingués (Restaurant, Parking, Frais kilométriques etc…).

D’un point de vue conceptuel, nous obtenons ceci :

MCD_Blog

Nous utiliserons 3 types de demandes « Standard » afin de ne pas être limité par le système de sous-tâche classique qui ne propose que 2 niveaux de demandes.

Créer sa hiérarchie de demandes

3 demandes seront utilisées pour démontrer ce cas d’utilisation :

  • La demande WPM-27 de  type « Project » sera notre « niveau 1 » :

Blog_01

  • La demande WPM-28 de  type « Expenses Report » sera notre « niveau 2 » :

Blog_02

  • La demande WPM-30 de type  «Mileage expense» sera notre  « niveau 3 » :

Blog_03

Ces demandes sont liées de la manière suivante :

  • La WPM-27 a pour Note de Frais la WPM-28 :

Blog_04

  •  La WPM-28 a pour Type de Frais la WPM-30 :

Blog_05

  Des tableaux Exocet sont configurés :

  • Un tableau « Notes de Frais » affiche les notes de frais créées pour un Projet.

Blog_06

  • Un tableau «Types de frais» affiche dans la liste des frais pour chacune des notes de frais.

Blog_07

Dans une implémentation « réelle », des champs personnalisés calculant les différentes sommes devront être ajoutés au niveau de la note de frais (Somme de la note de frais) et/ou au niveau du projet (Somme Totale des notes de frais). Un exemple de champ de « Scoring » est disponible dans l’article suivant.

Créer et configurer un champ personnalisé Scripted Field

Créez un champ personnalisé «Navigation Path » de type « Champ Scripté » et ajoutez le aux écrans de vue de votre projet.

Ensuite, dans le menu « Scripted Field », associez le script suivant au champ que vous venez de créer :

import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.ManagerFactory

enableCache = {-> false}

def componentManager = ComponentManager.getInstance()
def issueLinkManager = componentManager.getIssueLinkManager()

String navPath

String separator = " > "
String urlJIRA1 = "<a class='issue-link' href='http://localhost:8080/browse/"
String urlJIRA2 = "'>"
String urlJIRA3 = "</a>"

//If issue type is "Level 2" (id = 10104) and issue link is "L1 to L2" (id = 10130)
if(issue.getIssueTypeId().equals("10104")){
    issueLinkManager.getInwardLinks(issue.id).each {issueLink ->
        if (issueLink.issueLinkType.id == 10130) {
            def linkedIssue = issueLink.sourceObject
            navPath = urlJIRA1+linkedIssue.key+urlJIRA2+linkedIssue.key+urlJIRA3+separator+issue.key
        }
    }
}

//If issue type is "Level 3" (id = 10200) and issue link is "L3 to L2" (id = 10031)
if(issue.getIssueTypeId().equals("10200")){
    issueLinkManager.getInwardLinks(issue.id).each {issueLink2ndLevel ->
        //Get Issue in 2nd Level
        if (issueLink2ndLevel.issueLinkType.id == 10031) {
            def linkedIssue2ndLevel = issueLink2ndLevel.sourceObject
            //Get Issue in First level
            //If issue type is "Level 2" (id = 10104) and issue link is "L1 to L2" (id = 10130)
            if(linkedIssue2ndLevel.getIssueTypeId().equals("10104")){
                issueLinkManager.getInwardLinks(linkedIssue2ndLevel.id).each {issueLinkFirstLevel ->
                    if (issueLinkFirstLevel.issueLinkType.id == 10130) {
                        def linkedIssueFirstLevel = issueLinkFirstLevel.sourceObject
                        navPath = urlJIRA1+linkedIssueFirstLevel.key+urlJIRA2+linkedIssueFirstLevel.key+urlJIRA3+separator+urlJIRA1+linkedIssue2ndLevel.key+urlJIRA2+linkedIssue2ndLevel.key+urlJIRA3+separator+issue.key
                    }
                }
            }
        }
    }
}

return navPath
Il faudra adapter le script en fonction de vos propres identifiants de type de demandes et de type de liens.

Utilisation du fil d’Ariane

Un fil d’Ariane apparaît alors dans la vue de vos demandes et est désormais utilisable dans les demandes de niveau 2 et de niveau 3 :

  • Exemple dans le niveau 2 :

Blog_08

Ainsi il sera possible de remonter à la demande WPM-27 depuis la demande WPM-28 :

Blog_09

  • Exemple dans le niveau 3 :

Blog_10

Ainsi il sera possible de remonter à la demande WPM-27 ou à la demande WPM-28 depuis la demande WPM-30.

Blog_11

Des demandes liées hiérarchiquement organisées

Ainsi, grâce à cet exemple très simple à implémenter dans vos instances JIRA, vous pourrez afficher l’arborescence des demandes liées et permettre à vos utilisateurs d’y naviguer rapidement et simplement.

Cela correspond à l’un de vos besoins? N’hésitez pas à l’essayer et à partager vos retours et suggestions en commentaire !

  • Bonjour,

    1) Je viens d’acheter Issue matrix, est-ce que Exocet peut faire la même chose?

    Je l’utilise pour configurer les colonnes sur Issues Links et sur Sub-task

    2) Nous utilisons TMT pour la gestion des tests, test-cases dans confluence, test-cycle en tant qu’issue type Jira et test-run en tand que sous tache du test cycle.

    Exocet est envisagé pour une fonction create and Link entre le test-run et le bug décelé .

    Il y a t’il d’autre utilisation envisageable?

    Cordialement,

    Guillaume Mackowiak