部署到 Google App Engine 柔性环境时出现 gcloud 错误

时间:2021-01-06 15:59:50

标签: node.js google-app-engine websocket app-engine-flexible app.yaml

最近,我需要向当前托管在 Google App Engine (GAE) 标准环境中的后端应用程序添加网络套接字。由于 Web 套接字是仅在 GAE 的灵活环境中可用的功能,因此我一直在尝试重新部署,但收效甚微。

为了改变一个灵活的环境,我已经更新了 app.yaml 文件

runtime: nodejs10
env: standard

runtime: nodejs
env: flex

以前在标准环境中工作时,现在使用 env: flex 运行命令 gcloud app deploy --app-yaml=app-staging.yaml --verbosity=debug 时,我得到以下堆栈跟踪:

Do you want to continue (Y/n)?  Y

DEBUG: No bucket specified, retrieving default bucket.
DEBUG: Using bucket [gs://staging.finnsalud.appspot.com].
DEBUG: Service [appengineflex.googleapis.com] is already enabled for project [finnsalud]
Beginning deployment of service [finnsalud-staging]...
INFO: Using ignore file at [~/checkouts/twilio/backend/.gcloudignore].
DEBUG: not expecting type '<class 'NoneType'>'
Traceback (most recent call last):
  File "/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", line 982, in Execute
    resources = calliope_command.Run(cli=self, args=args)
  File "/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", line 809, in Run
    resources = command_instance.Run(args)
  File "/google-cloud-sdk/lib/surface/app/deploy.py", line 115, in Run
    return deploy_util.RunDeploy(
  File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 669, in RunDeploy
    deployer.Deploy(
  File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 428, in Deploy
    source_files = source_files_util.GetSourceFiles(
  File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/source_files_util.py", line 184, in GetSourceFiles
    return list(it)
  File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/util/gcloudignore.py", line 233, in GetIncludedFiles
    six.ensure_str(upload_directory), followlinks=True):
  File "//google-cloud-sdk/lib/third_party/six/__init__.py", line 884, in ensure_str
    raise TypeError("not expecting type '%s'" % type(s))
TypeError: not expecting type '<class 'NoneType'>'
ERROR: gcloud crashed (TypeError): not expecting type '<class 'NoneType'>'

在此堆栈跟踪中,它提到了 google-cloud-sdk/lib/googlecloudsdk/command_lib/util/gcloudignore.py 中的错误,因此我还查看了我的 .gcloudignore 文件,但找不到任何不合适的地方:

.gcloudignore
.git
.gitignore
node_modules/

为了解决这个错误,我尝试删除我的 .gcloudignore 文件,这导致了不同的错误,但仍然失败:

Do you want to continue (Y/n)?  Y

DEBUG: No bucket specified, retrieving default bucket.
DEBUG: Using bucket [gs://staging.finnsalud.appspot.com].
DEBUG: Service [appengineflex.googleapis.com] is already enabled for project [finnsalud]
Beginning deployment of service [finnsalud-staging]...
DEBUG: expected str, bytes or os.PathLike object, not NoneType
Traceback (most recent call last):
  File "/google-cloud-sdk/lib/googlecloudsdk/calliope/cli.py", line 982, in Execute
    resources = calliope_command.Run(cli=self, args=args)
  File "/google-cloud-sdk/lib/googlecloudsdk/calliope/backend.py", line 809, in Run
    resources = command_instance.Run(args)
  File "/google-cloud-sdk/lib/surface/app/deploy.py", line 115, in Run
    return deploy_util.RunDeploy(
  File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 669, in RunDeploy
    deployer.Deploy(
  File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/deploy_util.py", line 428, in Deploy
    source_files = source_files_util.GetSourceFiles(
  File "/google-cloud-sdk/lib/googlecloudsdk/command_lib/app/source_files_util.py", line 184, in GetSourceFiles
    return list(it)
  File "/google-cloud-sdk/lib/googlecloudsdk/api_lib/app/util.py", line 165, in FileIterator
    entries = set(os.listdir(os.path.join(base, current_dir)))
  File "/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/lib/python3.8/posixpath.py", line 76, in join
    a = os.fspath(a)
TypeError: expected str, bytes or os.PathLike object, not NoneType
ERROR: gcloud crashed (TypeError): expected str, bytes or os.PathLike object, not NoneType

认为这可能是与我的 CLI 版本有关的错误,我还运行了以下命令来尝试更新:

gcloud app update
gcloud components update

不幸的是,这并没有改变输出。

我注意到,当我在 app.yaml env 值设置为 flexible 的情况下运行此命令时,谷歌云上的日志记录部分没有更新,上传到的文件也没有更改项目的存储桶。对我来说,这表明在与谷歌云服务进行任何通信之前,CLI 中发生了崩溃。如果这是正确的,那么错误的原因似乎不太可能与谷歌云上的错误配置有关,而且必须与我本地机器上的某些东西(软件或配置)有关。

我还尝试在灵活环境“Getting Started”页面上使用“Hello World”app.yaml 配置来排除我自己的应用程序 app.yaml 的配置错误,但这也没有改变输出。

最后,如果我在任何时候将 env: flex 改回 env: standard,那么问题就会消失。不幸的是,如上所述,这不适用于部署我的网络套接字功能。

这让我想到错误可能是由于 gcloud cli 应用程序的错误造成的。但是,如果是这种情况,我本希望看到其他也在使用 GAE 灵活环境的其他人针对此问题提交的更多错误报告。

无论如何,鉴于此堆栈跟踪指向 gcloud cli 中的代码,我已使用谷歌打开了一个错误票证,可在此处找到:https://issuetracker.google.com/issues/176839574

我也看过这个类似的 SO 帖子,但这不是我遇到的确切错误并且仍未解决:gcloud app deploy fails with flexible environment

如果有人对尝试的其他步骤或解决此问题的方法有任何想法,如果您在此帖子上留言,我将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

我使用 Quickstart for Node.js in the standard environment

部署了一个 nodejs 应用程序

然后我将 app.yaml 文件从:

runtime: nodejs10

runtime: nodejs
env: flex

一切都按预期进行。

这可能与您的特定用例有关。

答案 1 :(得分:0)

令人惊讶的是,这个问题似乎与 gcloud cli 中的错误有关。不过,似乎确实有一种解决方法。

当为部署到 flex 环境指定了 --appyaml 标志时,CLI 会崩溃,并显示我上面问题中概述的消息。但是,如果您将 .yaml 文件重命名为 app.yaml(默认值)并在部署时删除此 --appyaml 标志,则构建将继续进行而不会出错。

如果您也遇到过此错误,请关注 google issue,因为我正在与 google 工程师合作,以确保他们重现并最终修复此错误。