如何将运行"gcloud app deploy"时发生的错误捕获到一个变量中(Bash)

3
我将通过bash脚本将我的应用程序部署到GCP。我想要将任何部署错误捕获到一个变量中,并在发生部署错误时执行一些操作。
我的部署命令如下:
gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote &

您可以假设此命令正在使用我传递的变量。我尝试了以下变化:
  1. var=$(...)

    var=$(gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote &)

    echo ******************************
    echo "${var}"
    echo ******************************

  2. var=`...`

    var=`gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote &`

    echo ******************************
    echo $var
    echo ******************************

其他我已经尝试过的 GCP 变体:
  1. --verbosity="warning"

    var=$(gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote --verbosity="warning" &)

  2. --verbosity="error"

    var=$(gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote --verbosity="error" &)

  3. --log-http

    var=$(gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote --log-http &)

  4. --user-output-enabled

    var=$(gcloud app deploy --version $version --project my-app-$environment $micro.yaml --quiet $no_promote --user-output-enabled &)

到目前为止,我尝试的所有方法中,$var 总是返回为空。即使在部署期间出现错误。
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 0 files to Google Cloud Storage                ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
ERROR: (gcloud.app.deploy) ABORTED: Cannot operate on apps/my-app-qa/services/search/versions/1 because an operation is already in progress for apps/my-app-qa/services/search/versions/1 by 3458c670-76bd-42ec-a971-c0ceda7ef34f.
******************************    
    
******************************

有没有办法在通过bash脚本进行部署时检测GCP部署错误?似乎我缺少了一些非常基础的东西,但却无法确定具体是什么。
1个回答

3

更新: 我下面所写的仍然适用,但我错过了主要问题:您尝试在后台运行gcloud工具(通过其命令行末尾的&),这意味着调用会立即返回,在$()结构有机会捕获任何内容之前。

您实际上正在做的是在命令实际有机会输出任何内容之前将命令的输出分配给变量。因此,您基本上有两个选择:

选项1:在前台运行该命令,并在其完成后继续执行脚本。如果命令运行时间很长,并且“后台处理”是有意的,则显然无法正常工作。

选项2:在后台运行命令,将其stderr重定向到文件中(请参见下文),然后积极监视该文件以进行更改(即错误)。这肯定是一个比较复杂的过程,具体的方法取决于您希望脚本执行的确切操作。

翻译后的答案: 我对gcloud工具并不熟悉,但我假设它将错误信息打印到stderr(这是命令行工具的惯例)。$(command)构造捕获stdout,所以你得到的是除了错误之外的所有信息。

要解决这个问题,你需要在gcloud调用中重定向stderr。

var=$(gcloud --options 2>&1)

2>&1 告诉由 $() 构造生成的嵌套 shell 将输出流 #2(即 stderr)重定向(>)到与流 #1(即 stdout)相同的位置(&),从而将其捕获到您的变量中。

由于您可能只想捕获 stderr,还需要摆脱 stdout:

var=$(gcloud --options 2>&1 >/dev/null)

>/dev/null将默认流(= stderr)重定向到虚空。

如果您想同时显示命令输出并捕获其错误,则可以将stderr管道传输到tee(打印输入并将副本保存到文件的工具),然后将捕获的错误文件读入变量:

gcloud --options 2| tee /tmp/my-gcloud-errors
var=$(cat /tmp/my-gcloud-errors)

(由于我正在膝盖上抱着一只猫,用手机打字,所以答案可能会有错误。稍后会进行修正)


1
谢谢,这似乎是正确的方向,但对我也没有用。我尝试了你建议的两个选项,但错误就是不会被打印出来。1. var=$(gcloud --options 2>&1 >/dev/null)var=$(cat /tmp/my-gcloud-errors)``` 此外,我从你的回复中得到了一个提示,并尝试了下面的代码,以便它只返回stderr到一个变量中,但它仍然为空。 ```{ var=$(gcloud --options 3>&2 2>&1 1>&3); } 2>&1``` - abhijeet
1
@abhijeet:我刚刚添加了一个更新 - 我完全错过了最初答案中的主要问题:+) - creinig
完成了。将任务放到后台是为了加快部署速度。我已经部分地让它工作了,错误信息和整个stdout都被捕获了。但这是另一个需要解决的问题。非常感谢!(新账户无法点赞,抱歉!) - abhijeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接