如何在Groovy脚本中从库函数提取指定键值对
解决方案
要实现捕获JIRA创建接口的输出并提取id和key字段,需要修改你的库函数和流水线调用逻辑,关键步骤如下:
1. 修改库函数:捕获输出并解析JSON
核心调整点:
- 让
sh步骤返回命令输出 - 清理curl命令避免响应头干扰JSON解析
- 解析输出为JSON对象并提取目标字段
修改后的库函数代码:
def call(Map config=[:]) { def rawBody = libraryResource 'com/org/api/jira/createIssue.json' def binding = [ key: config.key, summary: config.summary, description: config.description, issuetype: config.issuetype ] def render = renderTemplate(rawBody, binding) // 调整curl命令:去掉-D-(避免输出响应头),用三重引号处理命令避免转义问题 def curlCmd = """curl -u \$JIRA_CREDENTIALS -X POST --data '${render}' -H "Content-Type: application/json" \$JIRA_URL/rest/api/2/issue""" // 执行命令并捕获标准输出,trim()去除首尾空白 def responseOutput = sh(script: curlCmd, returnStdout: true).trim() // 用Jenkins内置步骤解析JSON字符串 def issueData = readJSON(text: responseOutput) // 返回仅包含需要字段的Map return [id: issueData.id, key: issueData.key] }
如果需要保留响应头输出(比如调试用),可以将响应头重定向到错误流,不影响JSON解析:
// 把响应头输出到stderr,标准输出只保留响应体 def curlCmd = """curl -D /dev/stderr -u \$JIRA_CREDENTIALS -X POST --data '${render}' -H "Content-Type: application/json" \$JIRA_URL/rest/api/2/issue"""
2. 修改流水线:接收返回值并使用
声明式流水线中需要用script块包裹变量赋值逻辑,示例如下:
@Library("jenkins2jira") _ pipeline { agent any stages { stage('create issue') { steps { script { // 调用函数并接收返回的结果 def jiraIssue = jiraCreateIssue( key: "MyKEY", summary: "New JIRA Created from Jenkins", description: "New JIRA body from Jenkins", issuetype: "Task" ) // 打印提取的字段 echo "Created JIRA ID: ${jiraIssue.id}" echo "Created JIRA Key: ${jiraIssue.key}" } } } } }
关键说明
sh(returnStdout: true):默认sh步骤不返回命令输出,添加该参数后会将命令的标准输出以字符串形式返回readJSON:Jenkins内置步骤,安全地将JSON字符串解析为Groovy对象,方便直接提取字段script块:声明式流水线的steps中只能执行流水线步骤,变量赋值等Groovy逻辑需要放在script块内
内容的提问来源于stack exchange,提问作者Rio
相关产品推荐
相关产品推荐

