Python-Jenkins调用报403 Forbidden隧道连接失败问题求助
Python Jenkins API 突然失效的解决方法
问题背景
一直用Python Jenkins API管理Jenkins任务,之前运行正常,现在突然失效。
原代码片段
import jenkins server = jenkins.Jenkins('https://jenkins.company.com', username='xxxx', password='password') server._session.verify = False print(server.jobs_count())
报错信息
File "", line 1, in server.jobs_count() File "E:\anaconda3\Lib\site-packages\jenkins\__init__.py", line 1160, in jobs_count return len(self.get_all_jobs()) File "E:\anaconda3\Lib\site-packages\jenkins\__init__.py", line 1020, in get_all_jobs jobs = [(0, [], self.get_info(query=jobs_query)['jobs'])] File "E:\anaconda3\Lib\site-packages\jenkins\__init__.py", line 769, in get_info requests.Request('GET', self._build_url(url)) File "E:\anaconda3\Lib\site-packages\jenkins\__init__.py", line 557, in jenkins_open return self.jenkins_request(req, add_crumb, resolve_auth).text File "E:\anaconda3\Lib\site-packages\jenkins\__init__.py", line 573, in jenkins_request self.maybe_add_crumb(req) File "E:\anaconda3\Lib\site-packages\jenkins\__init__.py", line 371, in maybe_add_crumb 'GET', self._build_url(CRUMB_URL)), add_crumb=False) File "E:\anaconda3\Lib\site-packages\jenkins\__init__.py", line 557, in jenkins_open return self.jenkins_request(req, add_crumb, resolve_auth).text File "E:\anaconda3\Lib\site-packages\jenkins\__init__.py", line 576, in jenkins_request self._request(req)) File "E:\anaconda3\Lib\site-packages\jenkins\__init__.py", line 550, in _request return self._session.send(r, **_settings) File "E:\anaconda3\Lib\site-packages\requests\sessions.py", line 622, in send r = adapter.send(request, **kwargs) File "E:\anaconda3\Lib\site-packages\requests\adapters.py", line 507, in send raise ProxyError(e, request=request) ProxyError: HTTPSConnectionPool(host='jenkins.company.com', port=443): Max retries exceeded with url: /job/scp/job/sm/job/9218/job/4198/job/SIT/crumbIssuer/api/json (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 403 Forbidden')))
已知情况
- Jenkins服务器无需代理,账号密码可正常登录网页
- 已拥有crumb ID和API Token,但不知道如何在Python-Jenkins API中添加crumb
解决步骤
1. 解决代理问题
报错核心是ProxyError 403,说明本地请求被强制走了系统代理,但Jenkins不需要代理。直接给Jenkins会话禁用代理:
server._session.proxies = {}
2. 改用API Token代替密码
用账号的API Token登录比密码更安全,也能避免密码过期、权限限制等问题,初始化时替换密码参数即可:
server = jenkins.Jenkins('https://jenkins.company.com', username='xxxx', password='你的API_TOKEN')
3. 手动设置Crumb(自动获取失败时)
Python-Jenkins默认会自动获取crumb,但如果自动获取失败,可手动获取并添加到请求头:
crumb = server.get_crumb() server._session.headers.update({'Jenkins-Crumb': crumb['crumb']})
修改后的完整代码
import jenkins # 用API Token初始化连接 server = jenkins.Jenkins('https://jenkins.company.com', username='xxxx', password='你的API_TOKEN') # 禁用SSL验证 server._session.verify = False # 禁用代理 server._session.proxies = {} # 手动设置crumb crumb = server.get_crumb() server._session.headers.update({'Jenkins-Crumb': crumb['crumb']}) # 测试连接 print(server.jobs_count())
内容的提问来源于stack exchange,提问作者Heinz
相关产品推荐
相关产品推荐

