Spring 在 Google Cloud Build 中启动应用程序时出错 - 创建工作版本但报告构建失败

Error with Spring Boot app in Google Cloud Build - Creates working version but reports failed build

我有一个 Java Spring 启动应用程序,它以前构建良好,但我们现在遇到了问题。

我们正在使用 GCP,当我们推送到 GCP 中的某些分支时,云构建功能会自动触发构建。目标是应用程序自行构建,然后部署到应用程序引擎。在多次试验和错误之前的各种迭代中,我们成功地做到了这一点。

应用成功构建和部署。这意味着如果我推送代码,它就会构建并运行。但是云构建工具一直报构建失败

我们的cloudbuild.yaml

steps:
- id: 'Stage app using mvn appengine plugin on mvn cloud build image'   
  name: 'gcr.io/cloud-builders/mvn'
  args: ['package', 'appengine:stage', '-Dapp.stage.appEngineDirectory=src/main/appengine/$_GAE_YAML', '-P cloud-gcp']
  timeout: 1600s
- id: "Deploy to app engine using gcloud image"
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'deploy', 'target/appengine-staging/app.yaml',
         '-q', '$_GAE_PROMOTE', '-v', '$_GAE_VERSION']
  timeout: 1600s
- id: "Splitting Traffic"
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['app', 'services', 'set-traffic', '--splits', '$_GAE_TRAFFIC']
timeout: 3200s

此处供参考 app.yaml

runtime: java
env: flex
runtime_config:
  jdk: openjdk8
env_variables:
  SPRING_PROFILES_ACTIVE: "dev"
handlers:
  - url: /.*
    script: this field is required, but ignored
    secure: always
manual_scaling:
  instances: 1
resources:
  cpu: 2
  memory_gb: 2
  disk_size_gb: 10
  volumes:
    - name: ramdisk1
      volume_type: tmpfs
      size_gb: 0.5

第一步完成得很好,或者看起来是这样。

该应用程序在该特定版本上可用并且运行良好。

这是我们当前面临的“失败”,在第二步失败构建的输出中找到:

--------------------------------------------------------------------------------
Updating service [default] (this may take several minutes)...

ERROR: (gcloud.app.deploy) Error Response: [9] An internal error occurred while processing task /app-engine-flex/flex_await_healthy/flex_await_healthy>2021-11-04T14:55:50.087Z257173.in.0:
There was an error while pulling the application's docker image: the image does
not exist, one of the image layers is missing or the default service account
does not have  permission to pull the image. Please check if the image exists.
Also check if the default service account has the role Storage Object Viewer
(roles/storage.objectViewer) to pull images from Google Container
Registry or Artifact Registry Reader (roles/artifactregistry.reader) to pull
images from Artifact Registry. Refer to https://cloud.google.com/container-registry/docs/access-control
in granting access to pull images from GCR. Refer to https://cloud.google.com/artifact-registry/docs/access-control#roles
in granting access to pull images from Artifact Registry.

我们在构建缓存方面一直存在非常一致的问题,以至于过去我们推送新代码并启动旧版本的代码。我觉得可能都有关系。

我们已尝试为特定版本的应用程序清除整个容器注册表缓存,这就是这个特定问题开始出现的时间。我有一种感觉,它只是构建和启动一个版本的应用程序,然后返回并尝试在其之上启动另一个版本的应用程序。寻找一种至少获得更详细日志记录的方法,但这主要是我被困的地方。

如何调整“名称:'gcr.io/cloud-builders/gcloud'”步骤以正确指示部署有效?这是正确的做法吗?

错误响应代码 9(应用程序启动错误)是一个相当普遍的错误消息,表明已部署的程序由于某种原因无法启动,所以不是 运行 正确(或 VM 认为如此)。根据您的描述,应用程序似乎已部署到虚拟机,但由于应用程序无法启动,虚拟机在一段时间后崩溃了。

有关崩溃原因的更多信息,请查看 Cloud Console 中的服务器日志。

使用 gcloud components update 命令更新 gcloud 组件后,尝试部署您的应用程序。

确保SDK是运行管理员。

如果错误仍然存​​在,请尝试 运行 命令 gcloud app deploy app.yaml —verbosity=debug 以查看是否可以得到更具体的错误。

现在根据错误信息,docker图像似乎有问题,建议检查图像是否存在。我找到 Docker documentation that could help you according to the error message. Following the error, it also mentioned that the service account does not have permissions to pull the image, here is also how to require permissions 文档。

Configuring access control 帮助权限和角色、授予 IAM 权限和配置 public 访问图像的文档。

错误消息末尾推荐的其他 Artifact Registry 文档是 Google Cloud 推荐的容器映像存储和管理解决方案。

Artifact Registry 通过提供支持容器映像和非容器工件的完全托管服务扩展了 Container Registry 的功能。

在这里回答我自己的问题。

事实证明应用程序正在部署但侦听了错误的端口。我们刚刚将 server.port=8080 添加到 application.properties 文件,一切又开始正常了。

我相信 Chanseok Oh 在上面关于我的问题的评论中提到的也是真实的。尽管更改端口似乎是唯一解决此问题的方法。

GCP 正在尝试进行就绪检查,但没有得到任何回复。目前还不清楚为什么这与工件的缓存完全相关,如果有的话。