web-dev-qa-db-fra.com

Heroku Review Apps: copie de la base de données pour revoir l'application

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é? 

29
Meltemi

J'ai rencontré le même problème et voici comment je l'ai résolu.

  1. 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.

  2. Dans votre fichier app.json, assurez-vous de copier cette variable.

  3. Dans votre app.json, prévoyez une nouvelle base de données qui définira la variable d'environnement DATABASE_URL.

  4. 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"
    }
  ]
}
33
EpiphanyMachine

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é). 

2
sad parrot

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
1
kid_drew

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"
  }
}
1
Jonathan Haar