【问题标题】:Cloud Build fails to upload artifactCloud Build 无法上传工件
【发布时间】:2020-02-21 00:58:33
【问题描述】:

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

我的 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

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

【问题讨论】:

标签: google-cloud-build


【解决方案1】:

晚了 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。我没有对此进行过多研究,但可能会提供一个更简单的解决方案。

【讨论】:

    【解决方案2】:

    让它使用 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那么流畅,但至少它完成了工作。

    【讨论】:

      【解决方案3】:

      我想说正确的方法是确定“/output”文件夹中的内容,因此在尝试存储数据之前,您可以尝试在工件前一步列出文件夹。或者也可以使用“find”命令查找输出文件夹。您可以将此doc 用作指导,其中使用“bash”作为入口点执行脚本

      【讨论】:

      • 我都做到了。使用例如ls 正好显示了我期望的 2 个文件。
      • 我会选择 abergmeiner 建议的选项,我将在本周晚些时候对该解决方案进行一些测试并发表评论。 :-)
      猜你喜欢
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 2015-10-10
      相关资源
      最近更新 更多