Skip to main content

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.

  1. Redmine-Zugang einrichten und Authentifizierungstoken ermitteln

    Redmine-Example_Prepare1.png
    Redmine-Example_Prepare2.png
  2. KIX Dynamisches Feld CloseCode um Wert Processing in Redmine erweitern.

  3. Dynamisches Feld RedmineIssueID in KIX einrichten und zur Verwendung in der Ticketaktion Bearbeiten bereitstellen.

    (s. auch: Ein Dynamisches Feld anlegen und Eine Aktion konfigurieren)

  4. 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:

  1. Get Object Data - Ermitteln der Daten für den Web-Request

  2. XSL Transformation - Aufbereitung des Webrequest-Inhalts

  3. Webhook Extended - Aufruf des Webservice

  4. XSL Transformation - Verarbeitung der Response

  5. Set Dynamic Field - Speichern der Redmine-IssueID

Die Konfiguration im Detail:

  1. Grundkonfiguration:

    • Job-Typ: Ticket

    • alle weiteren Job-Parameter (Name, Ausführungsplan, Filter etc.) können individuell definiert werden.

  2. 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]

  3. 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

  4. 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
            }
          ]
        }
      }
  5. 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

  6. 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>