Installer un plugin sur JIRA (2/2)

Pour bien continuer l'année 2017, voici la suite et la fin de notre diptyque : installer un plugin sur JIRA (voir la première partie : Installer un plugin JIRA, 1re partie)

Nous avons vu que, quoique facile, la mise en place d'un plugin sous JIRA peut gagner à être automatisée, pour déployer plus d'un plugin à la fois, pour en installer un de manière planifiée sans intervention humaine, pour installer un plugin qui ne serait pas rendu public sur le marketplace, ou simplement pour s'assurer que la configuration sera répétable (à des fins de gestion de la configuration.)

C'est ce que nous allons explorer aujourd'hui.

Le plugin Universal Plugin Manager (UPM) dispose d'une API REST que nous allons mettre à profit.

Globalement, l'installation programmatique d'un plugin se fait en deux étapes :

  1. Obtenir d'abord un jeton d'UPM ;
  2. Envoyer ensuite une requête HTTP, incluant dans ses en-têtes le jeton obtenu à l'étape précédente.

Détaillons maintenant la manœuvre.

Envoyer d'abord une requête HEAD à l'URL suivante : http://localhost:8080/rest/plugins/1.0/?os_authType=basic

Naturellement, le nom d'hôte et le port sont à ajuster en fonction de l'instance réelle de JIRA.

Le HEAD effectué ci-dessus nécessite de disposer des identifiants d'un administrateur JIRA ; ces identifiants, login et mot de passe, sont à envoyer dans les en-têtes de la requête (entête Authorization). Toujours dans les en-têtes, il faut ajuster le Accept à la valeur application/vnd.atl.plugins.installed+json

Dans la réponse envoyée par JIRA, capturer l'en-tête upm-token : il contient le jeton UPM dont nous aurons besoin à l'étape suivante (stocké ci-après dans une variable ${upm_token}).

Installons maintenant notre plugin en émettant une requête POST : http://localhost:8080/rest/plugins/1.0/?token=${upm_token}

S'assurer que figurent, parmi les en-têtes de notre requête, les en-têtes suivants :

  Accept: "application/json"
  Content-Type: "application/vnd.atl.plugins.install.uri+json"

Le corps de notre requête doit être constitué du JSON suivant :

{
   "pluginUri":"${plugin_xml_url}",
   "pluginName":"Mon Plug-in"
}

Remplacer la variable $plugin_xml_url avec l'adresse hébergeant le fichier descripteur de votre plugin et la chaîne « Mon Plug-in » par… le nom du plugin, qui sera visible dans JIRA.

Cette action suffit normalement à enregistrer le plugin au sein de JIRA. Il sera toutefois prudent de ne pas se fier au code HTTP retour renvoyé par JIRA (202 Accepted) et de vérifier dans l'administration de JIRA que le plugin est bel et bien installé.

Résumé en un script, cela donnerait quelque chose comme suit :

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';
use utf8;
use open qw/:std :locale/;

use LWP::UserAgent;
use MIME::Base64;
use JSON;

my $username    = "jira.admin";
my $password    = "mot de passe";
my $credentials = encode_base64 "$username:$password","";
my $base_url    = "http://localhost:8080";
my $resource    = "/rest/plugins/1.0/";

# Création du client HTTP, avec l'en-tête nécessaire à l'authentification
my $ua = LWP::UserAgent->new();
$ua->default_header('Authorization' => "Basic $credentials");

# une requête HTTP HEAD remplace avantageusement un GET
# puisque seuls les en-têtes de la réponse nous intéressent ici
my $res = $ua->head($base_url . $resource . '?os_authType=basic');
my $upm_token = $res->header( "upm-token" );

# Notre JSON. La clef pluginUri contient une URI qui
# renvoie au descripteur XML du plugin ciblé (ici, sur
# le marketplace, mais il peut être hébergé ailleurs)
my $text = {
    "pluginName" => "JIRA Automation Plugin",
    "pluginUri"  => "https://marketplace.atlassian.com/download/plugins/com.atlassian.plugin.automation.jira-automation-plugin/version/200000210/descriptor"
};

# On transforme la structure de données Perl en JSON valide
my $json = encode_json $text;
my $content_type = "application/vnd.atl.plugins.install.uri+json";

# Notre POST final, qui se charge d'installer le plug-in à notre place
$res = $ua->post( $base_url.$resource."?token=$upm_token",
                   'Content-Type' => $content_type,
                   'Accept'  => 'application/json',
                   'Content' => $json );

say $res->status_line();
install_plugin.pl

Le script ci-dessus n'est qu'un exemple de ce qu'il est possible de faire et serait améliorable sur plusieurs points : par exemple récupérer la valeur de pluginUri automatiquement, qui change à chaque nouvelle version de plugin, gérer le cas d'un plugin nécessitant une licence… Laissez aller votre imagination !

Ressources

bouton_atlassian

Laisser un commentaire

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

Captcha *