2011-12-05 17 views
12

Chúng tôi hiện đang kích hoạt công việc Jenkins từ tập lệnh Python với sự trợ giúp của PycURL. Tuy nhiên, chúng tôi muốn loại bỏ sự phụ thuộc vào PycURL, nhưng đã có rất ít thành công cho đến nay. Điều làm cho kịch bản của chúng ta phức tạp hơn là chúng ta cần phải đăng một tập tin như một tham số. Lôgic PycURL hiện tại của chúng tôi để đăng yêu cầu có dạng như sau:Cách kích hoạt công việc Jenkins đã xác thực với thông số tệp bằng thư viện Python chuẩn

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()) 

Làm cách nào chúng ta có thể thay thế thiết bị này bằng thư viện Python chuẩn?

Chúng tôi đã thử trước đây, nhưng phải từ bỏ vì chúng tôi không thể xem cách tải lên tệp thành công như bạn có thể thấy từ my question on that issue.

+0

Bạn dường như được sử dụng 'https'. Hãy coi chừng rằng 'httplib' và' urllib2' không xác minh chứng chỉ máy chủ khi kết nối với một trang web HTTPS (xem tài liệu chính thức), vì vậy nó sẽ không thể thiết lập kết nối một cách an toàn. (Bạn có thể giải quyết vấn đề này bằng cách gói kết nối 'httplib' bằng mô-đun' ssl'.) – Bruno

+0

Nếu bạn nhìn vào mã của tôi, bạn sẽ thấy rằng tôi đang nói với cURL để bỏ qua chứng chỉ HTTPS :) Đó là một trang mạng nội bộ, vì vậy nó không quan trọng. – aknuds1

+0

Tại sao bạn muốn sử dụng urllib2/httplib trên pycURL? – codersofthedark

Trả lời

6

Tôi đã tìm thấy giải pháp, sử dụng thư viện requestsurllib3. Không hoàn toàn tiêu chuẩn, nhưng nhẹ hơn so với phụ thuộc PycURL. Nó sẽ có thể làm điều này trực tiếp với các yêu cầu (tránh phần urllib3), nhưng tôi chạy vào một lỗi.

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() 
+0

Vì vậy, nếu xây dựng yêu cầu một mã thông báo, nó sẽ được thêm cùng với các tham số? Tôi đã thử nó và nó dường như không xây dựng – AsadSMalik

+0

* dường như không xây dựng với các tham số được thiết lập – AsadSMalik

+0

@ Joiya550 Bạn nên sao chép cách thẻ thông thường được gửi (ví dụ: Trong trình duyệt). – aknuds1

1

Có lẽ nó có thể trông giống như thế này:

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) 

Xin lỗi, tôi không có cài đặt Jenkins xung quanh để kiểm tra nó ra.

+0

Đã kiểm tra nó ngay bây giờ và nó không hoạt động. – aknuds1

5

Nếu bạn đã quen với python, bạn có thể sử dụng trình bao python REST APT jenkins được cung cấp bởi trang web chính thức. see this link.

Kích hoạt xây dựng không thể tin được dễ dàng bằng cách sử dụng trình bao bọc python này. Dưới đây là ví dụ của tôi:

#!/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"}) 

Đối với những người không biết nơi để tìm được dấu hiệu, đây là cách:

đăng nhập để Jenkins -> bấm userid của bạn từ phía trên cùng của trang web - > Định cấu hình -> Hiển thị mã thông báo API ...

Hãy tận hưởng nó.

+1

Tuy nhiên, nó không bao gồm thông số tệp. – aknuds1

-1

Một Alternative mà tôi đã sử dụng:

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) 

Để biết thêm chi tiết bạn có thể tham khảo: Make a Request

+0

Tuy nhiên, không hiển thị cách đăng tệp. – aknuds1

+0

@ aknuds1 Câu trả lời được cải thiện để gửi yêu cầu với thông số. Hy vọng điều này sẽ giải quyết câu hỏi của bạn. –

+0

Ứng dụng có hiển thị cách đăng tệp không? Hãy xem câu hỏi và câu trả lời của tôi để tham khảo. – aknuds1

0

Đây là một phiên bản tương tự như aknuds1 câu trả lời nơi test_result là chuỗi xml:

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) 

Giả sử, các tham số bổ sung sẽ được chuyển thành một phần của chuỗi chuỗi json hoặc các tệp bổ sung, v.v. Hãy cho tôi biết nếu đây là trường hợp, ngoài ra, nếu tôi phát hiện ra, tôi sẽ cập nhật câu trả lời này. Giải pháp này hoạt động tốt để kích hoạt các thử nghiệm JUnit.

Version:

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: [email protected] 
License: Apache 2.0 
Location: /usr/local/lib/python2.7/site-packages 
3

Chúng ta có thể làm điều đó với sự giúp đỡ của chỉ yêu cầu thư viện.

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 nếu cần có thể thu được bằng:

requests.get('http://username:[email protected]_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')