Beispiel: Redmine Issue erstellen
Im Beispiel wird aus einem KIX-Ticket ein Issue in Redmine erstellt, sobald ein Ticket vom Typ "Incident" mit dem Solution Code "Processing in Redmine" versehen wird.
Die inhaltliche Bearbeitung des Vorgangs erfolgt im Projektmanagement Tool "Redmine".
Als Authentifizierung wird ein zuvor ermittelter Authentifizierungstoken genutzt.
Das Beispiel erstellt ein neues Issue in Redmine mit dem Titel und dem Inhalt des ersten Artikels des auslösenden KIX-Tickets. Auslöser des Jobs ist eine Änderung im Dynamischen Feld Close Code mit Filterung auf den Wert Processing in Redmine
. Die von Redmine erstellte IssueID wird in KIX in einem Dynamischen Feld hinterlegt. Kann kein Issue erstellt werden, wird ein Hinweis hinterlegt.
Redmine-Zugang einrichten und Authentifizierungstoken ermitteln
KIX Dynamisches Feld CloseCode um Wert
Processing in Redmine
erweitern.Dynamisches Feld RedmineIssueID in KIX einrichten und zur Verwendung in der Ticketaktion Bearbeiten bereitstellen.
(s. auch: Ein Dynamisches Feld anlegen und Eine Aktion konfigurieren)
Dynamisches Feld Project in KIX einrichten und zur Verwendung in der Ticketaktion Bearbeiten bereit stellen.
(s. auch: Ein Dynamisches Feld anlegen und Eine Aktion konfigurieren )
Die Job-Konfiguration enthält im Schritt 4 (Aktionen) mehrere Macro Actions, die aufeinander aufbauen:
Get Object Data - Ermitteln der Daten für den Web-Request
XSL Transformation - Aufbereitung des Webrequest-Inhalts
Webhook Extended - Aufruf des Webservice
XSL Transformation - Verarbeitung der Response
Set Dynamic Field - Speichern der Redmine-IssueID
Die Konfiguration im Detail:
Grundkonfiguration:
Job-Typ: Ticket
alle weiteren Job-Parameter (Name, Ausführungsplan, Filter etc.) können individuell definiert werden.
Macro Action 1 - Ermitteln der Daten für den Web-Request
Action: Get Object Data
ObjectData: TicketContentUnprepared
Objekttyp: Ticket
Objekt-ID: <KIX_TICKET_ID>
Includes: DynamicFields, Priority, Articles
Expands: [leer]
Macro Action 2 - Aufbereitung des Webrequest-IInhalts
Action: XSL Transformation
TransformedData: RMRequestPrepared
Data:
${TicketContentUnprepared}
XSL Template:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:KIX="urn:KIX"> <xsl:output method="xml" encoding="utf-8" indent="yes"/> <xsl:template match="RootElement"> <root> <!-- This is the custom part... --> <xsl:variable name="ProjectName" select="DynamicFields[Name = 'Project']/DisplayValue"/> <issue> <!-- translate project name in KIX to Redmine project id --> <project_id> <xsl:choose> <xsl:when test="$ProjectName='Sample Project'">1</xsl:when> <xsl:when test="$ProjectName='Other Project'">2</xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </project_id> <!-- translate KIX priority to Redmine priority --> <priority_id> <xsl:choose> <xsl:when test="Priority='1 very high'">6</xsl:when> <xsl:when test="Priority='2 high'">7</xsl:when> <xsl:when test="Priority='3 normal'">1</xsl:when> <xsl:when test="Priority='4 low'">5</xsl:when> <xsl:when test="Priority='5 very low'">8</xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </priority_id> <!-- compose subject "<TicketTitle> (T#<TicketNumber>)" --> <subject> <xsl:value-of select="Title"/> <xsl:text disable-output-escaping="yes">(T#</xsl:text> <xsl:value-of select="TicketNumber"/>) </subject> <!-- just submit first article and a timestamp--> <description> <xsl:value-of select="Articles[1]/Body"/> <TimeStamp> <xsl:value-of select="KIX:TimeStamp()"/> </description> </issue> <!-- ...EO custom part. --> </root> </xsl:template> </xsl:stylesheet>
Force Array Tags: [leer]
Suppress Empty: Empty Hash
Debug: no
Macro Action 3 - Aufruf des Webservice
Action: Webhook Extended
Response: RMResponse
URL: https://kixredmine.m.redmine.org/issues.json
Method: POST
Use Proxy: [leer]
Proxy: [leer]
Headers:
X-Redmine-API-Key: 9e26cxxxxxxxxxxxxxxxxxxxxxxxxbbc9
Content-Type: application/json
Content:
{ "issue": { "project_id": 1, "priority_id": 2, "subject": "<KIX_TICKET_Title>", "description": "<KIX_FIRST_Body>", "custom_fields": [ { "value": "<KIX_TICKET_DynamicField_Version>", "id": 1 } ] } }
Macro Action 4 - Verarbeitung der Response
Action: XSL Transformation
TransformedData: RMResponsePrepared
Data:
${RMResponse}
XSL Template:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:KIX="urn:KIX"> <xsl:output method="xml" encoding="utf-8" indent="yes"/> <xsl:template match="RootElement"> <root> <xsl:variable name="HTTPCode" select="HTTPCode"/> <xsl:choose> <xsl:when test="$HTTPCode='201'"> <RMIssueID><xsl:value-of select="Result/issue/id"/></RMIssueID> </xsl:when> <xsl:otherwise> <RMIssueID><xsl:text>Not transfered to Redmine.</xsl:text></RMIssueID> </xsl:otherwise> </xsl:choose> </root> </xsl:template> </xsl:stylesheet>
Force Array Tags: [leer]
Suppress Empty: Empty Hash
Debug: no
Macro Action 5 - Speichern der Redmine-IssueID
Action: Set Dynamic Field
Dynamic Field Name: "RedmineIssueID"
Dynamic Field Value:
${RMResponsePrepared.RMIssueID}
Hinweis
Zur Fehleranalyse können Sie den Macro-Action-Parameter Debug
aktivieren.
Folgendes XSL-Template sorgt dafür, dass die eingehenden Parameter direkt, d. h. ohne Transformation, wieder ausgegeben werden:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:KIX="urn:KIX"> <xsl:output method="xml" encoding="utf-8" indent="yes"/> <xsl:template match="/"> <xmp> <xsl:copy-of select="*"/> </xmp> </xsl:template> </xsl:stylesheet>