Analog zum Jira Export API wurde ein Import API konzipiert, um zum Beispiel durch ML-klassifizierten Kategorien wieder in das Jira Servicedesk System importieren zu können und somit die Jira Tickets mit den neuen Kategorien zu aktualisieren. Wie zuvor stellen sich die vom Code abgearbeiteten Schritte wie folgt dar:
Zuerst wurden die Anmeldeinformationen definiert (hier wieder anonymisiert dargestellt),
danach wurden der Projektschlüssel und Pfad festgelegt, auch hier können wieder beliebig viele Projekte eingetragen werden.
Nun wurden die JSON-Dateien im Import Verzeichnis eingelesen und verarbeitet, dazu wurden folgende Verarbeitungsschritte durchgeführt:
- Issue-Key (Ticketnummer) wurde aus dem Dateinamen extrahiert
- JSON-Dateipfad wurde erstellt
- Textinformationen wurden ausgelesen aus der JSON-Datei
- Jira API URL wird definiert (über diesen Aufruf wird das Ticket aktualisiert)
- Die Hilfsfunktionen ConvertTo-Base64 und Get-HttpBasicHeader wurden
wieder definiert, um den Basisauthentifizierungsheader zu erstellen. - Ein API-Aufruf mit der Invoke-RestMethod Funktion wurde ausgeführt, welcher die
PUT-Methode verwendet, um das Ticket in Jira zu aktualisieren.
Code: PowerShell Code Jira Import API
#####################################################################################
# Import Script to pull from JSON into JIRA from #
# TAGGED FILES # #
# Author: Barbara Schön, B.A, Littlemissops.at V 1.082024 #
# Copyright [2024] [Barbara Schön, B.A.] #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); #
# you may not use this file except in compliance with the License. #
# You may obtain a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License #
# #
#####################################################################################
# Jira Credentials definieren
$JIRA_USERNAME = "<InsertJiraUsername>"
$JIRA_PASSWORD = "<InsertJiraPassword>"
# Projekte Definieren und Importpfad - Projekt Key ändern!
$projectkey = "PROJ"
$jsonDirPath = "<InsertPathToTaggedJsonFiles>\$projectkey"
# Alle Dateien aus dem Importpfad einlesen
$jsonFiles = Get-ChildItem -Path $jsonDirPath -Filter "*.json" -File
foreach ($jsonFile in $jsonFiles) {
# Issue Key (Ticketnummer) aus dem Dateinamen extrahieren
$issueKey = $jsonFile.BaseName
# Pfad zur JSON-Datei zusammenbauen
$jsonFilePath = Join-Path $jsonDirPath $jsonFile.Name
# Daten aus der JSON Datei einlesen
$json = Get-Content $jsonFilePath -Raw
# REST API URL definieren
$url = "<InsertJiraBaseURL>/rest/api/2/issue/$issueKey"
#Konvertieren des Users/Passworts and zusammenbauen des Request-Headers
function ConvertTo-Base64($string) {
$bytes = [System.Text.Encoding]::UTF8.GetBytes($string);
$encoded = [System.Convert]::ToBase64String($bytes);
return $encoded;
}
function Get-HttpBasicHeader([string]$JIRA_USERNAME, [string]$JIRA_PASSWORD, $Headers = @{}) {
$b64 = ConvertTo-Base64 "$($JIRA_USERNAME):$($JIRA_PASSWORD)"
$Headers["Authorization"] = "Basic $b64"
$Headers["X-Atlassian-Token"] = "nocheck"
$Headers["Content-Type"] = "application/json; charset=utf-8;"
return $Headers
}
# REST API aufrufen und Jira Issue aktualisieren
$Headers = Get-HttpBasicHeader $JIRA_USERNAME $JIRA_PASSWORD
Invoke-RestMethod -Uri $url -Method Put -Headers $headers -Body $json
# Ausgabe an welchem ticket gerade gearbeitet wird
Write-Host "Currently updating project key: $PROJECTKEY and $issueKey"
}
Ergebnis der Verarbeitung durch die jeweiligen ML-Algorithmen ist eine JSON-Datei pro Jira Issue Nummer, welche in den jeweiligen Unterordner des Projekts im Verzeichnis geschrieben wird. Der Inhalt einer solchen Datei, auf Basis der Input Dateien, wird hier dargestellt. Natürlich müsst ihr die Namen der Felder customfield… anpassen für eure eigene Jira Installation
{
"update": {
"customfield_123456": [{"set": ["Masterdata"]}],
"customfield_123456": [{"set": {"id": "12345", "value": "Low"}}]
}
Im Beispiel wurde durch ML die Kategorie als „Masterdata“ bestimmt. Der Wert „low“ wurde durch einen zweiten Durchlauf der Methode, jedoch mit dem Kategorieset der Priorität erlangt