wake-up-neo.net

Erstellen Sie JSON-Zeichenfolgen aus Groovy-Variablen in Jenkins Pipeline

Ich muss diese JSON-Datei in Groovy erstellen. __ Ich habe viele Dinge (JsonOutput.toJson()/JsonSlurper.parseText()) nicht erfolgreich versucht.

{
   "attachments":[
      {
         "fallback":"New open task [Urgent]: <http://url_to_task|Test out Slack message attachments>",
         "pretext":"New open task [Urgent]: <http://url_to_task|Test out Slack message attachments>",
         "color":"#D00000",
         "fields":[
            {
               "title":"Notes",
               "value":"This is much easier than I thought it would be.",
               "short":false
            }
         ]
      }
   ]
}

Dies ist für das Senden einer Jenkins-Build-Nachricht an Slack.

13
Mr_DeLeTeD

JSON ist ein Format, das zum Übertragen von Datenobjekten, die aus Attribut-Wert-Paaren und Array-Datentypen bestehen, einen von Menschen lesbaren Text verwendet. Im Allgemeinen ist Json ein formatierter Text.

Bei groovigen Json-Objekten handelt es sich lediglich um eine Folge von Karten/Arrays.

Parsing von Json mit JsonSlurperClassic

//use JsonSlurperClassic because it produces HashMap that could be serialized by pipeline
import groovy.json.JsonSlurperClassic

node{
    def json = readFile(file:'message2.json')
    def data = new JsonSlurperClassic().parseText(json)
    echo "color: ${data.attachments[0].color}"
}

Parsing von Json mit Pipeline

node{
    def data = readJSON file:'message2.json'
    echo "color: ${data.attachments[0].color}"
}

Json aus Code erstellen und in Datei schreiben

import groovy.json.JsonOutput
node{
    //to create json declare a sequence of maps/arrays in groovy
    //here is the data according to your sample
    def data = [
        attachments:[
            [
                fallback: "New open task [Urgent]: <http://url_to_task|Test out Slack message attachments>",
                pretext : "New open task [Urgent]: <http://url_to_task|Test out Slack message attachments>",
                color   : "#D00000",
                fields  :[
                    [
                        title: "Notes",
                        value: "This is much easier than I thought it would be.",
                        short: false
                    ]
                ]
            ]
        ]
    ]
    //two alternatives to write

    //native pipeline step:
    writeJSON(file: 'message1.json', json: data)

    //but if writeJSON not supported by your version:
    //convert maps/arrays to json formatted string
    def json = JsonOutput.toJson(data)
    //if you need pretty print (multiline) json
    json = JsonOutput.prettyPrint(json)

    //put string into the file:
    writeFile(file:'message2.json', text: json)

}
29
daggett

Ich habe diese Frage gefunden, als ich versuchte, etwas zu tun (ich glaubte), dass es einfach sein sollte, aber von der anderen Antwort nicht angesprochen wurde. Wenn Sie den JSON-Code bereits als Zeichenfolge in eine Variable geladen haben, wie kann er in ein natives Objekt konvertiert werden? Natürlich könnte man new JsonSlurperClassic().parseText(json) tun, wie die andere Antwort nahelegt, aber es gibt in Jenkins eine native Methode, dies zu tun:

node () {
  def myJson = '{"version":"1.0.0"}';
  def myObject = readJSON text: myJson;
  echo myObject.version;
}

Hoffe das hilft jemandem.

Bearbeiten: Wie in den Kommentaren erläutert, ist "native" nicht ganz genau.

14
mrfred

Wenn Sie bei einer Installation mit Sandboxen und dem Jenkins Script Security-Plugin feststecken und keine Möglichkeit zum Hinzufügen von Klassen/Methoden auf der Whitelist haben, habe ich nur die folgenden Möglichkeiten gefunden:

def slackSendOnRestrictedContext(params) {

    if (params.attachments != null) {
        // Soooo ugly but no other choice with restrictions of Jenkins Script Pipeline Security plugin ^^
        def paramsAsJson = JsonOutput.toJson(params)
        def paramsAsJsonFromReadJson = readJSON text: paramsAsJson
        params.attachments = paramsAsJsonFromReadJson.attachments.toString()
    }

    slackSend (params)
}
0

Dies gibt den Wert der "Version" aus der JsonFile-Datei zurück:

def getVersion(jsonFile){

  def fileContent = readFile "${jsonFile}"
  Map jsonContent = (Map) new JsonSlurper().parseText(fileContent)
  version = jsonContent.get("version")

  return version

}
0
Nikola Reljin