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

akn*_*ds1 12 python rest post pycurl jenkins

我们目前在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())
Run Code Online (Sandbox Code Playgroud)

我们如何用标准Python库中的工具替换它?

我们之前已经尝试过,但由于我们无法看到如何成功上传文件而不得不放弃,您可以从我在该问题上的问题中看到.

akn*_*ds1 6

我找到了一个使用requestsurllib3库的解决方案.不完全标准,但比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()
Run Code Online (Sandbox Code Playgroud)


小智 6

我们只能在请求库的帮助下完成.

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 )
Run Code Online (Sandbox Code Playgroud)

如果需要,可以使用以下方式获得Jekins-Crumb:

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


mai*_*mer 5

如果你熟悉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"})
Run Code Online (Sandbox Code Playgroud)

对于那些不知道在哪里找到令牌的人,以下是:

登录jenkins - >点击网页顶部的用户ID - >配置 - >显示API令牌...

好好享受.

  • 但是,它不包含文件参数。 (2认同)