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.jsonrelease 部分中的bundle exec rails db:migrate 吗?

【讨论】:

以上是关于Heroku Review Apps:复制数据库以查看应用程序的主要内容,如果未能解决你的问题,请参考以下文章

我应该多久访问一次 Heroku 服务器以使其保持清醒? [复制]

ARTS打卡计划第四周-Review-构建大规模django应用的一些建议

我如何将本地 PostgreSQL 数据库复制到 Heroku for Spring Boot 应用程序

ARTS打卡计划第一周-Review

如何在 Heroku 上 rake db:drop 和 rake db:create? [复制]

如何将 DataSource 绑定到 InitialContext 以进行 JUnit 测试? [复制]