如何在多个开发环境中使用 GAE 的 dispatch.yaml?

How to use GAE's dispatch.yaml with multiple development environments?

我正在尝试了解 Google App Engine 的 dispatch.yaml 文件。

我们有一个带有前端和后端的普通 Web 应用程序。我们还有开发和生产环境。两种环境在 GAE 上都有两项服务 - frontenddefault,这是后端。

我们有一个带有前端和后端的普通 Web 应用程序。我们还有开发和生产环境。我们在 GAE 上有两个服务——前端和默认,这是后端。我们在 GAE 上有两个项目——staging,这是我们的开发环境,production,这是我们的生产环境。暂存环境是从我们的前端和后端的开发分支构建的。生产环境由我们的前端和后端的 master 构建。

我们想为暂存和生产环境使用自定义路由。

我曾尝试使用 dispatch_staging.yamldispatch_prod.yaml 来区分文件,但 GAE 无法识别这些文件名。我想我们可以重命名前端服务,但看起来没有办法绕过 default.

如何使用dispatch.yaml指定正在搭建的环境?

我解决这个问题的方法是为应用程序代码使用不同的 repo 分支。

  • master分支版本部署到my_app-dev-开发环境app
  • production分支版本部署到my_app-生产环境app

这样文件总是命名为 dispatch.yaml。服务名称不会在环境之间发生变化,但与它们关联的自定义域名会发生变化 - 这反映在 2 个分支的 dispatch.yaml 文件的内容中:

$ git diff production master -- dispatch.yaml
diff --git a/dispatch.yaml b/dispatch.yaml
index 0768a6a..c1326cf 100644
--- a/dispatch.yaml
+++ b/dispatch.yaml
@@ -1,14 +1,14 @@
-application: my_app
+application: my_app-dev
 dispatch:
-  - url: "service1.my_app.com/*"
+  - url: "service1-dev.my_app.com/*"
     module: service1
-  - url: "service1-dot-my_app.appspot.com/*"
+  - url: "service1-dot-my_app-dev.appspot.com/*"
     module: service1
   - url: "*/service1/*"
     module: service1
-  - url: "service2.my_app.com/*"
+  - url: "service2-dev.my_app.com/*"
     module: service2
-  - url: "service2-dot-my_app.appspot.com/*"
+  - url: "service2-dot-my_app-dev.appspot.com/*"
     module: service2

注意: 我在应用程序级别(与服务级别相反,请参阅 )实现不同的环境。服务级实现不能使用这种方法。

我知道这是一个老问题,但我刚刚发现了一些有趣的东西,可以帮助每个想要部署到不同环境的人。 经过大量的反复试验,我发现 gcloud 需要调用作为参数给出的调度文件 dispatch.yaml。如果您将其命名为任何其他名称,例如 dispatch-staging.yamldev-dispatch.yaml,它将不起作用。 但是,这是我发现的技巧,该文件不必位于项目的根文件夹中。 所以,在我们的项目中我这样做了:

  1. <project_root>/dispatch.yaml - 用于生产
  2. <project_root>/deploy-staging/dispatch.yaml - 用于分期

现在我可以 cd <project_root> 然后:

  1. gcloud --project <production> app deploy ./dispatch.yaml
  2. gcloud --project <staging> app deploy ./deploy-staging/dispatch.yaml

换句话说,gcloud不关心dispatch.yaml文件位于什么目录,只要它被称为dispatch.yaml.

我也遇到了和你一样的问题,我来给你提供第三种解决方案。 如果你有多个开发环境,你可能有一个自动部署(就我而言,使用 Gitlab-CI)。 我在部署实习期间进行如下操作,我复制(或重命名)调度文件:

  • 测试:./gcp.dispatch.testing.yml => ./dispatch.yml
  • 生产:./gcp.dispatch.production.yml => ./dispatch.yml

这是我的 gitlab-ci.yml 文件中的一个阶段示例(用于测试):

testing__deploy__gcp_dispatch:
  stage: dispatch
  image: google/cloud-sdk:alpine
  script:
    - cd ${CI_PROJECT_DIR}
    - gcloud auth activate-service-account --key-file ${GCP_SERVICE_KEY_FILE}
    - cp ./gcp.dispatch.testing.yml ./dispatch.yml
    - gcloud --quiet --project ${GCP_PROJECT_ID} app deploy ./dispatch.yml

给你!

PS: 之后我明白了,错误 Unexpected attribute 'dispatch' for object of type AppInfoExternal. 是从哪里来的。 gcloud 不接受文件命名不同于 dispatch.yml...