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信任库(生产环境推荐)
- 导出目标站点SSL证书:
openssl s_client -connect site:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > site.crt
- 将证书复制到Jenkins容器:
docker cp site.crt <jenkins-container-id>:/tmp/
- 进入容器导入证书(默认密钥库密码
changeit):
docker exec -it <jenkins-container-id> keytool -import -alias site-cert -keystore $JAVA_HOME/jre/lib/security/cacerts -file /tmp/site.crt
- 重启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,确认能否正常获取响应
验证步骤
- 在Active Choice参数配置中选择「Groovy Script」,粘贴调整后的脚本
- 点击「测试脚本」,查看是否返回预期的下拉列表数据
- 保存Job配置,运行Job验证下拉框是否正常填充
内容的提问来源于stack exchange,提问作者jshu
相关产品推荐
相关产品推荐

