web-dev-qa-db-ja.com

Herokuレビューアプリ:DBをレビューアプリにコピー

Herokuのアプリを完全に自動化しようとしています アプリのレビュー (ベータ)。 Herokuは、最近スピンアップしたインスタンスのDBをシードするためにdb/seeds.rbを使用することを求めています。

このアプリにはdb/seeds.rbはありません。スクリプトを設定して、現在の親(ステージング)から既存のDBをコピーし、それをレビュー中の新しいアプリのDBとして使用します。

これは私が手動で行うことができます:

heroku pg:copy myapp::DATABASE_URL DATABASE_URL --app myapp-pr-1384 --confirm myapp-pr-1384

しかし、Herokuが作成したアプリ名をpostdeployスクリプトに取得する方法がわかりません。

誰かがこれを試して、それがどのように自動化されるかを知っていますか?

35
Meltemi

私はこれと同じ問題に遭遇しました、そしてここに私がそれを解決した方法があります。

  1. パイプラインの基本アプリの環境変数として、コピー元のデータベースのURLを設定します。私の場合、これはSTAGING_DATABASE_URL。 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"
    }
  ]
}
38
EpiphanyMachine

別の方法は、レビューアプリ間でデータベースを共有することです。継承できますDATABASE_URLあなたのapp.jsonファイル。

PS:これは小さなチームである私の場合には十分です。多分あなたのチームには十分ではないことを覚えておいてください。そして、私は本番とテスト(またはステージング、または開発、あなたがそれを何と呼んでも)データを分離して保管します。

5
sad parrot

これを機能させるために何度も問題が発生しました。このデプロイ後のスクリプトは最終的に私のために働きました:

pg_dump -cOx $STAGING_DATABASE_URL | psql $DATABASE_URL && bundle exec Rails db:migrate
1
kid_drew

または: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"
  }
}
1
Jonathan Haar

そうですか && bundle exec Rails db:migrateこれらの多くの応答のpostdeployステップの一部として。

それは実際にbundle exec Rails db:migratereleaseセクションのapp.json

0
AwesomeBobX64