Ruby中使用net/http设置nil代理绕过公司代理对接Jenkins
解决代理环境下Ruby作业跳过代理连接外部Jenkins的问题
我完全理解你的场景:身处公司代理网络中,Docker部署的Dashboard通过Ruby作业对接第三方组件,其中特定作业需要让Dashboard绕过公司代理,直连外部Jenkins服务——而你希望通过将proxy参数设为nil来实现这个需求。
基于Ruby标准库Net::HTTP的实现方案
假设你的代码依赖Ruby标准库Net::HTTP,下面是完整的可运行示例,核心就是显式将proxy参数设为nil来强制跳过代理:
require 'net/http' require 'uri' require 'json' # 如果需要解析Jenkins返回的JSON数据 def fetch_jenkins_system_info(jenkins_api_url) uri = URI.parse(jenkins_api_url) # 关键操作:将proxy参数设为nil,彻底绕过代理直连 http_client = Net::HTTP.new(uri.host, uri.port, nil) # 适配HTTPS场景(大部分Jenkins实例会启用HTTPS) if uri.scheme == 'https' http_client.use_ssl = true # 若Jenkins使用公司内部CA签发的证书,需配置信任路径;测试环境可临时关闭验证(生产环境禁用此操作) # http_client.verify_mode = OpenSSL::SSL::VERIFY_NONE end begin response = http_client.get(uri.path + "?" + uri.query.to_s) # 处理响应:示例为解析Jenkins的系统信息JSON if response.code == '200' jenkins_info = JSON.parse(response.body) puts "Jenkins版本:#{jenkins_info['version']}" return jenkins_info else puts "Jenkins请求失败,状态码:#{response.code}" return nil end rescue => e puts "连接Jenkins出错:#{e.message}" raise end end # 调用示例:替换为你的Jenkins API地址 jenkins_api_endpoint = 'https://your-external-jenkins-domain/api/json?tree=version' fetch_jenkins_system_info(jenkins_api_endpoint)
关键注意事项
- Docker环境的代理变量覆盖:如果你的Docker容器启动时注入了
HTTP_PROXY/HTTPS_PROXY环境变量,Ruby的Net::HTTP默认会自动读取这些变量使用代理。显式设置proxy为nil会直接覆盖这个默认行为,确保请求不走代理。 - HTTPS证书信任问题:如果Jenkins使用自签名证书或公司内部CA签发的证书,需要在Docker容器内配置信任对应的CA证书(将证书文件挂载到容器的
/etc/ssl/certs目录),避免SSL验证失败。 - 第三方HTTP客户端的适配:如果你的Ruby作业使用Faraday这类第三方HTTP库,同样可以通过配置跳过代理:
require 'faraday' conn = Faraday.new(url: 'https://your-external-jenkins-domain') do |faraday| # 禁用代理 faraday.proxy nil faraday.adapter Faraday.default_adapter end response = conn.get('/api/json?tree=version') puts response.body
内容的提问来源于stack exchange,提问作者xFuture
相关产品推荐
相关产品推荐

