将 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=].
让我知道它是否适合你。
我正在使用 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=].
让我知道它是否适合你。