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

问题描述 投票:0回答:4

我正在尝试理解 Google App Engine 的

dispatch.yaml
文件。

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

frontend
default
,即后端。

我们有一个带有前端和后端的普通网络应用程序。我们还有开发和生产环境。我们在 GAE 上有两个服务 - 前端和默认服务,即后端。我们在 GAE 上有两个项目 -

staging
,这是我们的开发环境,以及
production
,这是我们的生产环境。暂存环境是从我们的前端和后端的开发分支构建的。生产环境是由我们的前端和后端的master构建的。

我们希望在临时环境和生产环境中使用自定义路由。

我尝试使用

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

如何使用

dispatch.yaml
指定正在构建的环境?

google-app-engine google-cloud-platform app-engine-flexible
4个回答
12
投票

我知道这是一个老问题,但我刚刚发现了一些有趣的东西,可以帮助每个想要部署到不同环境的人。 经过大量的试验和错误,我发现

gcloud
需要调用作为参数给出的调度文件
dispatch.yaml
。如果您将其称为其他名称,例如
dispatch-staging.yaml
dev-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
即可。


5
投票

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

  • master
    分支版本部署到
    my_app-dev
    - 开发环境应用程序
  • production
    分支版本部署到
    my_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

注意:我在应用程序级别实现不同的环境(与服务级别相反,请参阅在 GAE 项目/应用程序级别与服务/模块级别实现 CI/CD 环境的优点?)。服务级别实现不能使用这种方法。


1
投票

我也遇到了和你一样的问题,我来为你提供第三种解决方案。 如果您有多个开发环境,则可能有自动部署(就我而言,使用 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
不同...


0
投票

根据 Google Cloud 支持,您只需要在定义这两种服务的默认服务的根目录中创建一个dispatch.yaml 文件。自这篇文章撰写以来,技术也很可能在不断发展。

dispatch:
  # send all default_site.com requests to default service.
  - url: "default_site.com/*"
    service: default

  # send all another_site.com requests to nother_site service.
  - url: "nother_site.com/*"
    service: nother_site
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.