Heroku + Github部署策略



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

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

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

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

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

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

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

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

这种情况

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

  • 我使用的过程与您引用的文章中的过程类似。
  • 正如你所说,我只会创建一个应用程序。我会在您的 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 推送。然后,耙子文件将:

  1. 设置维护页面,
  2. 推向生产,
  3. 对文件进行后期处理,
  4. 删除维护页面。

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

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

这有点令人困惑,因为:

  • 您的devproduction表示环境,并且是包含生成内容的目录:
    它们不应该在 VCS 中,而应该由脚本自动生成,该脚本将识别其运行的环境,并相应地创建正确的目录。

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

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

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

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

最新更新