Cloud Build 上传工件失败

Cloud Build fails to upload artifact

我有一个 Cloud Build,在最后一个容器之后,我尝试上传工件。

我的 yaml 结尾为:

- name: eu.gcr.io/foo/bar
  args: ["arg1"]
artifacts:
  objects:
    location: "gs://foo-bar/go/"
    paths: ["/output/*"]

我的期望是,与 CloudBuild 示例类似,它将获取最后一个 Container 的 /output 目录并将其所有文件上传到 foo-bar/go。保留通配符很重要,因为我事先不知道哪些文件将在 /output.

相反,我收到错误消息:

ERROR: could not upload /output/* to gs://foo-bar/go/; err = exit status 1
ERROR
CommandException: 1 file/object could not be transferred.
CommandException: No URLs matched: /output/*
/output/*: Uploading path....
Artifacts will be uploaded to gs://foo-bar using gsutil cp

有人知道如何进行这项工作吗?

我会说正确的方法是确定“/输出”文件夹中的内容,因此在尝试存储数据之前,您可以尝试先列出文件夹,再列出工件。或者也可以使用“查找”命令查找输出文件夹。您可以将此 doc 用作指南,其中使用“bash”

作为入口点执行脚本

通过使用 volume 的显式 gsutil 调用使其工作。 在这一点上,我可以假设文档中的某些示例实际上不起作用。不过,这对我有用:

- name: eu.gcr.io/foo/bar
  args: ["arg1"]
  volumes:
  - name: data
    path: /output
- name: gcr.io/cloud-builders/gsutil
  args: ["cp", "/output/*", "gs://foo-bar/go/"]
  volumes:
  - name: data
    path: /output

不如 artifacts 灵活,但至少它完成了工作。

晚了 2 年,但我找到了这个问题的答案。

我在遇到问题时遇到了这个问题。试图在桶上获取工件导致 No URLs matched

问题是如果没有您创建的卷,输出文件夹将无法保留。默认情况下,Cloud Build 会在步骤之间保留一个文件夹,即 /workspace 文件夹。如果您将 eu.gcr.io/foo/bar 容器设置为输出到 /workspace 文件夹,则以下内容将存储工件。

- name: eu.gcr.io/foo/bar
  args: ["arg1"]
artifacts:
  objects:
    location: "gs://foo-bar/go/"
    paths: ["/output/*"]

在 yaml 中,还有选项 dir 可让您设置工作目录。还有更多信息 here。我没有深入研究这个问题,但可能会提供一个更简单的解决方案。