我们目前正借助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中看到的。
最佳答案
我使用requests和urllib3库找到了一个解决方案。不完全是标准的,但比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/