测试和部署应用

区域 ID

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

详细了解区域 ID

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

在本地运行

如需在部署之前测试应用的功能,请用您经常使用的开发工具在本地环境中运行应用。我们建议您使用标准 Python 工具,例如,使用 virtualenv 创建隔离环境,使用 pytest 运行单元测试和集成测试,而不要依赖随 Google Cloud SDK 一起提供的本地开发服务器 dev_appserver

例如,您通常可以使用以下命令在 Flask 的开发服务器上运行 Flask 应用:

python main.py

您可以使用以下命令启动 Django 应用:

python manage.py runserver

如需模拟 App Engine 生产环境,您可以在本地运行完整的 Web 服务器网关接口 (WSGI) 服务器。为此,请使用 app.yaml 中指定为入口点的同一命令,例如:

gunicorn -b :$PORT main:app

部署应用的准备工作

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

部署应用

使用 gcloud app deploy 命令可以将您的应用部署到 App Engine。

在部署期间,Cloud Build 服务会为您的应用构建一个容器映像,用于在 App Engine 标准环境中运行。这些构建是在应用的区域中创建的。如需了解详情,请参阅管理构建映像

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

部署服务

如需将应用部署到 App Engine,您需要部署各个版本的应用服务及其所有配置文件。

要部署应用服务的某个版本,请从服务的 app.yaml 文件所在的目录运行以下命令:

gcloud app deploy

如果使用该命令时不指定文件,则仅部署当前目录中的 app.yaml 文件。默认情况下,deploy 命令会为您所部署的版本生成一个唯一 ID,将该版本部署到 Google Cloud 项目(您已将 Google Cloud CLI 配置为使用该项目),并将所有流量路由到新版本。

通过指定目标文件或添加其他参数,您可以更改此命令的默认行为:

  • 如需部署服务的其他配置文件,您必须单独定位并部署每个文件。例如:
    gcloud app deploy cron.yaml
    gcloud app deploy dispatch.yaml
    gcloud app deploy index.yaml
    
  • 要指定自定义版本 ID,请使用 --version 标志。
  • 如需阻止流量自动路由到新版本,请使用 --no-promote 标志。
  • 如需部署到特定 Google Cloud 项目,请使用 --project 标志。

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

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

如需详细了解此命令,请参阅 gcloud app deploy 参考文档

部署多项服务

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

如需部署多项服务,请单独部署每项服务的 app.yaml 文件。您可以在一个 gcloud app deploy 命令中指定多个文件:

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

部署多项服务的要求

  • 您必须先将应用的某个版本部署到 default 服务,然后才能创建和部署后续服务。
  • 您必须在每项服务对应的 app.yaml 配置文件中指定服务的 ID。如需指定服务 ID,请在每个配置文件中添加 service 元素定义。如果没有在配置文件中添加此元素定义,则该版本默认部署到 default 服务。

查看构建日志

Cloud Build 会流式传输构建日志和部署日志,您可以在 Google Cloud 控制台的 Cloud Build 历史记录部分查看这些日志。要查看应用所在区域中的构建,请使用页面顶部的区域下拉菜单选择要作为过滤条件的区域。

忽略文件

您可以使用 .gcloudignore 文件指定在部署服务时不会上传到 App Engine 的文件和目录。如果要忽略构建工件和其他无需随部署上传的文件,这种做法会非常实用。

管理构建映像

您每次部署新版本时,系统都会使用 Cloud Build 服务创建一个容器映像。该容器映像是在应用的区域中构建的,然后在 App Engine 标准环境中运行。

构建的容器映像存储在 Container Registryapp-engine-tmp/app 文件夹中。您可以下载这些映像,以便在其他位置存储或运行。部署完成后,App Engine 便不再需要容器映像。请注意,容器映像不会自动删除,因此为了避免达到存储空间配额,您可以安全地删除不再需要的任何映像。如需详细了解如何在 Container Registry 中管理映像,请参阅 Container Registry 文档

查看应用

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

gcloud app browse

在迁移流量之前在 App Engine 上进行测试

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

  1. 部署新版本,但阻止流量自动路由到新版本:

    gcloud app deploy --no-promote

  2. 转到以下网址以访问新版本:

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

    现在,您可以在 App Engine 运行时环境中测试新版本。您可以通过查看应用日志来调试应用。如需了解详情,请参阅写入应用日志

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

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

    管理版本

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

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

https://VERSION-dot-SERVICE-dot-PROJECT_ID.REGION_ID.r.appspot.com

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

使用构建环境变量

您还可以为支持 buildpack 的运行时设置构建环境变量。

构建环境变量是与应用一起部署的键值对,让您可将配置信息传递给 buildpack。例如,您可能需要自定义编译器选项。您可以通过在 app.yaml 文件中配置 build_env_variables 字段来添加或移除这些构建环境变量。

使用本地开发服务器

Google Cloud CLI 包含一个名为 dev_appserver 的本地开发服务器,您可以在本地运行该服务器以模拟在正式版 App Engine 中运行的应用。此开发服务器会模拟应用的一部分运行环境,允许您测试为任何标准环境运行时编写的应用。

运行本地开发服务器

为您的应用创建 app.yaml 配置文件后,您可使用 dev_appserver.py 命令启动本地开发服务器以在本地运行该应用。

  1. 如需获取用户帐号的访问凭据,请运行以下命令:

    gcloud auth login
    
  2. 允许本地应用临时使用您的用户凭据进行 API 访问:

    gcloud auth application-default login
    
  3. 如需启动本地开发服务器,请执行以下操作:

    从项目目录的根目录运行 dev_appserver.py 命令。如果 Python 2 不是您系统上的默认解释器,则您需要运行 python2 dev_appserver.py 以确保使用 Python 2 解释器。

    指定项目 ID 和 app.yaml 文件的路径:

    dev_appserver.py --application=PROJECT_ID app.yaml

    如需更改端口,请添加 --port 选项:

    dev_appserver.py --application=PROJECT_ID app.yaml --port=9999

    如需测试 Python 3 应用、使用 Python 3 解释器运行 dev_appserver.py,您必须在 --runtime_python_path 标志中指定 Python 3 二进制文件。例如:

    dev_appserver.py --runtime_python_path=/usr/bin/python3 --application=PROJECT_ID app.yaml --port=9999

    如需详细了解 dev_appserver.py 命令选项,请参阅本地开发服务器选项

  4. 本地开发服务器在启动时会设置一个开发环境,此开发环境中预先安装了在 requirements.txt 文件中找到的依赖项。

  5. 本地开发服务器现已运行并侦听请求。您可以在网络浏览器中访问 http://localhost:8080/ 来查看应用的运行情况。

    如果您使用 --port 选项指定了自定义端口,请记得在浏览器中指向该端口。

  6. 如需通过命令行停止本地服务器,请按键盘上的 Control-C

检测应用运行时环境

为了确定您的代码是在生产环境中运行还是在本地开发服务器中运行,您可以检查 GAE_ENV 环境变量:

if os.getenv('GAE_ENV', '').startswith('standard'):
  # Production in the standard environment
else:
  # Local execution.

搭配使用本地开发服务器与 Google Cloud 服务

您可以将 dev_appserver 与其他 Google Cloud 组件集成。

Cloud 客户端库

许多 Google Cloud 客户端库都依赖于 GOOGLE_CLOUD_PROJECT 环境变量的存在,该变量应为您的 Cloud 项目 ID。您可以通过运行 gcloud config list project 命令或查看 Google Cloud Console 中的项目页面来找到此变量的值。

为了确保在本地开发期间正确设置此环境变量,请使用 --application=PROJECT_ID 参数初始化 dev_appserver,如上述示例所示。

云模拟器

您可以使用适用于 Cloud DatastoreCloud BigtableCloud Pub/Sub 的模拟器测试您的应用。

自动重新加载 requirements.txtapp.yaml 更改

本地开发服务器会自动安装 requirements.txt 文件中找到的依赖项。dev_appserver 还允许您测试通过 app.yaml 配置的功能。例如,您可以测试应用传送静态文件的能力。在 dev_appserver 运行时,如果 requirements.txtapp.yaml 发生任何更改,应用均会自动重启以反映这些更改。由于系统会下载和安装依赖项,因此可能导致暂时性的延迟。

开发服务器中的实例管理和路由

发现实例地址

本地开发服务器会在启动时创建所有手动扩缩实例。自动扩缩服务和基本扩缩服务的实例采用动态方式进行管理。该服务器会为每项服务分配一个端口,并且客户端可以依赖该服务器来平衡负载并自动选择实例。服务器的日志消息流中会显示用于寻址每项服务的端口分配。

以下是定义三项服务的应用的端口:

INFO Starting module "default" running at: http://localhost:8084
INFO Starting module "service1" running at: http://localhost:8082
INFO Starting module "service2" running at: http://localhost:8083

当您使用某项服务的地址(例如 http://localhost:8082/)时,服务器会创建或选择该服务的实例,并向该实例发送请求。

服务器会为每个服务实例分配唯一的端口。您可以使用管理服务器来发现这些端口。管理服务器具有唯一端口,该端口显示在消息日志中:

INFO Starting admin server at: http://localhost:8000

此地址会将您定向到管理服务器控制台。点击实例可以查看应用实例的动态状态

每个手动实例和基本实例均会显示一个单独的条目。实例编号是一些链接,其中包含每个实例的唯一端口地址。点击链接可直接向对应实例发送请求。

调度文件

如果您的应用包含 dispatch.yaml 文件,那么日志消息流会包含一个调度程序端口:

INFO Starting dispatcher running at: http://localhost:8080

对此端口的请求将根据调度文件中的规则进行路由。服务器支持包含主机名的 dispatch.yaml 文件规则(例如 url: "customer1.myapp.com/*")。采用相对路径格式 (url: "*/fun") 的规则确实有效,因此您可以使用类似 http://localhost/fun/mobile 的网址访问实例。如果您尝试启动的应用包含 dispatch.yaml 文件且该文件含有基于主机的规则,则服务器会在日志流中报告错误。