美文网首页
python-jenkins:调用get_version()提示

python-jenkins:调用get_version()提示

作者: Xpitz | 来源:发表于2018-08-24 18:02 被阅读0次

    欢迎关注我的微信公众号:「阿拉平平」

    报错说明

    首先贴一下自己写的脚本:

    # -*- coding: utf-8 -*-
    import jenkins
    
    
    class JenkinsAPI:
        """
        Installing:
            pip install python-jenkins
    
        Import:
            import jenkins
        """
    
        def __init__(self):
            self.url = 'http://127.0.0.1:8080/'
            self.username = 'admin'
            self.password = 'admin'        
            self.server = self._connect()        
    
        def _connect(self):
            return jenkins.Jenkins(self.url, username=self.username, password=self.password)
     
        def get_version(self):
            """get jenkins version"""
            print(self.server.get_version())
    
    if __name__ == '__main__':
        jenkins_obj = JenkinsAPI()
        jenkins_obj.get_version()
    
    

    执行脚本报错如下:

    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "test.py", line 30, in <module>
        jenkins_obj.get_version()
      File "test.py", line 25, in get_version
        print(self.server.get_version())
      File "/data/temp_venv/lib/python3.6/site-packages/jenkins/__init__.py", line 812, in get_version
        % self.server)
    jenkins.BadHTTPException: Error communicating with server[http://127.0.0.1:8080/]
    

    解决方法

    方法一:修改Jenkins的全局安全设置

    如图所示:勾选 匿名用户具有可读权限 选项即可

    全局安全设置.png

    方法二:在代码中加入一个认证方法

    在_init_()方法中,加上了self.server.get_whoami() 由于该方法能够有认证信息,所以再调用get_verson() 就可以获取到

    def __init__(self):
            self.url = 'http://127.0.0.1:8080/'
            self.username = 'admin'
            self.password = 'admin'        
            self.server = self._connect()
            self.server.get_whoami()        
    

    方法三:修改源码

    源码位置在:site-packages/jenkins/__init__.py,找到get_version方法,代码从

        def get_version(self):
            try:
                request = requests.Request('GET', self._build_url(''))
                request.headers['X-Jenkins'] = '0.0'
                response = self._response_handler(self._request(request))
    
                return response.headers['X-Jenkins']
    
            except (req_exc.HTTPError, BadStatusLine):
                raise BadHTTPException("Error communicating with server[%s]"
                                       % self.server)    
    

    改为:

    def get_version(self):
            try:
                self._maybe_add_auth() # 添加这句即可
                request = requests.Request('GET', self._build_url(''))
                request.headers['X-Jenkins'] = '0.0'
                response = self._response_handler(self._request(request))
    
                return response.headers['X-Jenkins']
    
            except (req_exc.HTTPError, BadStatusLine):
                raise BadHTTPException("Error communicating with server[%s]"
                                       % self.server)    
    

    写在后面

    当时在网上搜索的时候,发现这篇博客也记录了这个问题,这里贴下地址:
    Jenkins: BadHTTPException: Error communicating with server

    之后我查看了一下模块的源码,发现代码有所差异。我本地安装的是1.1.0,而博客中使用的应该是0.4的版本,修改方法并不适用高版本。

    抽空又看了下源码,已补上修改源码的方法。

    相关文章

      网友评论

          本文标题:python-jenkins:调用get_version()提示

          本文链接:https://www.haomeiwen.com/subject/jkhiiftx.html