Python调用GitLab API下载CI/CD构件时报list对象不可调用错误
问题原因
你调用Pipeline.jobs.list()返回的是轻量化的Job预览对象,该对象的artifacts属性是存储当前任务所有构件元信息的列表,而非官方文档里提到的构件下载方法,所以直接调用会抛出'list' object is not callable异常。
解决方法
需要通过Job ID拉取完整的Job对象后,再调用下载方法即可,同时可以优化原逻辑避免取不到有效Job时的空指针问题,修正后完整代码如下:
import os import gitlab import subprocess gl = gitlab.Gitlab("MyRepo.de", private_token="A Token") project = gl.projects.get("MyProject") current_job = None # 按更新时间倒序遍历流水线,优先取最新的 for pipeline in project.pipelines.list(order_by="updated_at", sort="desc"): if pipeline.status == "success": # 按更新时间倒序遍历任务,优先取最新的成功任务 for job in pipeline.jobs.list(order_by="updated_at", sort="desc"): if job.status == "success": # 拉取完整Job对象,包含构件下载方法 current_job = gl.jobs.get(job.id) break if current_job: break if not current_job: raise Exception("未查询到符合条件的成功构建任务") zipfn = "___artifacts.zip" with open(zipfn, "wb") as f: current_job.artifacts(streamed=True, action=f.write) subprocess.run(["unzip", "-bo", zipfn]) os.unlink(zipfn)
可选:单独下载指定构件文件
如果不需要全量下载构件压缩包,只想获取单个指定文件,可以使用如下方法:
# 示例为下载构件中路径为build/output.apk的文件,保存到本地output.apk with open("output.apk", "wb") as f: current_job.artifacts.get_file("build/output.apk", streamed=True, action=f.write)
内容的提问来源于stack exchange,提问作者Kampi
相关产品推荐
相关产品推荐

