You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 06:15:28