15

我正在开发一个网络应用程序,在 Github 上托管源代码并在 Heroku 上运行该应用程序。一切正常,但我有一个问题我无法解决。在部署我的代码之前,我会运行一些脚本来优化代码(缩小、连接文件等)。heroku 应用程序仅使用应用程序的优化版本。

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

有没有人尝试过类似的东西?我认为这不是什么不寻常的事情。

4

4 回答 4

7

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

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

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

Heroku 的模型与此略有不同,它假设您的存储库是要部署的工件。区别很小,但在您的情况下,这只是意味着您需要将您希望 heroku 服务的位提交到您的存储库。

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

于 2012-12-07T15:50:17.257 回答
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

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

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

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

作为替代方案,您可以扩展 Heroku 作为每次部署的一部分运行的 assets:precompile 任务。无论如何,这基本上就是您正在做的事情——准备资产以部署到生产环境。

于 2012-06-24T09:55:49.413 回答
2

我个人喜欢这个解决方案:https ://github.com/mbuchetics/heroku-buildpack-nodejs-grunt 也看看这个:https ://medium.com/the-javascript-collection/how-to-deploy -a-grunt-project-on-heroku-c227cb1ddc56

老实说,这是最干净的方法之一。

于 2014-06-11T06:31:10.867 回答
2

这有点令人困惑,因为:

  • 你的devproduction代表环境, 和 是具有生成内容的目录:
    它们不应该在 VCS 中,而是由一个脚本自动生成,该脚本将识别它运行的环境,并相应地创建正确的目录。

  • dev您在文章中production提到的“在 Heroku 上部署多个环境(同时仍在 Github 上托管代码) ”中提到的和表示升级阶段,并且是分支

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

于 2012-06-24T08:30:44.930 回答