Ruby on rails 在openshift部署挂钩中检测初始部署

Ruby on rails 在openshift部署挂钩中检测初始部署,ruby-on-rails,openshift,Ruby On Rails,Openshift,我在openshift上有一个rails应用程序。我想在openshift上的部署钩子中运行rake db:migrate,但第一次部署时除外,当时我想运行rake db:setup 这不一定是特定于openshift的,因为部署挂钩只是在部署应用程序时运行的bash脚本 有没有办法知道应用程序之前是否已部署,或者数据库是否已从部署挂钩创建?我认为您不必进行这种区分rake db_setup。另见- 或者,您可以创建自定义rails任务。例如,此任务可以尝试访问数据库以检查它是否存在。如果没有,

我在openshift上有一个rails应用程序。我想在openshift上的部署钩子中运行
rake db:migrate
,但第一次部署时除外,当时我想运行
rake db:setup

这不一定是特定于openshift的,因为部署挂钩只是在部署应用程序时运行的bash脚本


有没有办法知道应用程序之前是否已部署,或者数据库是否已从部署挂钩创建?

我认为您不必进行这种区分<即使数据库已经存在,也可以调用code>rake db_setup。另见-

或者,您可以创建自定义rails任务。例如,此任务可以尝试访问数据库以检查它是否存在。如果没有,您可以调用db:setup。要了解更多关于定制rake任务的信息,请看一下这个漂亮的视频-。使用rake的好处是您的解决方案独立于OpenShift,并且通过使用rake您可以访问Rails环境。

我在中找到了一个解决方案,它实际上甚至不是有效的sh。这是我的版本

 if echo "use $OPENSHIFT_APP_NAME; show tables" | mysql | grep schema_migrations 2>&1 > /dev/null
 then
     bundle exec rake db:migrate RAILS_ENV="production"
 else
     bundle exec rake db:setup RAILS_ENV="production"
 fi
如果您使用的是postgres,这里有一个类似的命令

if echo "\c $PGDATABASE; \dt" | psql | grep schema_migrations 2>&1 >/dev/null
then
   bundle exec rake db:migrate RAILS_ENV="production"
else
   bundle exec rake db:setup RAILS_ENV="production"
fi

我确信有一个类似于mysql的
$PGDATABASE
的环境变量,您可以使用它来代替
$OPENSHIFT\u APP\u NAME
。您可以通过运行
rhcsh-a app name
,然后运行
env
来获得环境变量列表来找到它。

令人遗憾的是,rake db:create仍然返回0退出代码,即使它由于数据库已经存在而失败。对输出进行灰显是一种容易出错的错误。