Heroku上的暂存实例

86

我希望能够将代码推送到dev.myapp.com进行测试,然后再推送到www.myapp.com以供生产使用。在Heroku上是否可以实现这一点?

5个回答

142

你与Heroku的接口本质上是一个Git分支。Heroku gem通过其API进行了一些工作,但在你的Git仓库中,它只是一个新的远程分支。

heroku create yourapp # production
git br -D heroku # delete the default branch

heroku create staging-yourapp # staging
git br -D heroku # delete the default branch

在Heroku上设置多个应用程序后,您应该能够像这样配置您的Git存储库:

git remote add staging git@heroku.com:staging-yourapp.git
git push origin staging

git remote add production git@heroku.com:yourapp.git
git push origin production

我通常在一个名为'working'的分支上工作,使用Github来管理我的主分支。

如果你也是这样的情况,你的部署工作流程可能如下:

git co -b working
# do some work

# push to github:
git co master
git merge working
git push

# push to staging:
git co staging
git merge master
git push origin staging

# push to production
git co production
git merge master
git push origin production

5
不要使用默认的“heroku”远程分支来创建应用程序,也不要在删除该分支后这样做。你可以使用更好的解决方案:heroku create yourapp --remote your-remote - dombesz
2
一旦您设置好了这个,所有的 heroku 命令都需要包含 --app staging--app production。有没有办法设置默认值?(作为评论提问,因为这似乎太具体化,不足以成为一个完整的 SO 问题。) - Paul A Jungwirth
3
要设置 Heroku 应用的默认值,请使用类似于 "git config heroku.remote staging" 的命令。更多相关信息请参考 Heroku 文档中的 https://devcenter.heroku.com/articles/multiple-environments。 - grifaton
@HoraceLoeb- 回复您的原始评论:git push staging edge:master - Yarin
由于Heroku正在从“staging”和“production”拉取,那么“master”分支有什么作用呢?你不能简化并将“master”作为生产代码的主页吗? - Jeff
显示剩余6条评论

19

10

原问题的关键部分涉及将暂存应用程序与主应用程序 (www.myapp.com) 的子域 (dev.myapp.com) 链接起来。没有任何答案解决了这个问题。

步骤1:按照Luke Bayes的答案所示,将你的应用程序的生产版本 ('myapp') 和暂存版本 ('staging-myapp') 进行配置。

步骤2:在你的域名管理系统(例如Godaddy)中:

Create a CNAME record:  dev.myapp.com 
that points to:   proxy.heroku.com

第三步:配置Heroku将dev.myapp.com路由到staging-myapp:

heroku domains:add dev.myapp.com --app staging-myapp
在CNAME记录传播一段时间后,您将能够在dev.myapp.com上运行您的演示应用程序。

1
如何设置访问控制,以便它不会出现在Google等搜索引擎中,人们也不会偶然发现并将其误认为是真正的东西?有没有好的解决方案? - brittohalloran
最终我在application_controller中添加了一个before_filter钩子,以便在暂存环境下捕获所有内容并强制用户登录为管理员,然后设置一个管理员cookie,这样我仍然可以从“非管理员”的角度查看应用程序。对我来说效果不错。 - brittohalloran

8

你应该查看heroku_san

它在Heroku上处理环境方面表现得相当不错。


7

现在的事情更容易了。以下是您的操作步骤...

为每个环境创建一个应用程序

$ heroku create myapp --remote production
$ heroku create myapp-staging --remote staging

这将为每个应用程序创建命名的远程存储库,您可以在 .git/config 中看到。
现在,您可以使用--app--remote开关来针对特定的应用程序。
$ heroku info --app myapp-staging
$ heroku info --remote staging

设置Rails环境

对于Rails应用程序,Heroku默认使用"production"环境。如果你想让你的staging应用程序运行在staging环境中,在你的项目中创建该环境并在应用程序上设置相应的RAILS_ENVRAKE_ENV环境变量:

$ heroku config:set RACK_ENV=staging RAILS_ENV=staging --remote staging

配置环境

如果您有其他配置变量,您也需要将它们传递给每个环境。

$ heroku config:set AWS_KEY=abc --remote staging
$ heroku config:set AWD_SECRET=123 --remote staging
...etc

这是一个巨大的痛点,所以我只使用我的snappconfig gem并运行

$ rake heroku:config:load[myapp-staging]

我希望你能帮助将我的项目的YAML配置文件加载到Heroku中。

部署

现在你只需要像这样推送到Heroku:

$ git push staging master
$ git push production master

并像这样迁移:

$ heroku run rake db:migrate --remote staging
$ heroku run rake db:migrate --remote production

更多信息和快捷方式请参见管理应用程序的多个环境 | Heroku Dev Center


在Heroku中,不建议将RAILS_ENVRACK_ENV设置为staging:“创建另一个自定义环境(例如“staging”)并创建config/environments/staging.rb,然后使用RAILS_ENV=staging部署到Heroku应用程序可能很诱人。这不是一个好的做法。相反,我们建议始终以生产模式运行,并通过设置您的配置变量来修改任何行为。”更多信息请参见:https://devcenter.heroku.com/articles/deploying-to-a-custom-rails-environment - Koen.
@Koen- 根据我的经验,在Heroku或其他地方,如果没有环境的上下文来管理复杂的Rails配置是完全不切实际的。如果您有一整套连接字符串、API密钥等用于您的staging应用程序和另一个用于生产应用程序,您真的会为每个变量单独设置这些配置吗?那只会带来麻烦- Heroku在这里给出了错误的建议。 - Yarin
谢谢。我正在寻找一个真正能够获得实际URL的分段,可能带有提交哈希值。我认为这是Zeit Now或Netlify让它变得容易的东西。 - Polv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接