企业代理环境下Jenkins执行Jest测试失败,本地执行正常
解决Jenkins执行Puppeteer测试时的企业代理连接问题
看起来你碰到了企业代理环境下,Jenkins与本地执行环境权限/配置不一致的典型问题——本地跑命令完全正常,但Jenkins执行就报net::ERR_TUNNEL_CONNECTION_FAILED,代理验证还返回407。结合你已经禁用防火墙的情况,我整理了几个可能的原因和对应的解决办法:
1. Jenkins服务账户没有代理访问权限
Jenkins默认是以Local System账户作为Windows服务运行的,这个系统账户通常没有权限使用需要域凭据验证的企业代理,也无法读取你在Jenkins里配置的代理凭据。
解决步骤:
- 打开Windows服务管理器(输入
services.msc启动),找到Jenkins服务 - 右键点击「属性」,切换到「登录」标签页
- 选择「此账户」,输入拥有企业代理访问权限的域账户(格式:
domain\username)和对应密码 - 点击「应用」后重启Jenkins服务,再重新运行测试
2. Puppeteer未继承Jenkins的代理配置
Jenkins的全局代理配置是给自身使用的(比如插件更新、拉取代码),但Puppeteer作为独立的Node.js进程,不会自动继承这个配置,需要你在测试代码中手动指定代理参数:
const puppeteer = require('puppeteer'); (async () => { // 替换成你的企业代理信息 const proxyHost = 'your-proxy-domain.com'; const proxyPort = '8080'; // 域账户格式注意用双反斜杠转义,密码有特殊字符需URL编码 const proxyAuth = 'domain\\\\username:your-password'; const browser = await puppeteer.launch({ args: [ `--proxy-server=http://${proxyHost}:${proxyPort}`, `--proxy-auth=${proxyAuth}` ] }); const page = await browser.newPage(); // 可选:设置常见浏览器的User-Agent,避免被代理拦截 await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); try { await page.goto('https://google.com/'); // 你的测试逻辑 } catch (err) { console.error('页面访问失败:', err); } finally { await browser.close(); } })();
3. Jenkins执行环境缺少npm代理配置
虽然你本地的npm配置没问题,但Jenkins运行的环境可能没有设置代理,导致npm在执行测试时无法正常访问外部资源(你的测试已经启动,这点可能性稍低,但可以排查确认):
在Jenkins的构建步骤中先添加以下命令,检查当前npm代理配置:
npm config list
如果没有proxy和https-proxy项,手动添加:
npm config set proxy http://domain\\\\username:password@proxy-host:port npm config set https-proxy http://domain\\\\username:password@proxy-host:port
注意:密码中的特殊字符需要进行URL编码(比如@换成%40,:换成%3A)
4. 企业代理的访问控制限制
有些企业代理会针对特定程序、IP或账户设置白名单,可能Jenkins所在机器的IP,或者Jenkins服务账户不在代理的允许访问列表中:
- 联系公司IT部门,确认Jenkins服务器的IP地址、服务账户是否被加入代理的白名单
- 检查代理是否会拦截Puppeteer的默认User-Agent,尝试在代码中设置常见浏览器的User-Agent(如上面代码示例)
5. 代理环境变量未传递给子进程
Jenkins的全局代理配置不会自动传递给它启动的子进程(比如npm、node),你可以在构建步骤中手动设置环境变量,让子进程继承代理配置:
set HTTP_PROXY=http://domain\\\\username:password@proxy-host:port set HTTPS_PROXY=http://domain\\\\username:password@proxy-host:port set NO_PROXY=localhost,127.0.0.1,your-internal-domains.com cd C:/Testing npm test -- Jenkins
内容的提问来源于stack exchange,提问作者kmeshavkin
相关产品推荐
相关产品推荐

