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

Jenkins Active Choice参数脚本无法执行HTTPS请求及相关操作求助

Jenkins Active Choice插件HTTPS请求失败解决方案

问题背景

本地Docker容器运行Jenkins,已安装Active Choice插件,静态字符串列表可正常生成,但通过HTTPS请求获取JSON数据动态填充下拉框时失败。尝试过三种实现方式:

  • 使用sh执行curl命令
  • 通过Groovy的execute()调用curl
  • 用URL.openConnection()发起请求

其中调用openConnection()直接失败,JsonSlurper实例化也报错。

核心原因及解决步骤

1. 解除脚本安全沙箱限制

Active Choice的Groovy脚本默认在Jenkins安全沙箱中运行,网络访问、JSON解析等操作会被拦截:

  • 进入Jenkins 全局安全配置 → 找到脚本安全模块
  • 在授权脚本中,添加你的Active Choice脚本完整内容(或脚本哈希值),允许其执行
  • 测试环境可临时关闭启用脚本安全沙箱(生产环境不推荐)

2. 处理HTTPS证书信任问题

Docker内Jenkins的Java环境可能不信任目标站点的SSL证书,导致连接失败:

方法一:导入证书到Java信任库(生产环境推荐)

  1. 导出目标站点SSL证书:
openssl s_client -connect site:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > site.crt
  1. 将证书复制到Jenkins容器:
docker cp site.crt <jenkins-container-id>:/tmp/
  1. 进入容器导入证书(默认密钥库密码changeit):
docker exec -it <jenkins-container-id> keytool -import -alias site-cert -keystore $JAVA_HOME/jre/lib/security/cacerts -file /tmp/site.crt
  1. 重启Jenkins容器生效。

方法二:跳过SSL证书验证(仅测试环境用)

在Groovy脚本中添加证书跳过逻辑,再发起请求:

// 全局跳过SSL证书验证
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager

TrustManager[] trustAllCerts = [new X509TrustManager() {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null }
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
}]

SSLContext sc = SSLContext.getInstance("SSL")
sc.init(null, trustAllCerts, new java.security.SecureRandom())
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())

// 发起HTTPS请求
def url = new URL("https://site/api/path")
def conn = url.openConnection() as HttpsURLConnection
conn.setRequestProperty("x-api-key", "data")
conn.setRequestProperty("accept", "application/json")

// 读取响应
def response = new BufferedReader(new InputStreamReader(conn.getInputStream())).text
// 解析JSON(用全限定类名避免import权限问题)
def json = new groovy.json.JsonSlurper().parseText(response)

// 提取下拉框所需列表,示例取每个元素的name字段
return json.collect { it.name }

3. 解决JsonSlurper实例化报错

  • 避免使用import groovy.json.JsonSlurper,直接用全限定类名new groovy.json.JsonSlurper()
  • 在Jenkins脚本安全配置中,添加groovy.json.JsonSlurper类的使用权限

4. 排查curl方法失败问题

  • 检查容器内是否安装curl:docker exec -it <jenkins-container-id> curl --version,未安装则执行apt-get update && apt-get install -y curl(Debian/Ubuntu容器)
  • 测试网络连通性:docker exec -it <jenkins-container-id> curl -H "x-api-key: data" https://site/api/path,确认能否正常获取响应

验证步骤

  1. 在Active Choice参数配置中选择「Groovy Script」,粘贴调整后的脚本
  2. 点击「测试脚本」,查看是否返回预期的下拉列表数据
  3. 保存Job配置,运行Job验证下拉框是否正常填充

内容的提问来源于stack exchange,提问作者jshu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:12:44