尝试从docker上运行的jenkins获取版本信息时获取jenkins.BadHTTPException

Nil*_*esh 1 python rest jenkins

我为Jenkins ver安装了docker容器.2.19.1.

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                              NAMES
f03c10935bb3        jenkins             "/bin/tini -- /usr/lo"   29 hours ago        Up 3 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   cocky_colden
Run Code Online (Sandbox Code Playgroud)

安装python-jenkins模块访问jenkins服务器.

我尝试了在docs中给出的第一个代码示例.

import jenkins

server = jenkins.Jenkins('http://localhost:8080', username='admin', password='mytoken')
user = server.get_whoami()
version = server.get_version()
print('Hello %s from Jenkins %s' % (user['fullName'], version))
Run Code Online (Sandbox Code Playgroud)

但它给出了错误.

python /tmp/test.py
Traceback (most recent call last):
  File "/tmp/test.py", line 5, in <module>
    version = server.get_version()
  File "/usr/lib/python2.7/site-packages/jenkins/__init__.py", line 616, in get_version
    % self.server)
jenkins.BadHTTPException: Error communicating with server[http://localhost:8080/]
Run Code Online (Sandbox Code Playgroud)

我查看提到的文档:

从Jenkins vesion 1.426开始,您可以在针对Jenkins实例对用户进行身份验证时指定API令牌而不是您的真实密码.

我使用密码代替token但是得到相同的错误.

我试过了 curl

curl -X POST http://localhost:8080/job/testjob/build \
> --data token=mytoken \
> --data-urlencode json='{"parameter": [{"name":"id", "value":"123"}, {"name":"verbosity", "value":"high"}]}'
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Error 403 No valid crumb was included in the request</title>
</head>
<body><h2>HTTP ERROR 403</h2>
<p>Problem accessing /job/testjob/build. Reason:
<pre>    No valid crumb was included in the request</pre></p><hr><i><small>Powered by Jetty://</small></i><hr/>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我从Name-> Configure - > Show API Token获取令牌...

还有什么我必须从jenkins方面启用访问?意味着,API将获得对此服务器的访问权限?

小智 7

get_version()函数中似乎存在一个小错误.

如果Jenkins服务器设置为启用了安全性,并且如果匿名用户没有"整体读取"权限,那么您需要将授权密钥传递给urlopen()

即在文件' jenkins/__ init__.py '中,需要更改get_version()函数:

def get_version(self):
    try:
        request = Request(self._build_url(''))
        request.add_header('X-Jenkins', '0.0')
        response = urlopen(request, timeout=self.timeout)
Run Code Online (Sandbox Code Playgroud)

至:

def get_version(self):
    try:
        request = Request(self._build_url(''))
        if self.auth:
            request.add_header('Authorization', self.auth)
        request.add_header('X-Jenkins', '0.0')
        response = urlopen(request, timeout=self.timeout)
Run Code Online (Sandbox Code Playgroud)

要查找此模块在系统中的位置,请运行python并输入:

import jenkins
jenkins.__file__
Run Code Online (Sandbox Code Playgroud)

(我已经向模块作者报告了这个错误)