Jenkins:从json文件中检索一个变量,然后使用它

Jenkins:从json文件中检索一个变量,然后使用它,json,jenkins,Json,Jenkins,我对詹金斯有意见。我发出一个http请求并返回一个json文件,如下所示: httpRequest authentication: 'b689fe3c-117e-4076-b10d-fe16ab14742f', httpMode: 'POST', outputFile: 'merge.json', responseHandle: 'NONE', url:'http://address:port/prweb/api/v1/branches/TestB/merge' { "ID": "SYST

我对詹金斯有意见。我发出一个http请求并返回一个json文件,如下所示:

httpRequest authentication: 'b689fe3c-117e-4076-b10d-fe16ab14742f', httpMode: 'POST', outputFile: 'merge.json', responseHandle: 'NONE', url:'http://address:port/prweb/api/v1/branches/TestB/merge'


{  "ID": "SYSTEM-QUEUE-MERGE 50304628545400035CA951969013040610A435733ECEAE8",
 "pxObjClass": "Pega-API-CI-Branch",
 "statusValue": "OK"
}
我希望在其他http请求中使用该ID:

http://address:port/prweb/api/v1/merges/{$ID}
我试图像这样捕获Id:Id=$(cat merge.json | grep-o SY.*[a-z](所有json文件都是相同的)

我试图在sh管道中捕捉ID,但他不工作,所以我尝试在步骤上定义,与以前一样。如果有人有解决方案,这对我来说将非常好! 我将继续搜索,如果搜索成功,我将进行编辑

编辑:我的管道的代码:

pipeline{
agent any
stages{
    stage ('Merge Branch') {

        steps{

            httpRequest authentication: 'b689fe3c-117e-4076-b10d-fe16ab14742f', httpMode: 'POST', outputFile: 'merge.json', responseHandle: 'NONE', url: 'http://address:port/prweb/api/v1/branches/TestB/merge'

            httpRequest authentication: 'b689fe3c-117e-4076-b10d-fe16ab14742f', httpMode: 'GET', outputFile: 'merge3.json', responseHandle: 'NONE', url: 'http://address:port/prweb/api/v1/merges/'

        }
    }
}

}

那个grep对我不起作用。我相信你可以让它在足够的混乱中工作

如果安装jq,可以执行以下操作:

ID="$(cat merge.json | jq -r .ID)"

# produces SYSTEM-QUEUE-MERGE 50304628545400035CA951969013040610A435733ECEAE8 
# as expected
echo "$ID"
当然,即使您成功地获得shell解析的输出,您仍然需要将结果返回到groovy上下文中,以便使用
httpRequest
。一个热门的解决方案是完全避免
httpRequest
,只对三个请求使用curl。:)这种方法(在构建中使用外部脚本)可能是詹金斯一家倡导的非直觉的做法

如果必须在groovy中保留http请求,下面是一个完整的管道,可以回答您的问题:

pipeline {
  agent { label 'docker' }
  stages {
    stage('build') {
      steps {
        script {
          def idFromJson = sh(script: "cat merge.json | jq -r .ID", returnStdout: true).trim()

          # produces output: idFromJson: SYSTEM-QUEUE-MERGE 50304628545400035CA951969013040610A435733ECEAE8
          echo "idFromJson: ${idFromJson}"
        }
      }
    }
  }
}

我相信最简单的方法是使用jenkins管道的插件:

pipeline{
agent any
stages{
stage ('Merge Branch') {

    steps{

        httpRequest authentication: 'b689fe3c-117e-4076-b10d-fe16ab14742f', httpMode: 'POST', outputFile: 'merge.json', responseHandle: 'NONE', url: 'http://address:port/prweb/api/v1/branches/TestB/merge'
        def jsonResponse = readJSON file: 'merge.json'

        httpRequest authentication: 'b689fe3c-117e-4076-b10d-fe16ab14742f', httpMode: 'GET', outputFile: 'merge3.json', responseHandle: 'NONE', url: "http://address:port/prweb/api/v1/merges/${jsonResponse.ID}"

    }
}
}
您也可以读取响应内容,而不是保存到文件:

pipeline{
agent any
stages{
stage ('Merge Branch') {

    steps{

        def response = httpRequest authentication: 'b689fe3c-117e-4076-b10d-fe16ab14742f', httpMode: 'POST', responseHandle: 'NONE', url: 'http://address:port/prweb/api/v1/branches/TestB/merge'
        def jsonResponse = readJSON text: "${response.content}"

        httpRequest authentication: 'b689fe3c-117e-4076-b10d-fe16ab14742f', httpMode: 'GET', outputFile: 'merge3.json', responseHandle: 'NONE', url: "http://address:port/prweb/api/v1/merges/${jsonResponse.ID}"
    }
}
}

像这样?像什么?还显示代码“Talk is cheep,show me the code”我已经尝试了jq,但它没有起作用。我的系统[]如预期的那样,但我的问题是你之后说了什么。我不知道如何在当前上下文中获得结果。(Curl也不起作用)如果你把所有的卷发放在groovy上下文之外,你根本不需要在groovy上下文中。但是我更新了答案,以展示如果你想走这条路,如何将结果返回到groovy上下文中。