测试和部署应用

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r 包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。

详细了解区域 ID

了解如何在本地运行您的应用,以及如何在 App Engine 上部署和测试应用。

在本地运行

要在部署之前测试应用的功能,请使用您经常使用的开发工具在本地环境中运行应用。

部署应用

使用 gcloud app deploy 命令将您的应用部署到 App Engine。该命令会先使用 Cloud Build 服务自动构建一个容器映像,然后再将该映像部署到 App Engine 柔性环境。这个容器将包含您对运行时映像所做的全部本地修改。

如需以编程方式部署应用,请使用 Admin API

准备工作

在部署应用之前,请做好以下准备:

确保成功部署

如果您启用新版健康检查,但应用未达到正常运行状态,则系统将回滚部署。

在将第一个应用部署到柔性环境时,可能会出现延迟,原因是需要设置虚拟机 (VM) 和其他基础架构。初始设置后,健康检查会确保您的实例运行正常并已准备好接收流量。如果您的应用未在 app.yaml 文件 liveness_check 部分中的 initial_delay_sec 字段所示的指定时间内达到就绪状态,则您的部署将失败并回滚。

您的应用可能需要更长时间才能达到就绪状态。例如,您可能通过下载大型文件或预加载缓存来初始化您的应用。如果您使用的是新版健康检查,则可以通过修改 app.yaml 文件的 readiness_check 部分中的 app_start_timeout_sec 配置设置来延长准备时间。

如果部署失败,请确保 Cloud Build API 已在项目中启用。App Engine 会在您首次部署应用时自动启用此 API,但如果有人停用了 API,则部署将失败。

部署服务

通过部署应用服务的各个版本及其每个配置文件,将应用部署到 App Engine。

如需部署应用的服务,请从服务的 app.yaml 文件所在的目录运行以下命令:

gcloud app deploy

默认情况下,gcloud app deploy 命令仅部署当前目录中的 app.yaml 文件。每次运行此命令时,App Engine 都会为您部署的版本生成一个唯一 ID,将该版本部署到您为 gcloud CLI 配置的 Cloud 项目,并将所有流量路由到新版本。新版本将成为默认版本。

您可以通过指向特定文件、指定版本或添加其他参数来更改 gcloud app deploy 命令的默认行为:

  • 您可以通过分别指向和部署每个文件来部署服务的其他配置文件。例如:

    gcloud app deploy cron.yaml
    gcloud app deploy dispatch.yaml
    gcloud app deploy index.yaml
    
  • 要指定自定义版本 ID,请使用 --version 标志。

  • 要阻止流量自动路由到新版本,请使用 --no-promote 标志。

  • 如需部署到特定 Cloud 项目,请使用 --project 标志。

例如,如需将 app.yaml 定义的服务部署到特定 Cloud 项目,请为该服务分配一个自定义版本 ID,并阻止流量路由到新版本:

gcloud app deploy --project PROJECT_ID --version VERSION_ID --no-promote

如需详细了解此命令,请查看 gcloud app deploy 参考

部署多项服务

您可以使用相同的部署命令来部署或更新应用中包含的多项服务。

要部署多项服务,您必须单独部署每项服务的 app.yaml 文件。例如:

gcloud app deploy service1/app.yaml
gcloud app deploy service2/app.yaml

您可以在一个部署命令中指定多个文件:

gcloud app deploy service1/app.yaml service2/app.yaml

部署多项服务的要求

  • 您必须先将应用的某个版本部署到 default 服务,然后才能创建和部署后续服务。

  • 您必须在每项服务对应的 app.yaml 配置文件中指定服务的 ID。要指定服务 ID,请在每个配置文件中添加 service 元素定义。如果没有在配置文件中添加此元素定义,则该版本默认部署到 default 服务。

忽略文件

您可以使用 .gcloudignore 文件指定在部署服务时不要上传到 Google Cloud 的文件和目录。如果要忽略不需要随部署上传的构建工件和其他文件,该文件非常实用。

如需详细了解 .gcloudignore 文件的语法,请参阅 gcloud 参考文档

手动构建容器以进行部署

如需在 Google Cloud Platform 之外构建容器映像,您必须先将映像上传到容器映像存储区中,然后才能使用 gcloud app deploy 命令将映像部署到 App Engine。

例如,如果您使用 Docker 在本地构建容器映像,可以将这些映像推送到 Google Container Registry,然后在命令的 --image-url 标志中指定映像的网址:

gcloud app deploy --image-url gcr.io/YOUR_PROJECT_ID/YOUR_CONTAINER_IMAGE

使用自动连续部署流水线

您可以使用 Cloud Build 在连续部署流水线中自动执行部署。如需了解详情,请参阅 Cloud Build 文档中的部署工件使用构建触发器自动构建

PHP 版 Docker 基础映像

如果您想从头开始构建 PHP 自定义运行时应用,请使用 Dockerfile 中提供的基础映像:

版本 Docker 命令
PHP 5.6 FROM gcr.io/google-appengine/php56
PHP 7.0 FROM gcr.io/google-appengine/php70
PHP 7.1 FROM gcr.io/google-appengine/php71
PHP 7.2 FROM gcr.io/google-appengine/php72
PHP 7.3 FROM gcr.io/google-appengine/php73

如需查看基础映像的源代码,请访问:https://github.com/GoogleCloudPlatform/php-docker

查看应用

将应用部署到 App Engine 之后,您可以运行以下命令来启动浏览器,然后访问 https://PROJECT_ID.REGION_ID.r.appspot.com 来查看该应用:

gcloud app browse

在 App Engine 上执行测试

在配置新版本以接收流量之前,您可以在 App Engine 上测试新版本。例如,如需测试 default 服务的新版本,请执行以下操作:

  1. 部署新版本并包含 --no-promote 标志:

    gcloud app deploy --no-promote
  2. 转到以下网址以访问新版本:

    https://VERSION_ID-dot-default-dot-PROJECT_ID.REGION_ID.r.appspot.com

    现在,您可以在 App Engine 运行时环境中测试新版本。如需对应用进行调试,您可以在 Google Cloud Console 的日志浏览器中查看其日志。如需了解详情,请参阅写入应用日志

    发送到 https://PROJECT_ID.REGION_ID.r.appspot.com 的请求仍将路由到先前配置为接收流量的版本。

  3. 如需将流量发送到新版本,请使用 Google Cloud 控制台迁移流量:

    管理版本

    选择刚部署的版本,然后点击迁移流量

如需使用相同的流程来测试其他服务的新版本,您可以将网址中的 default 替换要测试的服务的名称:

如需详细了解如何指定目标服务和版本,请参阅请求的路由方式

问题排查

下面是部署应用时您可能遇到的常见错误消息:

PERMISSION_DENIED: Operation not allowed
The "appengine.applications.create" permission is required.
如果 Cloud 项目不包含所需的 App Engine 应用,则 gcloud app deploy 命令在尝试运行 gcloud app create 命令时可能会失败。只有拥有 Owner 角色的帐号才具备创建 App Engine 应用所需的权限。
502 Bad Gateway
如果 app.yaml 配置错误,Cloud 项目无法启动。检查应用日志,了解更详细的错误消息。
[13] An internal error occurred while creating a Cloud Storage bucket.

App Engine 将代表您在应用创建的同一区域中创建默认的 Cloud Storage 多区域存储桶。此存储桶是存储应用内容所必需的。无法创建此存储桶时,在以下情况下会返回此错误:

[13] An internal error occurred.

如果您使用共享 VPC 设置部署具有网络配置的服务,则可能会发生此错误。确保您的 App Engine 柔性环境满足此配置的所有要求。接下来,请确保您的项目中存在为此设置配置的服务帐号,否则,您必须恢复帐号。请注意,共享 VPC 宿主项目中子网的区域必须与创建 App Engine 环境的位置相匹配。

如果在确保 app.yaml 配置有效后此问题仍然存在,请使用 Google Cloud SDK 重新部署您的服务,添加 --verbosity=debug 标志,然后联系 GCP 支持并提供该命令的输出。

IP space of {USER_SUBNETWORK_NAME} is exhausted and needs to be expanded.

如果部署失败并显示此错误消息,则表示为 App Engine 服务配置的网络没有剩余地址可分配给服务的新实例。您可以通过在针对 App Engine 柔性环境服务配置的子网上扩展 VPC 范围来解决此问题。