2015-10-23 4 views
24

Попытка полностью автоматизировать приложение Heroku's Review Apps (бета) для приложения. Heroku хочет, чтобы мы использовали db/seeds.rb, чтобы засеять недавно созданную копию экземпляра экземпляра.Приложения для изучения Heroku: скопируйте DB для просмотра приложения

У нас нет db/seeds.rb с этим приложением. Мы хотели бы настроить скрипт для копирования существующей БД из текущего родителя (промежуточной) и использовать это как БД для нового приложения.

Это можно сделать вручную:

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

Но я не могу понять, как получить имя приложения, которое создает Heroku в postdeploy сценария.

Кто-нибудь пробовал это и знал, как он может быть автоматизирован?

+0

Вы когда-нибудь это выясняли? Я нахожусь в одной лодке, и мне не повезло вставить ENV ['HEROKU_APP_NAME'] в команду. –

+4

Да, слово из моего контакта @ Heroku заключается в том, что в настоящее время невозможно, чтобы приложение осознавало себя, поэтому вы не можете скопировать базу данных в свое имя приложения, потому что она не может этого знать. Они ожидают, что за это закрепится «через несколько недель». Я отправлю обратно сюда, когда они это сделают (если я помню ;-) – Meltemi

+0

Ждем решения для этого. –

ответ

22

Я столкнулся с этой проблемой и вот как я ее решил.

  1. Настройте URL-адрес базы данных, который вы хотите скопировать из переменной окружения в базовом приложении для конвейера. В моем случае это STAGING_DATABASE_URL. Формат URL: postgresql://username:[email protected]: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" 
    } 
    ] 
} 
+1

. Это хорошо сработало для меня, начиная с промежуточного приложения до приложения для просмотра, но если app.json был использован для развертывания в производстве, разве это не приведет к перезаписыванию производственных данных с дампа из постановка? – Jamie

+1

@Jamie Поболтал с Герокаем об этом. В принципе, вы собираетесь использовать этот app.json для развертывания в производство, только если вы настроите свое приложение автоматически через свой API. Мое приложение prod si в прямом эфире и не будет появляться через их API, поэтому это не будет иметь значения. Надеюсь, я помог тебе! – Stan

+2

Это блестящее решение! Я потянулся к Heroku, чтобы узнать, есть ли способ запустить pg_restore напрямую. Существует, но для этого требуется команда curl, поэтому ваше решение лучше imho. @Jamie быть ясно, app.json работает только на обзорных приложениях и никогда дальше вверх по трубопроводу (постановка или производство) – Lee

2

Альтернатива заключается в обмен базы данных между обзорными приложениями. Вы можете наследовать DATABASE_URL в вашем файле app.json.

PS: Этого достаточно для моего дела, который является небольшой командой, имейте в виду, что, возможно, этого недостаточно для вас. И я держу свое производство и проверяю (или организую, или dev, как вы его называли) разделенные данные.

+1

Как вы объясняете для случаев, когда один человек внесли изменения в база данных в их филиале? Разве это не нарушит его для других приложений, работающих в одной базе данных? – Drenmi

+1

Да, это будет. Вот почему я дал понять, что этого достаточно для моего дела, который в то время был командой только двух разработчиков. Поэтому мы использовали другого, чтобы узнать, собираемся ли мы сделать что-то подобное и взять на себя ответственность сделать откат или что-то еще, если это так. –

Смежные вопросы