将 gcloud 命令的输出重定向到云构建中的文件

redirect output of gcloud command to a file in cloud build

我正在使用 cloudbuild.yml file

我正在尝试从云构建内部获取构建输出并将其推送到文件。我的步骤是这样的:

- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:slim'
  args: ['gcloud', 'builds', 'log', '$BUILD_ID', '>buildlog.log']
  id: 'fetch-build-log'

这让我出错 ERROR: (gcloud.builds.log) unrecognized arguments: >buildlog.log

如果我在 cloud shell 中执行该命令,它工作正常:gcloud builds log xxxxx-xxxx-xxxx-xxxx-xxxxxxx >guildlog.log

我不确定为什么 cloud build 在将输出重定向到文件时考虑 >buildlog.log 一个参数。

我是不是遗漏了什么或者有其他方法吗?

在 shell 提示符下,当您 运行 命令时:

gcloud builds logs XXXX > buildlog.log

你运行的实际命令是

gcloud builds log XXXX

附加指令 到 shell,您希望将命令的任何输出重定向到本地文件。 gcloud 二进制文件(您实际上是 运行ning 的应用程序)未通过尾随 > buildlog.log,如果是,会给您报告的错误消息。解释文件输出重定向的是 shell。

我认为你想做的只是从你的论点中删除 > buildlog.log

由于您不再传递此参数,下一个问题变为 "Where is the output from the command going?" ... 答案应该是 GCP 云日志记录,您应该能够在其中看到命令的输出。

如果您真的想要创建一个本地输出文件,请考虑使用 Cloud Build entrypoint:

https://cloud.google.com/cloud-build/docs/build-config#entrypoint

并为 bash 指定一个值。这应该启动一个 shell 然后将您的参数传递给 shell 而不是原始的 fork/exec.

最后,您的问题可能是以下变体:

在 Cloud Build 中,每个构建器都有一个默认入口点,这通常与该构建器的目的相关。

在您的示例中,您使用的是 cloud-sdk 默认入口点和位置参数语法,因此每个索引都应该是一个参数。

这就是您收到错误的原因:ERROR: (gcloud.builds.log) unrecognized arguments: >buildlog.log

我整理了一个工作示例,将入口点更改为 /bin/bash:

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:slim'
  entrypoint: '/bin/bash'
  args: ['-c',
         'gcloud builds log $BUILD_ID > buildlog.log']
  id: 'fetch-build-log'
- name: 'alpine'
  id: 'OUTPUT_LOG'
  args: ['sh',
         '-c',
         'cat /workspace/buildlog.log']

在那个例子中,我使用了 -c 命令,如果您想了解原因:

引用自man bash

   -c string If the -c option is present,  then  commands  are  read  from
             string.   If  there  are arguments after the string, they are
             assigned to the positional parameters, starting with [=11=].

让我知道它是否适合你。