Jenkins:从json文件中检索一个变量,然后使用它
我对詹金斯有意见。我发出一个http请求并返回一个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
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上下文中。