【问题标题】:Staging instance on HerokuHeroku 上的暂存实例
【发布时间】:2010-11-19 18:28:42
【问题描述】:

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

【问题讨论】:

    标签: deployment heroku staging


    【解决方案1】:

    您与 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
    

    我通常在“工作”分支中工作,并使用 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
    

    【讨论】:

    • 谢谢——这有点道理(我很讨厌 git)。问题:假设我正在对分支“边缘”进行一些前沿更改。如何将该分支推送到 staging-myapp 而不影响 myapp (当前正在主分支上运行)? git push staging edge work
    • 为了让您继续前进,您只需将边缘合并到您的暂存分支并推送它。您的生产分支是独立且干净的。您始终可以对其进行分支并进行仅合并到那里的更改。
    • 不要使用默认的“heroku”远程分支创建应用程序并在删除它之后,您可以使用更好的解决方案,例如:heroku create yourapp --remote your-remote
    • 设置完成后,所有heroku 命令都需要包含--app staging--app production。有没有办法设置默认值? (要求作为评论 b/c 这似乎过于有针对性,不能成为一个成熟的 SO 问题。)
    • @PaulAJungwirth 要设置默认的 Heroku 应用,请使用“git config heroku.remote staging”之类的内容。更多信息请参阅 Heroku 文档devcenter.heroku.com/articles/multiple-environments
    【解决方案2】:

    你应该检查heroku_san

    它在处理 heroku 上的环境方面做得非常好。

    【讨论】:

      【解决方案3】:

      如果您是像我这样的新手,这说明了您需要知道的一切:http://devcenter.heroku.com/articles/multiple-environments

      【讨论】:

        【解决方案4】:

        原始问题的一个关键部分是将临时应用程序链接到主应用程序 (www.myapp.com) 的子域 (dev.myapp.com)。任何答案都没有解决这个问题。

        第 1 步:配置应用的生产 ('myapp') 和暂存 ('staging-myapp') 版本,如 Luke Bayes 的回答所示

        第 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 上运行您的暂存应用程序。

        【讨论】:

        • 访问控制怎么样,所以它不会出现在谷歌等中,人们不会偶然发现它并认为它是真实的?有什么好的解决方案吗?
        • 是的,最简单的方法是跳过 GoDaddy 步骤,使用 Heroku URL 直接从 Heroku 域访问应用程序的“开发”版本。 (例如stormy-lake-5483.heroku.com.)但是,如果您想按照此处所述从您的域中删除“dev”,您可以随时安装 robots.txt 文件来告诉 google、bing 等。人。不索引您的开发网站。这将有助于将其排除在搜索引擎之外。
        • 我最终在我的application_controller 中添加了一个before_filter 挂钩,以捕获暂存中的所有内容并强制用户以管理员身份登录,然后设置一个管理员cookie,这样我仍然可以从“非管理员”的观点。对我来说工作得很好。
        【解决方案5】:

        现在事情变得更容易了。这是你的做法......

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

        $ 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 defaults to the "production" environment。如果您希望您的 staging 应用程序在 staging 环境中运行,请在您的项目中 create the environment 并在应用程序上设置相应的 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
        

        (有关更多信息和快捷方式,请参阅Managing Multiple Environments for an App | Heroku Dev Center。)

        【讨论】:

        • RAILS_ENVRACK_ENV 设置为 staging 是 Heroku 不鼓励的:“创建另一个自定义环境(例如“staging”)并创建一个 config/environments/staging.rb 可能很诱人并使用 RAILS_ENV=staging 部署到 Heroku 应用程序。这不是一个好习惯。相反,我们建议始终在生产模式下运行并通过设置配置变量来修改任何行为。更多信息在这里:devcenter.heroku.com/articles/…
        • @Koen- 根据我的经验,尝试在没有环境上下文的情况下管理复杂的 Rails 配置是完全不切实际的,无论是在 Heroku 上还是在其他方面。如果您的登台应用程序拥有一整套连接字符串、API 密钥等,而生产应用程序则拥有另一套连接字符串、API 密钥等,您真的要为每个应用程序单独设置这些配置变量吗?那只是自找麻烦——Heroku 在这里给出了不好的建议。
        • 谢谢。我正在寻找真正获得真实 URL 的登台,可能使用 commithash。我认为这是 Zeit Now 或 Netlify 让事情变得简单的原因。
        猜你喜欢
        • 2011-11-22
        • 2013-10-09
        • 1970-01-01
        • 2017-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        相关资源
        最近更新 更多