python - Python GitLab - 获取工件导致列表错误
问题描述
我尝试使用适用于 Python 的 GitLab API 从 CI/CD 管道下载构建工件。我查看了文档并编写了以下示例:
import os
import time
import gitlab
import subprocess
gl = gitlab.Gitlab("MyRepo.de", private_token = "A Token")
project = gl.projects.get("MyProject")
pipelines = project.pipelines.list()
# Get the latest job from the latest pipeline
CurrentJob = None
for Pipeline in project.pipelines.list():
if(Pipeline.status == "success"):
for Job in Pipeline.jobs.list():
if(Job.status == "success"):
CurrentJob = Job
break
zipfn = "___artifacts.zip"
with open(zipfn, "wb") as f:
CurrentJob.artifacts(streamed=True, action=f.write)
subprocess.run(["unzip", "-bo", zipfn])
os.unlink(zipfn)
但是程序退出并出现错误'list' object is not callable
,CurrentJob.artifacts(streamed=True, action=f.write)
调试器显示三个不同的文件:
但是该示例使用相同的代码行。访问和下载文件的正确方法是什么?我在文档中找不到任何解决方案。
解决方案
这里的区别是微妙的。usingpipeline.jobs.list
不使用与project.jobs.list
(or .get
)相同的底层 API
就 Python-Gitlab 库而言,当你这样做时,你pipeline.jobs.list()
会得到一个gitlab.v4.objects.ProjectPipelineJob
对象列表。这种类型的对象的.artifacts
属性不是一种方法——它是一个包含有关工件信息的列表,例如文件类型、大小文件名等——这就是您在图像中看到的内容。
gitlab.v4.objects.ProjectJob
这与文档中显示的对象不同。project.jobs.get
您从或获得这种对象project.jobs.list
。
因此,要更正此错误,您可以编辑代码的尾部,如下所示:
job_id = CurrentJob.id
CurrentJob = project.jobs.get(job_id)
zipfn = "___artifacts.zip"
with open(zipfn, "wb") as f:
CurrentJob.artifacts(streamed=True, action=f.write)
subprocess.run(["unzip", "-bo", zipfn])
os.unlink(zipfn)
推荐阅读
- vue.js - 输入字段从另一个组件触发观察者
- javascript - 如何在 jest 中测试 if 条件和 return 语句?
- javascript - 如何模拟/监视来自不同文件的函数调用
- scala - 如何在 self-types 中自动继承 mixin 泛型类型?
- r - 为ggplot准备数据?多变量
- google-cloud-platform - 通过谷歌云部署管理器创建的谷歌数据流
- cloud - 尝试在免费层 (lite) 中配置服务时,我在 IBM 云中遇到以下错误
- vb.net - 标签不显示进度条 % VB.Net
- regex - 如何在正则表达式中使用条件替换**ALL**
- json - VS Code 中 settings.json 中的尾随逗号错误