在 Python 中下载 Azure Devops 工件

Download Azure Devops artifact in Python

我可以在 Python (https://github.com/microsoft/azure-devops-python-api) 中使用 Azure Rest API 来下载 URL 工件,例如

artifacts = build_client.get_artifacts(project_name, build_id)

然后我想用

之类的东西下载它们
for artifact in artifacts:
    urllib.request.urlretrieve(artifact.resource.download_url, artifactDownloadPath + artifact.name)

但是,它下载的不是工件,而是 HTML 页面。同样的 link 在网络浏览器中也能正常工作。

如何像在 YAML 中那样下载工件?

我们有 API 版本 6.0 用于 python Azure DevOps Artifacts 包下载:

下面是API,这个可以用在任何UI

GET https://pkgs.dev.azure.com/{organization}/{project}/_apis/packaging/feeds/{feedId}/pypi/packages/{packageName}/versions/{packageVersion}/{fileName}/content?api-version=6.0-preview.1

您可以从 Azure Docs

查看所有 parameter

在 Windows 中,您可以使用 Powershell 通过滥用注册表 + Microsoft Edge 来执行此操作(我想如果需要,可以从 Python 调用)。

taskkill > $null /im msedge.exe /f /FI "STATUS eq RUNNING" 
Set-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" -Name "{374DE290-123F-4565-9164-39C4925E467B}" -Value "C:\MyDownloadDirectory\"        
start $artifact.resource.downloadUrl

在您的脚本中导入请求并使用 GET 类型的 API:

https://dev.azure.com/{organization}/{project}/_apis/build/builds/{build_id}/artifacts?artifactName={artifactName}&api-version=6.0&%24format=zip

工件名称是您在构建管道的发布构建任务中提供的名称(默认为 drop)

然后检索内容并在本地创建文件。

resp = requests.get(api, auth=("", PAT))
with open(f"{artifact_name}.zip", "wb") as f:
 f.write(resp.content)

然后您将在当前工作目录中获得已发布工件的 zip 文件。