API REST en java pour JIRA

logo_jiraSuite à une migration d’utilisateurs et de groupes dans un nouveau LDAP, il m’a fallu modifier les groupes utilisés dans les rôles de près de 800 projets. Inconcevable de réaliser cette tâche manuellement j’ai donc commencé à regarder quelles solutions étaient envisageables, REST, SOAP, script groovy, CLI etc …

J’ai choisi d’utiliser l’API REST de JIRA qui permet d’ajouter des fonctionnalités supplémentaires en utilisant le format JSON et les méthodes HTTP. Ayant des connaissances en développement JAVA, je me suis tourné vers JRJC (The JIRA Rest Java Client supporté par Atlassian) cependant la méthode d’ajout d'acteur dans le rôle d’un projet n’existe pas.

Heureusement il est assez facile de créer un client simple en utilisant les bibliothèques Jersey, pour cela on commence par créer un projet maven (pour ma part j’utilise Eclipse) puis d’ajouter dans le pom.xml la dépendance à Jersey :

<dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.8</version>
</dependency>

La documentation REST d’Atlassian nous donne la syntaxe à utiliser : /rest/api/2/project/{projectIdOrKey}/role/{id} Avec comme input : { "group" : ["jira-developers"] }

Nous créons donc dans notre classe java une ressource web à partir d’un client Jersey

String baseURL = “http://localhost:8080/”
String restURL = “/rest/api/2/project/TEST/role/10002”

Client client = Client.create();
WebResource webResource = client.resource(baseURL+ restURL);

La réponse s’obtient en utilisant la WebResource avec comme paramètres :  le type d’authentification (Basic), le type de format (JSON) et la méthode post.
Il existe 3 types d’authentification, la plus simple étant la Basic Authentification que nous utilisons ici :

String auth = new String(Base64.encode("user:pass"));
String donnee = { "group" : ["jira-developers"] };
ClientResponse response = webResource
    .header("Authorization", "Basic " + auth)
    .type("application/json")
    .accept("application/json")
    .post(ClientResponse.class, donnee);

Il suffit ensuite de vérifier le code de la réponse :

  • 200 – Si le projet et le rôle existent et que l’utilisateur a la permission de les voir.
  • 404 – Si l’acteur ne peut pas être ajouté au rôle du projet
  • 401 – Si l'authentification est incorrecte

Pour finir j’ai ajouté dans ma classe java la lecture d’un fichier CSV contenant 3 colonnes :

  • La clé du projet
  • Le nom du groupe à ajouter
  • L’id du rôle
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import javax.naming.AuthenticationException;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.util.Base64;

public class App {    
    public static void main(String[] args){
        String csvFile = "C:\\projectRole.csv";
        final String SEPARATOR = ";";
        FileReader monFichier = null;
        BufferedReader tampon = null;
        try {
            monFichier = new FileReader(csvFile);
            tampon = new BufferedReader(monFichier);
            String auth = new String(Base64.encode("admin:admin"));
            String url = "http://localhost:8080/rest/api/2/project/";
            String url2 = "/role/";
            while (true) {
                String ligne = tampon.readLine();
                if (ligne == null){break;}
                else{
                	String[] data = ligne.split(SEPARATOR);
                    Client client = Client.create();
                    WebResource webResource = client.resource(url+data[0]+url2+data[2]);
                    String donnee = "{ \"group\" : [\"" + data[1] + "\"] }";
                    ClientResponse response = webResource.header("Authorization", "Basic " + auth)
                         .type("application/json").accept("application/json")
                         .post(ClientResponse.class, donnee);
                    int statusCode = response.getStatus();
                    if (statusCode == 401) {
                        throw new AuthenticationException("Invalid Username or Password");
                    }else if(statusCode == 404){
                        System.out.println("l’acteur" +data[1]+" ne peut pas être ajouté au rôle du projet");
                    }
                }
            }
        } catch (IOException exceptionFile) {
        	exceptionFile.printStackTrace();
        } catch (AuthenticationException exceptionAuth) {
        	exceptionAuth.printStackTrace();
		} finally {
            try {
                tampon.close();
                monFichier.close();
            } catch (IOException exceptionIO) {
            	exceptionIO.printStackTrace();
            }
        }
    }
}

Sources :

bouton_atlassian_netapsys

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.