我正在开发一个Web应用程序,在Github上托管源代码并在Heroku上运行应用程序。一切都很好,但我有问题,我无法绕过头。在部署我的代码之前,我运行一些脚本来优化代码(缩小,连接文件等)。 heroku应用程序仅使用应用程序的优化版本。
基本上,我有两个文件夹:dev
和production
。 Dev
包含我编写的源代码,production
由我的构建脚本生成(我使用grunt和requirejs)。目前,这两个文件夹都在我的Git存储库中,并且都被推送到Github和Heroku。我更喜欢的是只在Github上有dev
而在Heroku上只有production
。
我阅读了一些文章,如何为Heroku设置不同的分支,如described in this blog。我可以设置一个生产分支,并且只有production
文件夹,同时将dev
文件夹保存到我的主分支中吗?或者我需要单独的存储库吗?
有没有人尝试过类似的东西?我认为这不是一件与众不同的事情。
答案 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存储库。创建一个包含两个任务的rake
文件:rake deploy:production
和rake 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文件将:
请注意,文件中的第二个rake任务具有对文件进行后期处理的命令,并被第一个rake任务调用以在heroku 上运行。
作为替代方案,您可以扩展资产:Heroku在每次部署中运行的预编译任务。这基本上就是你正在做的事情 - 为部署到生产准备资产。
答案 2 :(得分:2)
这有点令人困惑,因为:
您的dev
和production
代表环境,并且是生成内容的目录:
它们不应该在VCS中,而是由一个脚本自动生成,该脚本将识别它运行的环境,并相应地创建正确的目录。
您引用的文章中提及的dev
和production
“Deploying multiple environments on Heroku (while still hosting code on Github)”代表促销阶段,并且分支机构
使用分支是好的,仅用于隔离代码变体(在所述分支中),而不是用于存储释放生成的代码 您的特定版本管理问题(即生成正确的交付)应由脚本(可以与代码一起进行版本控制)进行管理,并用作例如生成和部署正确的代码集的脚本。正确的地方。
答案 3 :(得分:2)