Heroku上的暂存实例


Answers:


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

我通常在“工作中”的分支机构工作,并使用Gi​​thub作为我的主人。

假设情况如此,您的部署工作流程可能类似于:

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

谢谢-这很有道理(我在git上很烂)。问题:假设我正在对分支“ edge”进行一些最前沿的更改。如何在不影响myapp(当前在master分支上运行)的情况下将该分支推送到staging-myapp?有git push staging edge work吗?
汤姆·雷曼

为了使您着手,您只需将edge合并到您的登台分支并进行推送。您的生产分支是独立且干净的。您可以随时对其进行分支,并进行仅合并回原处的更改。
路加斯·贝叶斯

5
除了使用默认的“ heroku”远程分支创建应用程序并将其删除之后,您还可以使用更好的解决方案,例如:heroku create yourapp --remote your-remote
dombesz 2011年

2
设置好之后,所有heroku命令都必须包含--app staging--app production。有什么办法可以设置默认值?(作为评论b / c,这似乎太有针对性了,不能成为一个完整的SO问题。)
Paul A Jungwirth

3
@PaulAJungwirth要设置默认的Heroku应用,请使用“ git config heroku.remote staging”之类的东西。更多有关Heroku文档的信息,请访问devcenter.heroku.com/articles/multiple-environments
grifaton 2012年


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

步骤3:将Heroku配置为将dev.myapp.com路由到staging-myapp:

heroku domains:add dev.myapp.com --app staging-myapp

在CNAME记录有时间传播之后,您将能够在dev.myapp.com上运行登台应用程序。


1
那么访问控制如何使它不会出现在google等中呢?人们不会偶然发现它并认为它是真实的吗?任何好的解决方案?
brittohalloran 2012年

是的,最简单的方法是跳过GoDaddy步骤,并使用Heroku URL直接从Heroku域中访问应用程序的“ dev”版本。(例如,stormy-lake-5483.heroku.com。)但是,如果您希望如此处所述将“开发”从您的域中删除,则始终可以安装robots.txt文件来告知Google,Bing等。等 不索引您的开发站点。这将有助于使其脱离搜索引擎。
Don Leatham

最后before_filter,我向我添加了一个钩子,application_controller以在升级过程中捕获所有内容,并强制用户以管理员身份登录,然后设置管理员cookie,以便仍然可以从“非管理员”的角度看到该应用程序。对我来说工作很好。
brittohalloran 2012年


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默认为“生产”环境。如果要使登台应用程序在登台环境中运行,请在项目中创建环境,然后在应用上设置相应的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开发中心。)


Heroku不鼓励设置RAILS_ENVRACK_ENVstaging:“创建另一个自定义环境(例如“ staging”并创建config / environments / staging.rb并使用RAILS_ENV = staging部署到Heroku应用程序可能很诱人。这不是一个好习惯)我们建议始终在生产模式下运行,并通过设置config vars修改任何行为。” 更多关于此位置:devcenter.heroku.com/articles/...
公园。

@ Koen-根据我的经验,无论在Heroku还是其他方面,尝试在没有环境上下文的情况下管理复杂的Rails配置都是完全不切实际的。如果您的登台应用程序有一套完整的连接字符串,API密钥等,而生产应用程序又有一套,那么您真的要为每个配置变量分别设置吗?那只是自找麻烦-Heroku在这里给出了不好的建议。
Yarin

谢谢。我正在寻找可以真正获得真实URL的阶段,可能带有commithash。我认为这是Zeit Now或Netlify使它变得容易的事情。
聚{
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.