Heroku评论应用程序:复制数据库以查看应用程序

时间:2015-10-23 00:51:06

标签: postgresql heroku heroku-toolbelt heroku-postgres

尝试为应用程序完全自动化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 脚本中。

任何人都试过这个并知道如何实现自动化?

6 个答案:

答案 0 :(得分:35)

我遇到了同样的问题,这就是我如何解决它。

  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

  5. 以下是我的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"
        }
      ]
    }
    

答案 1 :(得分:4)

另一种方法是在审核应用之间共享数据库。您可以在DATABASE_URL文件中继承app.json

PS:这对我的情况来说足够了,这是一个小团队,请记住,对你来说可能还不够。并且,我保持我的生产和测试(或暂存,或开发,无论你怎么称呼)数据分开。

答案 2 :(得分:1)

<强>可替换地: 使用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"
  }
}

答案 3 :(得分:1)

试图使它正常工作,我遇到了一个又一个问题。这个部署后脚本最终对我有用:

pg_dump -cOx $STAGING_DATABASE_URL | psql $DATABASE_URL && bundle exec rails db:migrate

答案 4 :(得分:0)

在许多此类回复中,我将&& bundle exec rails db:migrate视为postdeploy步骤的一部分。

实际上应该只是bundle exec rails db:migrate的{​​{1}}部分的release吗?

答案 5 :(得分:-1)

如果您使用的是python而不是ruby,您将用bundle exec rake db:migrate替换什么