Python GitLab - 获取工件导致列表错误

Posted

技术标签:

【中文标题】Python GitLab - 获取工件导致列表错误【英文标题】:Python GitLab - Getting artifacts result in list error 【发布时间】:2021-12-25 03:20:26 【问题描述】:

我尝试使用适用于 Python 的 GitLab API 从 CI/CD 管道下载构建工件。我看了一下documentation,写了下面的例子:

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)

但程序退出并在CurrentJob.artifacts(streamed=True, action=f.write) 行出现错误'list' object is not callable,并且调试器显示三个不同的文件:

但该示例使用相同的代码行。访问和下载文件的正确方法是什么?我在文档中找不到任何解决方案。

【问题讨论】:

【参考方案1】:

这里的区别很微妙。使用pipeline.jobs.list 不使用与project.jobs.list(或.get)相同的底层API

就 Python-Gitlab 库而言,当您执行 pipeline.jobs.list() 时,您会得到一个 gitlab.v4.objects.ProjectPipelineJob 对象列表。此类对象的.artifacts 属性不是一种方法——它是一个包含有关工件信息的列表,例如文件类型、大小文件名等——这就是您在图像中看到的内容。

这与文档中显示的 gitlab.v4.objects.ProjectJob 对象不同。您从project.jobs.getproject.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)

【讨论】:

以上是关于Python GitLab - 获取工件导致列表错误的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab ci问题将工件传递到带有触发器和需要关键字的下游管道

GitLab 多个运行器,交换工件

从 GitLab 工件存档下载单个文件

Gitlab:构建后如何在后续作业中使用工件

如何删除 Gitlab 自托管中的旧工件?

未找到 Gitlab ci 工件