Heroku + Github部署策略

时间:2012-06-24 08:04:13

标签: git node.js deployment heroku

我正在开发一个Web应用程序,在Github上托管源代码并在Heroku上运行应用程序。一切都很好,但我有问题,我无法绕过头。在部署我的代码之前,我运行一些脚本来优化代码(缩小,连接文件等)。 heroku应用程序仅使用应用程序的优化版本。

基本上,我有两个文件夹:devproductionDev包含我编写的源代码,production由我的构建脚本生成(我使用grunt和requirejs)。目前,这两个文件夹都在我的Git存储库中,并且都被推送到Github和Heroku。我更喜欢的是只在Github上有dev而在Heroku上只有production。 我阅读了一些文章,如何为Heroku设置不同的分支,如described in this blog。我可以设置一个生产分支,并且只有production文件夹,同时将dev文件夹保存到我的主分支中吗?或者我需要单独的存储库吗?

有没有人尝试过类似的东西?我认为这不是一件与众不同的事情。

4 个答案:

答案 0 :(得分:7)

您可能只想考虑使用heroku .slugignore文件(参考https://devcenter.heroku.com/articles/slug-compiler)。

此文件允许您从heroku部署到每个服务器实例的包中删除dev文件夹,同时允许您将所有代码保存在同一个存储库中。

问题的根源是将部署策略视为将最终位上传到服务器的位置,其中这些位是构建存储库的人工制品。在这种情况下,构建通常与源分开存储和存档。

Heroku的模型与此略有不同,因为它假定您的存储库是部署的人工制品。差别很小,但在您的情况下,它只是意味着您需要向您的存储库提交您希望heroku服务的位。

另一种思考方式是,您可以不使用production文件夹,并且作为启动服务器的一部分,将运行脚本以生成production文件夹文件。这将允许您删除production文件夹,并以每次启动服务器时运行此过程为代价保持存储库清洁。这可能被证明是非常昂贵和不受欢迎的(Heroku在放弃它之前等待服务器启动的时间有限),但希望有助于提供一些关于Heroku和git关系的清晰度。

答案 1 :(得分:5)

这种情况有点不寻常。但这里有一些想法:

  • 我使用的流程类似于您引用的文章中的流程。
  • 我只会创建一个应用程序作为你的说法。我创建它在dev文件夹中启动一个新的git存储库。
  • 然后,我建议采用类似于本答案中描述的部署策略:https://stackoverflow.com/a/8058194/267025。我在下面改编了它:

创建一个包含两个任务的rake文件:rake deploy:productionrake deploy:postprocess_files。这些任务看起来像这样:

namespace :deploy do

  task :production do
    puts "turn on 'maintenance page' on heroku"
    system "heroku maintenance:on"

    puts "deploying to production"
    system "git push heroku-prod master"

    puts "post processing files..."
    system "heroku run rake production:postprocess_files"

    puts "take off maintenance page"
    system "heroku maintenance:off"

    puts "done"
  end 

  task :postprocess_files do
    puts "run postprocessing of files on heroku"
    ... add commands here to post process the files.
  end 
end

然后使用rake deploy:production部署到生产,而不是直接使用git。然后rake文件将:

  1. 设置维护页面,
  2. 推向生产,
  3. 进行文件的后期处理,
  4. 取下维护页面。
  5. 请注意,文件中的第二个rake任务具有对文件进行后期处理的命令,并被第一个rake任务调用以在heroku 上运行

    作为替代方案,您可以扩展资产:Heroku在每次部署中运行的预编译任务。这基本上就是你正在做的事情 - 为部署到生产准备资产。

答案 2 :(得分:2)

这有点令人困惑,因为:

使用分支是好的,仅用于隔离代码变体(在所述分支中),而不是用于存储释放生成的代码 您的特定版本管理问题(即生成正确的交付)应由脚本(可以与代码一起进行版本控制)进行管理,并用作例如生成和部署正确的代码集的脚本。正确的地方。

答案 3 :(得分:2)