Essayer d'automatiser complètement Heroku Review Apps (beta) pour une application. Heroku veut que nous utilisions db/seeds.rb
pour créer le DB de l'instance récemment spun up.
Nous n'avons pas de db/seeds.rb
avec cette application. Nous aimerions configurer un script pour copier la base de données existante à partir du parent actuel (staging) et l'utiliser comme base de données pour la nouvelle application en cours de révision.
Je peux le faire manuellement:
heroku pg:copy myapp::DATABASE_URL DATABASE_URL --app myapp-pr-1384 --confirm myapp-pr-1384
Mais je n'arrive pas à comprendre comment obtenir le nom de l'application créée par Heroku dans le script postdeploy .
Quelqu'un a essayé et sait comment cela pourrait être automatisé?
J'ai rencontré le même problème et voici comment je l'ai résolu.
Configurez l'URL de la base de données à partir de laquelle vous souhaitez copier en tant que variable d'environnement sur l'application de base du pipeline. Dans mon cas, c'est STAGING_DATABASE_URL
. Le format de l'URL est postgresql://username:password@Host:port/db_name
.
Dans votre fichier app.json
, assurez-vous de copier cette variable.
Dans votre app.json
, prévoyez une nouvelle base de données qui définira la variable d'environnement DATABASE_URL
.
Utilisez le script suivant pour copier sur la base de données pg_dump $STAGING_DATABASE_URL | psql $DATABASE_URL
Voici mon fichier app.json
pour référence:
{
"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"
}
]
}
Une alternative consiste à partager la base de données entre les applications de révision. Vous pouvez hériter de DATABASE_URL
dans votre fichier app.json
.
PS: C’est suffisant pour mon cas qui est une petite équipe, gardez à l’esprit que ce n’est peut-être pas suffisant pour la vôtre. Et, je sépare mes données de production et de test (ou de mise en scène, ou de dev, comme vous l'avez appelé).
J'ai rencontré problème après problème en essayant de le faire fonctionner. Ce script post-déploiement a finalement fonctionné pour moi:
pg_dump -cOx $STAGING_DATABASE_URL | psql $DATABASE_URL && bundle exec Rails db:migrate
Sinon: Une autre solution utilisant pg_restore, grâce à 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"
}
}