簡體   English   中英

使用 python 將工件上傳到 artifactory

[英]Upload artifacts to artifactory with python

我正在嘗試將工件上傳到帶有請求的 artfactory 存儲庫,但出現 405 錯誤。 我有一個可以實現這個目標的 bash 腳本,但我真的需要一個 python 實現。

Python

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/"

我首先想到的是你的 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被硬編碼到您生成的每個 URL 中。


除此之外,您的get_md5get_sha1函數可以更簡單地編寫,因為文件對象是可迭代的,例如,

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

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

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

您的迭代器不會在 python3 中停止,因為它們與 '' 比較哨兵,它應該是 b''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM