Heroku Review Apps:复制数据库以查看应用程序
Posted
技术标签:
【中文标题】Heroku Review Apps:复制数据库以查看应用程序【英文标题】:Heroku Review Apps: copy DB to review app 【发布时间】:2016-01-22 10:46:10 【问题描述】:尝试完全自动化 Heroku 的 Review Apps(测试版)应用。 Heroku 希望我们使用 db/seeds.rb
为最近启动的实例的数据库播种。
此应用没有db/seeds.rb
。我们想设置一个脚本来从当前父级(暂存)复制现有数据库,并将其用作正在审核的新应用程序的数据库。
这个我可以手动完成:
heroku pg:copy myapp::DATABASE_URL DATABASE_URL --app myapp-pr-1384 --confirm myapp-pr-1384
但我不知道如何将 Heroku 创建的应用名称添加到 postdeploy 脚本中。
有人试过这个并且知道它是如何实现自动化的吗?
【问题讨论】:
你有没有想过这个问题?我在同一条船上,没有运气尝试在命令中嵌入 ENV['HEROKU_APP_NAME']。 是的,来自我的联系人@Heroku 的消息是,应用程序目前不可能知道自己,因此您无法将数据库复制到您的应用程序名称,因为它不知道。他们希望“在几周内”解决这个问题。当他们这样做时,我会在这里发帖(如果我记得的话;-) 期待解决方案。 @Meltemi:有什么更新吗? 我刚刚使用了 EpiphanyMachine 的解决方案,效果很好:***.com/a/36784098/337903。值得一票/绿色复选标记 【参考方案1】:我遇到了同样的问题,我是这样解决的。
在管道的基础应用程序上将要从中复制的数据库 URL 设置为环境变量。就我而言,这是STAGING_DATABASE_URL
。网址格式为postgresql://username:password@host:port/db_name
。
确保在您的 app.json
文件中复制该变量。
在您的app.json
中配置一个新数据库,该数据库将设置DATABASE_URL
环境变量。
使用以下脚本复制数据库pg_dump $STAGING_DATABASE_URL | psql $DATABASE_URL
这是我的app.json
文件供参考:
"name": "app-name",
"scripts":
"postdeploy": "pg_dump $STAGING_DATABASE_URL | psql $DATABASE_URL && bundle exec rake db:migrate"
,
"env":
"STAGING_DATABASE_URL":
"required": true
,
"HEROKU_APP_NAME":
"required": true
,
"formation":
"web":
"quantity": 1,
"size": "hobby"
,
"resque":
"quantity": 1,
"size": "hobby"
,
"scheduler":
"quantity": 1,
"size": "hobby"
,
"addons": [
"heroku-postgresql:hobby-basic",
"papertrail",
"rediscloud"
],
"buildpacks": [
"url": "heroku/ruby"
]
【讨论】:
这对我从一个暂存应用程序到一个审查应用程序来说效果很好,但是如果 app.json 用于部署到生产,这不会冒用转储覆盖生产数据的风险分期? @Jamie 与英雄凯聊过这个问题。基本上,只有通过 API 自动设置应用程序时,您才会使用此 app.json 部署到生产环境中。我的产品应用程序是实时的,不会通过他们的 API 弹出,所以它并不重要。希望我能帮到你! 这是一个绝妙的解决方案!我联系了 Heroku,看看是否有办法直接运行 pg_restore。有,但它需要一个 curl 命令,所以你的解决方案更好恕我直言。 @Jamie 需要明确的是,app.json 仅在审查应用程序上运行,并且永远不会进一步提升管道(暂存或生产) 查看脚本日志,我得到了很多类似的东西:ALTER SEQUENCE ERROR: relation "addresses" already exists ERROR: role "ckoeyocnvasjns" does not exist ERROR: relation "addresses_id_seq" already exists ERROR: role "ckoeyocnvasjns" does not exist
我遇到了与@ChrisEdwards 类似的问题。我已将 pg_dump 命令更改为 pg_dump -Ox $STAGING_DATABASE_URL
以删除所有者和所有权限并解决了问题。【参考方案2】:
另一种方法是在评论应用之间共享数据库。您可以在 app.json
文件中继承 DATABASE_URL
。
PS:这对于我的小团队来说已经足够了,请记住,对于你的来说可能还不够。而且,我将生产和测试(或暂存或开发,无论你怎么称呼它)数据分开。
【讨论】:
您如何解释有人更改其分支机构中的数据库的情况?这不会破坏在同一数据库上运行的其他应用程序吗? 是的,它会的。这就是为什么我明确表示这对我的案例来说已经足够了,当时它是一个只有两个开发人员的团队。因此,我们过去常常让其他人知道我们是否要做类似的事情,并承担责任做回滚或其他任何事情,如果是这样的话。 你能提供一个关于如何做到这一点的代码 sn-p 吗? @RickS 我无法再访问这个项目了,但我记得我们是通过 config vars 继承来做到这一点的。如果您有 DATABASE_URL 或类似的东西,您可以将其指定为从“主应用程序”继承,这样它将共享数据库。你可以在这里看到代码+更多信息devcenter.heroku.com/articles/…【参考方案3】:或者: 另一个使用 pg_restore 的解决方案,感谢 https://gist.github.com/Kalagan/1adf39ffa15ae7a125d02e86ede04b6f
"scripts":
"postdeploy": "pg_dump -Fc $DATABASE_URL_TO_COPY | pg_restore --clean --no-owner -n public -d $DATABASE_URL && bundle exec rails db:migrate"
【讨论】:
【参考方案4】:我在尝试使其正常工作时遇到了一个又一个问题。这个部署后脚本终于为我工作了:
pg_dump -cOx $STAGING_DATABASE_URL | psql $DATABASE_URL && bundle exec rails db:migrate
【讨论】:
【参考方案5】:我认为&& bundle exec rails db:migrate
是许多此类回复中postdeploy
步骤的一部分。
实际上应该只是在app.json
的release
部分中的bundle exec rails db:migrate
吗?
【讨论】:
以上是关于Heroku Review Apps:复制数据库以查看应用程序的主要内容,如果未能解决你的问题,请参考以下文章
我应该多久访问一次 Heroku 服务器以使其保持清醒? [复制]
ARTS打卡计划第四周-Review-构建大规模django应用的一些建议
我如何将本地 PostgreSQL 数据库复制到 Heroku for Spring Boot 应用程序