我们目前正借助pycurl从python脚本触发jenkins作业。不过,我们希望摆脱对派克的依赖,但迄今为止收效甚微。使我们的场景更加复杂的是,我们需要将文件作为参数发布。我们当前发布请求的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库中的工具替换它?
我们曾经尝试过,但不得不放弃,因为我们看不到如何成功上传文件,正如您从my question on that issue中看到的。

最佳答案

我使用requestsurllib3库找到了一个解决方案。不完全是标准的,但比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 - 如何使用标准Python库使用file参数触发经过身份验证的Jenkins作业,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8384143/

10-14 18:17
查看更多