2014-07-16 23 views
6

Artefaktları artifact isteklerine eklemeye çalışıyorum ama 405 hatası alıyorum. Bu amaca ulaşan bir çalışma bash komut dosyası var, ama gerçekten bir python uygulamasına ihtiyacım var.python ile artefaktlara eser yükleme

piton

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  

bash

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

Bu, sadece Python'u Artifactory'de yayınlamak için iyi bir örnek olarak bir hayat kurtarıcıdır! Sabit blok boyutlarından ziyade bir seferde satırları okuyacak olan –

cevap

2

Hata Yanlış HTTP yöntemine 405 duruyor. the documentation'a göre artefakt dağıtımı PUT kullanılarak yapılmalıdır.

Bu, requests.post kullanamazsınız, ancak bunun yerine requests.put'u kullanmanız gerektiği anlamına gelir.

5

bana atlar ilk şey, bash komut kullandığını bir PUT sizin Python komut POST kullanıyor iken.

Gördüğüm diğer olası sorun, URL'leri oluşturmanın yolunun tamamen farklı olmasıdır. bash komut dosyasında

Oluşturduğunuz URL'si yum-local içine kodlanmış olduğunu unutmamak gerekir, sen

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

Ayrıca kullandığınız piton komut dosyasında

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

olmak biter oluşturduğunuz her URL. dosya nesneleri tekrarlanabilir olduğundan dolayı bir yana, senin get_md5 ve get_sha1 fonksiyonları daha basit, yazılmış olabilir


örneğin

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

. Bu büyük olasılıkla çoğu zaman farkedilmeyecek, ancak çok büyük "parçaların" yüklenmesine veya çok küçük olanlara yol açabilir. –