Heroku + Github部署策略

mbu*_*ics 15 git deployment heroku node.js

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

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

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

mik*_*dek 7

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

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

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

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

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


Kev*_*ell 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
Run Code Online (Sandbox Code Playgroud)

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

  1. 设置维护页面,
  2. 推动生产,
  3. 做你的文件后期处理,
  4. 取下维护页面.

请注意,文件中的第二个rake任务具有对文件进行后处理的命令,并被第一个rake任务调用以在heroku上运行.

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