14

現在、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 ライブラリの機能に置き換えるにはどうすればよいでしょうか?

以前に試してみましたが、その問題に関する私の質問からわかるように、ファイルを正常にアップロードする方法がわからなかったため、あきらめなければなりませんでした。

4

6 に答える 6

8

requests ライブラリのみの助けを借りてそれを行うことができます。

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)')
于 2017-03-04T01:14:13.293 に答える
6

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 にログイン -> Web ページの上部からユーザー ID をクリック -> 設定 -> API トークンを表示...

楽しめ。

于 2015-05-21T03:31:00.170 に答える
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()
于 2012-08-09T10:27:39.643 に答える
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 をインストールしていません。

于 2012-04-24T11:34:04.823 に答える
0

私が使用した別の代替手段:

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)

詳細については、以下を参照してください。

于 2016-04-12T05:20:48.130 に答える
0

test_resultこれは、xml文字列であるaknuds1の回答と同様のバージョンです。

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
于 2016-12-07T05:49:35.540 に答える