如何在Google App Engine上设置预发布环境
在正确配置了一个开发服务器和一个生产服务器之后,我想在Google App Engine上设置一个预发布环境,这样可以在正式发布之前测试新开发的版本。
我知道两种不同的方法:
A. 第一个选项是通过修改app.yaml中的版本参数。
version: app-staging
我不喜欢这种方法的原因是,生产环境的数据会被我的预发布测试弄得一团糟,因为(如果我错了请纠正我):
- 预发布版本和生产版本使用的是同一个数据存储
预发布版本和生产版本共享同样的日志
关于第一点,我不知道是否可以通过新的命名空间Python API来“修复”这个问题。
B. 第二个选项是通过修改app.yaml中的应用程序参数
application: foonamestaging
通过这种方法,我可以创建一个与生产版本完全独立的第二个应用程序。
我看到的唯一缺点是我必须配置一个第二个应用程序(管理员设置)。
使用像Gaebar这样的备份恢复工具,这个解决方案也能很好地工作。
你们在为自己的网页应用设置预发布环境时使用了什么方法?
另外,你们有没有自动化脚本来在部署之前修改yaml文件?
7 个回答
我们选择了选项B。我觉得这个选择总体上更好,因为它完全隔离了不同的项目。举个例子,在测试服务器上调整一些配置不会影响到生产环境的安全性,也不会引发其他连锁反应。
至于部署脚本,你可以在你的app.yaml文件中随便写一个应用名称,随便取个假名或者开发用的名字。然后在部署的时候,只需要加一个-A
参数就行:
appcfg.py -A your-app-name update .
这样可以大大简化你的部署脚本,不需要在app.yaml中进行字符串替换或者其他类似的操作。
如果需要单独的数据存储,我觉得选项B是更干净的解决方案,原因如下:
- 你可以保留版本功能,这样可以对生产应用进行真正的版本管理。
- 你可以使用版本功能来进行流量分配。
- 你可以使用命名空间功能来支持多租户。
- 你可以很方便地将实体从一个应用复制到另一个应用,这在不同的命名空间之间就不那么简单了。
- 有些API仍然不支持命名空间。
- 对于有多个开发者的团队,你可以只给一个人上传到生产环境的权限。
我在设置中选择了第二个选项,因为这是最快的解决方案,而且我还没有写任何脚本来在部署时更改应用参数。
不过现在看来,选项A是个更干净的解决方案。你只需要几行代码,就可以根据版本动态切换数据存储的命名空间,而这个版本信息可以通过环境变量CURRENT_VERSION_ID获取,具体可以参考这里的文档:http://code.google.com/appengine/docs/python/runtime.html#The_Environment