Heroku + Github部署策略

我正在开发一个Web应用程序,在Github上托pipe源代码并在Heroku上运行应用程序。 一切正常,但我有问题,我不能包裹我的头。 在部署我的代码之前,我运行一些脚本来优化代码(缩小,连接文件等)。 heroku应用程序只使用应用程序的优化版本。

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

有没有人试过类似的东西? 我会认为这不是一个不寻常的事情。

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

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

问题的根源在于将部署策略作为将最终位上传到服务器的方式来考虑,其中位是构build存储库的一个假象 。 在这种情况下,版本通常与源文件分开存储和归档。

Heroku的模型与此略有不同,因为它假设您的存储库是部署的人造物 。 这个差别很小,但就你而言,这意味着你需要向你的仓库提交你想要heroku服务的位。

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

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

  • 我使用了一个类似于你引用的文章中的过程。
  • 我只会按照你的说法创build一个应用程序。 我会创build它在你的dev文件夹中开始一个新的git仓库。
  • 然后,我会推荐一个类似于这个答案中描述的部署策略: https : //stackoverflow.com/a/8058194/267025 。 我已经在下面调整了它:

创build一个包含两个任务的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部署到生产rake deploy:production而不是直接使用git。 耙文件将然后:

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

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

或者,您可能可以扩展资源:Heroku作为每个部署的一部分运行的预编译任务。 这基本上是你在做什么 – 准备资产部署到生产。

这有点令人困惑,因为:

  • 你的devproduction代表环境 ,并且是生成内容的目录:
    他们不应该在VCS中,而是由能够识别其运行环境的脚本自动生成,并相应地创build正确的目录。

  • 文章中提到的devproduction是指“ 在Heroku上部署多个环境(同时仍然在Github上托pipe代码) ”代表推广阶段 ,并且是分支

使用分支是好的,只是为了隔离代码变化(在所述分支中),而不是用于存储释放生成的代码。
您的特定版本pipe理问题(即生成正确的传输)应该由脚本(可以与您的代码一起版本控制)进行pipe理,并用作钩子来生成和部署正确的代码集正确的位置。

我个人喜欢这个解决scheme: https : //github.com/mbuchetics/heroku-buildpack-nodejs-grunt并看看这个: https : //medium.com/the-javascript-collection/how-to-deploy -a-咕噜-项目上的Heroku,c227cb1ddc56

老实说,它是最干净的方式之一。