web-dev-qa-db-ja.com

Jenkins PipelineでGroovy変数からJSON文字列を作成する

このJSONファイルをGroovyで作成する必要があります。いろいろ試してみました(JsonOutput.toJson()/JsonSlurper.parseText())が失敗しました。

{
   "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
            }
         ]
      }
   ]
}

これは、JenkinsビルドメッセージをSlackに投稿するためのものです。

14
Mr_DeLeTeD

JSON は、人間が読み取れるテキストを使用して、属性と値のペアと配列データ型で構成されるデータオブジェクトを送信する形式です。そのため、一般的にjsonはフォーマットされたテキストです。

Groovyでは、jsonオブジェクトは単なるマップ/配列のシーケンスです。

JsonSlurperClassicを使用したJSONの解析

//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}"
}

パイプラインを使用してJSONを解析する

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

コードからjsonを構築し、ファイルに書き込みます

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)

}
41
daggett

私が何かをしようとしていたときにこの質問を見つけました(私は信じていました)は簡単にするべきですが、他の答えでは対処されませんでした。 JSONを変数内の文字列としてロード済みの場合、ネイティブオブジェクトに変換するにはどうすればよいですか?明らかに、他の答えが示唆するようにnew JsonSlurperClassic().parseText(json)を実行できますが、Jenkinsにはこれを行うネイティブな方法があります:

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

これが誰かを助けることを願っています。

編集:コメントで説明したように、「ネイティブ」はあまり正確ではありません。

17
mrfred

ホワイトリストに登録されたクラス/メソッドを追加できない可能性があるサンドボックスとJenkins Script Securityプラグインを使用したインストールにこだわっている場合、私が見つけた唯一の方法は次のとおりです。

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

これにより、jsonFileファイルから「バージョン」の値が返されます。

def getVersion(jsonFile){

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

  return version

}
0
Nikola Reljin