我们目前正在PycURL的帮助下从Python脚本中触发Jenkins作业。但是,我们希望摆脱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库中的工具替换它?
我们之前尝试过,但由于我们无法看到如何成功上传文件,因此您可以放弃,正如您在my question on that issue中看到的那样。
答案 0 :(得分:6)
我找到了一个使用requests和urllib3库的解决方案。不完全标准,但比PycURL依赖更轻。应该可以直接使用请求(避免使用urllib3部分),但我遇到了一个错误。
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()
答案 1 :(得分:5)
如果你熟悉python,那么你可以使用官方网站提供的jenkins REST APT python包装器。 see this link
使用此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 - >点击网页顶部的用户ID - > 配置 - >显示API令牌...
享受它。
答案 2 :(得分:5)
我们只能在请求库的帮助下完成。
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 )
如果需要,可以使用以下方式获得Jekins-Crumb:
requests.get('http://username:password@JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
答案 3 :(得分:1)
可能看起来像这样:
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来测试它。
答案 4 :(得分:0)
以下是aknuds1答案的类似版本,其中@types
是xml字符串:
test_result
猜测,其他参数将作为json字符串数组或其他文件等的一部分传入。如果是这样的话,请告诉我,如果我发现,我将更新此答案。这个解决方案可以很好地触发JUnit测试。
版本:
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)
答案 5 :(得分:-1)
我使用的另一种选择:
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)
有关详细信息,请参阅:Make a Request