是否正在将Gem从其Git repo中疯狂地用于生产中的应用程序?

时间:2014-07-09 05:30:59

标签: gem bundler

我最近接手了一个应用程序,它的一个宝石是直接从repo安装的,当然它现在可以在生产中使用,因为当它启动时一切正常,但是,在我的本地有一堆破碎的东西,因为我从git repo的头上拉了出来。

我的问题是,这个应用程序是否存在违反的最佳实践/模式,直接从repo使用gem,然后在生产模式下就像这样存在?我认为这很疯狂,但我找不到任何好的做法。

1 个答案:

答案 0 :(得分:1)

运行bundle install时,使用的确切提交哈希将插入Gemfile.lock。如果将Gemfile.lock提交给应用程序的git repo,那么无论您在哪里运行bundle install,都应始终从同一提交运行,无论上游存储库中发生了哪些更改。这应该是非常安全的。

如果您正在获取git repo的头部,则表明Gemfile.lock不在源代码管理中。绝对建议提交该文件:Bundler确保在不同的机器上安装相同版本的gem。见http://ryanbigg.com/2010/12/commit-it-or-else/

也就是说,许多团队更喜欢在部署之前构建包含所有gem依赖项的工件。这意味着您无需点击任何外部网站进行部署(除了您托管工件的地方之外)。

部署前

  1. 在构建服务器上(例如,使用持续集成应用),克隆您应用的git repo。
  2. 运行bundle package --all。这会将所有gem文件和git gem repos复制到./vendor/cache
  3. 运行您需要的任何测试来验证工件是否正常。
  4. tar整个目录(不包括.git)并将其上传到文件服务器。在文件名中添加时间戳,版本号,递增构建号和git commit hash的组合是个好主意。
  5. 部署期间

    1. 将所需的工件tarball下载到应用服务器上。
    2. 将其解压缩到一个目录中。
    3. cd到解压缩的目录。
    4. 运行bundle install --deployment。这将安装来自vendor/cache的宝石,而不需要访问网络。
    5. 请注意,如果构建服务器与生产服务器运行相同的操作系统,则此方法最佳。一些gems具有特定于平台的变体bundle package将下载运行它的平台的gem文件。