2014-07-16 26 views
6

我想用請求上傳工件到artfactory repo,但是我得到了405錯誤。我有一個工作bash腳本來實現這個目標,但我真的需要一個python實現。用python上傳工件到artifactory

蟒蛇

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

這是一個生活救星,簡單地說就是使用Python發佈到Artifactory的一個很好的例子! –

回答

2

錯誤405個代表採用錯誤的HTTP方法。 根據the documentation,應該使用PUT完成工件部署。

這意味着您不能使用requests.post,但需要使用requests.put來代替。

5

,在跳出我的第一件事情是,你的bash腳本使用PUT,而你的Python腳本使用POST

我看到的唯一的另一個潛在問題是你構建URL的方式是截然不同的。

在bash腳本創建URL最終被

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

在Python腳本你使用

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

另外,需要注意的是yum-local被硬編碼到這一點很重要您生成的每個網址。


這且不說,你get_md5get_sha1功能可以更簡單地寫,因爲文件對象是可迭代的,例如,

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

實際上一次將按行讀取,而不是固定的塊大小。這在大多數情況下可能不會顯而易見,但可能導致非常大的「塊」被加載,或者導致很多非常小的塊。 –

相關問題