Jira - Issues via Perl anlegen

Kurt Klinner

Im Rahmen des Rollouts von Jira im großen Stil, müssen auch einige "Alt-Systeme" angebunden werden. Im aktuellen Fall geht es um eine Perl-Schnittstelle die zukünftig nicht mehr die selbstentwickelte Software sonder Jira ansprechen soll. Bei der Recherche der diversen Möglichkeiten bin ich zu erst auf die Rest-API-Dokumentation von Atlassian gestossen. Die aufgeführten Curl Beispiele liefen problemfrei, also eben mal dran gemacht und eine Perl-Variante unter zu Hilfe name der CPAN Module JSON und REST::Client ein Skript geschrieben das entsprechend Issues anlegt

use strict;
use warnings;
use REST::Client;
use JSON;
use MIME::Base64;
my ($host, $url, $user, $password, $project, $issuetype);

$host='https://jira.YOURDOMAIN.com';
$url='/rest/api/2/issue';

$user='YOURUSERNAME';
$password='YOURPASSWORD';

#Proejectkey
$project='YOURPROJECT';
$issuetype='YOURISSUETYPE';

#JSON based post data
my %postdata=(
    "fields"=> {
       "project"=>
       {   
          "key"=> "$project"
       },  
       "summary"=> "REST a little bit ",
       "description"=> "Creating of an issue using project
       keys and issue type names using the REST API",
       "issuetype"=> {
          "name"=> "$issuetype"
       }   
   }   
);

my $headers = {Accept => 'application/json', Authorization => 'Basic ' . 
encode_base64($user . ':' . $password)};
my $client = REST::Client->new();
$client->addHeader('Content-Type', 'application/json');
$client->setHost($host);
$client->POST( $url, (encode_json(\%postdata), $headers));
print $client->responseContent();

Dank der verwendeten Module lies sich das ganze recht flott umsetzen, allerdings fand ich die verschachtelte Hash-Darstellung der Daten nicht besonders ansprechend (vor allem sobald Customfields referenziert werden müssten).

Ganz im Sinne von Perl (und dem geneigten, arbeitsscheuen DevOp) ging ich im CPAN auf Suche und wurde auch schnell mit JIRA::Client fündig. Die Implementierung ist straight forward wie unten aufgeführt.

use JIRA::Client;
use strict;
use warnings;

my ($url, $user, $password, $project, $issuetype,
$attachment_name, $attachment, $attachment_fh);

$url='https://jira.YOURCOMPANY.com';

$user='YOURUSERNAME';
$password='YOURPASSWORD';

#Proejectkey
$project='YOURPROJECT';
$issuetype='YOURISSUETYPE';

$attachment_name = 'demo.txt';
$attachment = '/PATHTO/demo.txt';


my $jira = JIRA::Client->new($url, $user, $password);

#Create new jira issue
my $issue = $jira->create_issue(
        {   
        project => $project,
        type => $issuetype,
        summary => 'GSD issue - remote test',
        #custom_fields => {'YOURCUSTOMFIELD' => 'VALUE'},
        }
        );
        
#Add attachment to the generated issue
open ($attachment_fh, '<', $attachment) or warn "Can't open $attachment: $! \n";
$jira->attach_files_to_issue($issue,{$attachment_name=> $attachment_fh});
close $attachment_fh;