【问题标题】:Heroku Review Apps: copy DB to review appHeroku Review Apps:复制数据库以查看应用程序
【发布时间】: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 的解决方案,效果很好:stackoverflow.com/a/36784098/337903。值得一票/绿色复选标记

标签: postgresql heroku heroku-toolbelt heroku-postgres


【解决方案1】:

我遇到了同样的问题,我是这样解决的。

  1. 在管道的基础应用程序上将要从中复制的数据库 URL 设置为环境变量。就我而言,这是STAGING_DATABASE_URL。网址格式为postgresql://username:password@host:port/db_name

  2. 确保在您的 app.json 文件中复制该变量。

  3. 在您的app.json 中配置一个新数据库,该数据库将设置DATABASE_URL 环境变量。

  4. 使用以下脚本复制数据库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 吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-06
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 2012-02-21
        • 2021-02-22
        • 1970-01-01
        相关资源
        最近更新 更多