Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用标准Python库使用文件参数触发经过身份验证的Jenkins作业_Python_Rest_Post_Jenkins_Pycurl - Fatal编程技术网

如何使用标准Python库使用文件参数触发经过身份验证的Jenkins作业

如何使用标准Python库使用文件参数触发经过身份验证的Jenkins作业,python,rest,post,jenkins,pycurl,Python,Rest,Post,Jenkins,Pycurl,我们目前正在PycURL的帮助下从Python脚本触发Jenkins jobs。然而,我们希望摆脱PycURL依赖,但迄今为止几乎没有成功。使我们的场景更加复杂的是,我们需要将一个文件作为参数发布。我们当前发布请求的PycURL逻辑如下所示: url = "https://myjenkins/job/myjob/build" with contextlib.closing(pycurl.Curl()) as curl: curl.setopt(pycurl.URL, url) c

我们目前正在PycURL的帮助下从Python脚本触发Jenkins jobs。然而,我们希望摆脱PycURL依赖,但迄今为止几乎没有成功。使我们的场景更加复杂的是,我们需要将一个文件作为参数发布。我们当前发布请求的PycURL逻辑如下所示:

url = "https://myjenkins/job/myjob/build"
with contextlib.closing(pycurl.Curl()) as curl:
    curl.setopt(pycurl.URL, url)
    curl.setopt(pycurl.USERPWD, "myuser:mypassword")
    curl.setopt(pycurl.SSL_VERIFYPEER, False)
    curl.setopt(pycurl.SSL_VERIFYHOST, False)
    curl.setopt(pycurl.FAILONERROR, True)
    data = [
            ("name", "integration.xml"),
            ("file0", (pycurl.FORM_FILE, "integration.xml")),
            ("json", "{'parameter': [{'name': 'integration.xml', 'file': 'file0'}]}"),
            ("Submit", "Build"),
            ]
    curl.setopt(pycurl.HTTPPOST, data)
    try:
        curl.perform()
    except pycurl.error, err:
        raise JenkinsTriggerError(curl.errstr())
我们如何用标准Python库中的工具替换它


我们以前也尝试过,但不得不放弃,因为我们无法看到如何成功上传文件,您可以从中看到。

可能看起来像这样:

url = "https://myjenkins/job/myjob/build"
req = urllib2.Request(url)

auth = 'Basic ' + base64.urlsafe_b64encode("myuser:mypassword")
req.add_header('Authorization', auth)

with open("integration.xml", "r") as f:
  file0 = f.read()
  data = {
            "name": "integration.xml",
            "file0": file0,
            "json": "{'parameter': [{'name': 'integration.xml', 'file': 'file0'}]}",
            "Submit": "Build"
         }
  req.add_data(urllib.urlencode(data))

urllib2.urlopen(req)

抱歉,我没有安装Jenkins来测试它。

我找到了一个解决方案,使用和库。不完全是标准的,但比PycURL依赖项更轻量级。应该可以通过请求直接执行此操作(避免urllib3部分),但我遇到了一个bug

import urllib3, requests, json

url = "https://myjenkins.com/job/myjob"

params = {"parameter": [
    {"name": "integration.xml", "file": "file0"},
    ]}
with open("integration.xml", "rb") as f:
    file_data = f.read()
data, content_type = urllib3.encode_multipart_formdata([
    ("file0", (f.name, file_data)),
    ("json", json.dumps(params)),
    ("Submit", "Build"),
    ])
resp = requests.post(url, auth=("myuser", "mypassword"), data=data,
        headers={"content-type": content_type}, verify=False)
resp.raise_for_status()

如果您熟悉python,那么可以使用官方网站提供的jenkins REST APT python包装器

通过使用这个python包装器,触发构建非常容易。以下是我的例子:

#!/usr/bin/python
import jenkins

if __name == "main":
    j = jenkins.Jenkins(jenkins_server_url, username="youruserid", password="yourtoken")
    j.build_job(yourjobname,{'param1': 'test value 1', 'param2': 'test value 2'},
                    {'token': "yourtoken"})
对于那些不知道在哪里可以找到代币的人,以下是方法:

登录jenkins->从网页顶部单击您的用户名-> 配置->显示API令牌


享受它。

我使用的另一种选择:

import requests
import json
url = "https://myjenkins/job/myjob/build"
payload = {'key1': 'value1', 'key2': 'value2'}
resp = requests.post(url, params=payload, auth=("username", "password"),verify=False)
json_data = json.loads(resp.text)

有关更多详细信息,请参阅:

这里有一个与aknuds1答案类似的版本,其中
测试结果是xml字符串:

j_string = "{'parameter': [{'name': 'integration_tests.xml', 'file': 'someFileKey0'}]}"
data = {
          "name": "integration_tests.xml",
          "json": j_string, 
        }
for xml_string in tests.values():
    post_form_result = requests.post('http://jenkins/job/deployment_tests/build',
                                     data=data,
                                     files={'someFileKey0': xml_string})
    print(post_form_result.status_code)
猜测一下,额外的参数将作为json字符串数组的一部分传入,或者作为其他文件传入。如果是这种情况,请告诉我,如果我发现了,我将更新此答案。这个解决方案很好地触发了JUnit测试

版本:

master* $ pip show requests                                                                                                                                                                      [21:45:05]
Name: requests
Version: 2.12.3
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.com
License: Apache 2.0
Location: /usr/local/lib/python2.7/site-packages

我们只能在图书馆的帮助下做这件事

import requests

payload = ( ('file0', open("FILE_LOCATION_ON_LOCAL_MACHINE", "rb")), 
            ('json', '{ "parameter": [ { 
                                         "name":"FILE_LOCATION_AS_SET_IN_JENKINS", 
                                         "file":"file0" }]}' ))

resp = requests.post("JENKINS_URL/job/JOB_NAME/build", 
                   auth=('username','password'), 
                   headers={"Jenkins-Crumb":"9e1cf46405223fb634323442a55f4412"}, 
                   files=payload )
如果需要,可使用以下方法获得杰金斯面包屑:

requests.get('http://username:password@JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')

您似乎正在使用
https
。请注意,
httplib
urllib2
在连接到HTTPS网站时不会验证服务器证书(请参阅官方文档),因此无法安全地建立连接。(您可以通过使用
ssl
模块包装
httplib
连接来解决此问题。)如果您查看我的代码,您会发现我告诉cURL忽略HTTPS证书:)这是一个内部网站,所以这不要紧。为什么要在pycURL上使用urllib2/httplib?@dragosrsupercool,因为pycURL是一个我宁愿避免的依赖项。pycURL基于libcurl(纯C代码),它已经证明比urllib和httplib具有更好的性能和稳定性。此外,每台linux机器都附带cURL,而pycURL只是该cURL的一个api代码?我试过了,但它似乎没有生成,似乎没有使用参数进行生成set@Joiya550您应该复制令牌通常的发送方式(即在浏览器中)。@aknuds1使用参数改进了post请求的应答。希望这能解决您的问题。它是否显示了如何发布文件?请看我的问题和答案以供参考。是的,当您打印json_数据时,您可以检索响应文本。试试看。。你会发现输出。我想你不明白我的意思。问题是如何将文件发布到Jenkins,我的答案可以解决这个问题。但是,它不包括文件参数。如果使用API令牌代替用户密码,则不需要Jenkins crump