【问题标题】:How to deploy one app engine app to multiple projects如何将一个应用引擎应用部署到多个项目
【发布时间】:2017-01-16 15:24:50
【问题描述】:

我的问题是我想通过使用不同的 GCP 项目来创建 dev、stage、prod 环境。

基本上它们运行相同的代码,只是在不同的隔离环境中运行它们。

我现在在命令行中使用gcloud app deploy 来部署应用程序。

如何有效地将应用部署到不同的项目?
我每次都必须做gcloud init 来更改我的默认项目配置吗?
必须有一些更好的做法。

或者,我有没有更好的方法在应用引擎的上下文中设置 dev... 环境?

谢谢。

【问题讨论】:

  • 创建一个利用多处理的部署脚本

标签: google-app-engine google-cloud-platform


【解决方案1】:

不要每次都使用gcloud init更改配置,而是使用此代码更快地部署到多个项目:

gcloud app deploy -q --project [YOUR_PROJECT_ID]

如果您的项目具有相似的 ID,假设:test1、test2、test3、test4,您可以使用一个命令部署到四个项目。使用此代码:

for i in {1..4}; do gcloud app deploy -q --project test${i}; done

【讨论】:

    【解决方案2】:

    我的偏好是通过与代码相同的版本控制来管理不同的环境 - 每个环境有一个分支,使部署与代码更改的自然流完全一致,通过分支合并促进:dev -> stage -> production.

    为了最大程度地减少人为错误的风险,我尽可能将部署配置保留在代码本身中(即 - 从 .yaml 文件中获取应用程序 ID、版本等,而不是传递给将 cmd 部署为 args)。部署 cmds 本身保存在一个备忘单文件中(此时太简单,无法保证完整的脚本),也是 git 控制的。在这个答案中说明:https://stackoverflow.com/a/34111170/4495081

    部署是从单独的专用工作区完成的 - 每个环境一个,基于相应的 git 分支(我从不切换这些工作区中的分支)。我只是将与所需环境对应的工作区更新为所需的版本,然后从工作区的备忘单中复制粘贴部署 cmd。

    恕我直言,此模型已支持 CI/CD,并且可以轻松实现完全自动化。

    【讨论】:

      【解决方案3】:

      对于 Python 应用程序,您可以在 app.yaml 文件中设置应用程序。这允许您为每个项目使用不同的数据。这是您使用 appcfg.py 命令进行部署的时候。

      application: myproject
      version: alpha-001
      runtime: python27
      api_version: 1
      threadsafe: true
      
      handlers:
      - url: /
        script: home.app
      

      如果您不想为每个项目更改此文件中的应用程序值,可以运行以下命令:

      appcfg.py -A <YOUR_PROJECT_ID> -V v1 update myapp/
      

      https://cloud.google.com/appengine/docs/python/config/appref

      如果您未在文件中指定应用程序,请在部署时使用 appcfg 命令中的 --application 选项。当您使用 gcloud app deploy 命令进行部署时,此元素会被忽略。

      【讨论】:

      • 谢谢杰夫!这非常方便。但我现在正在使用灵活的应用引擎。在app.yaml 文档中没有看到这个application 字段。不妨试一试,看看是否像标准应用引擎一样工作。
      • 事实证明我可以使用gcloud beta app deploy --project project-name 将相同的代码部署到不同的独立项目。
      【解决方案4】:

      “标准”方法是使用版本,例如

      qa.myApp.appspot.com
      

      一旦某个版本为下一步做好准备,您就可以使用不同的版本 ID 部署它。

      使用多个项目的一个问题是您必须为每个项目维护不同的数据集。

      【讨论】:

      • 我明白版本可以完成这项工作。但是这样做,所有底层数据存储都混合在一起,例如:数据存储 NoSQL。这难道不违背隔离环境的目的吗?
      • 如有必要,您可以使用命名空间隔离数据存储区中的数据。这完全取决于您的数据是如何组织的。在某些项目中,我有一个测试用户帐户,其中包含仅用于测试且不与“实时”用户混合的数据。在一个项目中,我有一个测试“组织”,它就像任何其他组织一样,因为每个组织只能访问自己的数据而看不到其他组织。
      • 感谢您的意见。我个人想创建更独立的环境,所以我决定将它用于不同的项目以获得更细粒度的控制。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2019-08-21
      • 2019-07-27
      相关资源
      最近更新 更多