2014-07-16 3 views
6

के साथ artifactory के लिए कलाकृतियों अपलोड करें मैं अनुरोध के साथ एक artfactory repo में कलाकृतियों को अपलोड करने की कोशिश कर रहा हूँ, लेकिन मुझे 405 त्रुटियां मिल रही हैं। मेरे पास एक कार्यशील बैश स्क्रिप्ट है जो इस लक्ष्य को प्राप्त करती है, लेकिन मुझे वास्तव में एक अजगर कार्यान्वयन की आवश्यकता है।पायथन

अजगर

import os 
import hashlib 
import requests 
from requests.auth import HTTPBasicAuth 

username = 'me' 
password = 'secrets' 


target_file = '/home/me/app-1.0.0-snapshot.el6.noarch.rpm' 

artifactory_url = 'https://artifactory.company.com/artifactory' 

def get_md5(fin): 
    md5 = hashlib.md5() 
    with open(fin, 'rb') as f: 
     for chunk in iter(lambda: f.read(8192), ''): 
      md5.update(chunk) 
    return md5.hexdigest() 

def get_sha1(fin): 
    sha1 = hashlib.sha1() 
    with open(fin, 'rb') as f: 
     for chunk in iter(lambda: f.read(8192), ''): 
      sha1.update(chunk) 
    return sha1.hexdigest() 


def upload(fin): 
    base_file_name = os.path.basename(fin) 
    md5hash = get_md5(fin) 
    sha1hash = get_sha1(fin) 
    headers = {"X-Checksum-Md5": md5hash, "X-Checksum-Sha1": sha1hash} 
    r = requests.post("{0}/{1}/{2}".format(artifactory_url, "yum-local", base_file_name),auth=(username,password), headers=headers, verify=False, data=open(fin, 'rb')) 
    return r  

बैश

art_url="https://artifactory.company.com/artifactory" 
user="user" 
pass="password" 


function upload { 
    local_file_path=$1 
    target_folder=$2 
    if [ ! -f "$local_file_path" ]; then 
    echo "ERROR: local file $local_file_path does not exists!" 
    exit 1 
    fi 

    which md5sum || exit $? 
    which sha1sum || exit $? 

    md5Value="`md5sum "$local_file_path"`" 
    md5Value="${md5Value:0:32}" 
    sha1Value="`sha1sum "$local_file_path"`" 
    sha1Value="${sha1Value:0:40}" 
    fileName="`basename "$local_file_path"`" 

    echo $md5Value $sha1Value $local_file_path 

    echo "INFO: Uploading $local_file_path to $target_folder/$fileName" 
    curl -i -k -X PUT -u $user:$pass \ 
    -H "X-Checksum-Md5: $md5Value" \ 
    -H "X-Checksum-Sha1: $sha1Value" \ 
    -T "$local_file_path" \ 
    ${art_url}/"$target_folder/$fileName" 
      } 

upload "/projects/app.war" "libs-release-local/com/company/app/app-comp/1.0.0/" 
+0

यह आर्टिफैक्टरी को प्रकाशित करने के लिए पाइथन का उपयोग करने का एक अच्छा उदाहरण है, यह जीवन उद्धारकर्ता है! –

उत्तर

2

त्रुटि गलत HTTP विधि का उपयोग कर के लिए 405 खड़ा है। the documentation के अनुसार, पुट का उपयोग करके आर्टिफैक्ट परिनियोजन किया जाना चाहिए।

इसका मतलब है कि आप requests.post का उपयोग नहीं कर सकते हैं, लेकिन इसके बजाय requests.put का उपयोग करने की आवश्यकता है।

5

पहली बात यह है कि मुझ पर बाहर कूदता है कि आपके बैश स्क्रिप्ट का उपयोग किया जाता है एक PUT हुए अपने अजगर स्क्रिप्ट POST उपयोग कर रहा है।

मुझे दिखाई देने वाली एकमात्र अन्य संभावित समस्या यह है कि आप जिस URL को बना रहे हैं वह मूल रूप से अलग है।

बैश स्क्रिप्ट में यूआरएल आपके द्वारा बनाए गए आप

https://artifactory.company.com/artifactory/yum-local/app-1.0.0-snapshot.el6.noarch.rpm 

भी प्रयोग कर रहे हैं

https://artifactory.company.com/artifactory/libs-release-local/com/company/app/app-comp/1.0.0//app.war 

अजगर स्क्रिप्ट में किया जा रहा समाप्त होता है, यह ध्यान रखें कि yum-local में हार्ड-कोडेड महत्वपूर्ण है आपके द्वारा उत्पन्न हर यूआरएल।


अलग रूप में, अपने get_md5 और get_sha1 कार्यों अधिक बस, लिखा जा सकता है ऐसा इसलिए है क्योंकि फ़ाइल वस्तुओं iterable हैं उदाहरण के लिए,

with open(fin, 'rb') as f: 
    for chunk in f: 
     md5.update(chunk) 
+1

जो वास्तव में निश्चित ब्लॉक आकारों की बजाय एक समय में लाइनों में पढ़ेगा। यह शायद अधिकतर समय में उल्लेखनीय नहीं होगा, लेकिन इसके परिणामस्वरूप या तो बहुत बड़े "भाग" लोड हो रहे हैं, या बहुत छोटे हैं। –