12

Bundler确保在部署时确保安装所有正确的宝石。我应该如何在生产中管理我的宝石的二进制依赖关系?

但是,有些宝石依赖于二进制文件(例如Paperclip依赖于ImageMagick,PDFKit依赖于wkhtmltopdf),可能会或可能不会在要部署的系统上安装。

我最近被这两次咬伤,需要找出最好的方法来防止它再次发生。

有没有一种确保安装这些外部二进制文件和库的好方法?捆绑商是否有任何支持?我应该修改我的capistrano部署脚本吗?我是否应该将二进制文件包含在我的存储库中,并确保它们在正确的地方找到它们?

我可以想出几种方法来解决这个问题,但想知道你认为最好的方法,以及为什么。

回答

6

不知道这是否适用于您,但我们使用puppet为此目的。 另一个(类似的)替代品是chef

所以我们所做的是'脚本'我们的机器的设置,但独立于我们的capistrano食谱。 这不完全理想,但它也允许更清晰的分离:我们的系统人/ devops使用puppet,而rails开发人员使用capistrano。

+0

会考虑它 - 我听说过他们,但以前没有任何使用。感谢一个新的想法! – nfm 2011-05-29 23:14:48

12

从我的经验来看,我的服务器是不同平台(OpenSuSe,CentOS和OSX)的同样问题。

我把脚本安装在capistrano脚本上的二进制文件(yum,zypper,apt-get等),使用ruby的system()方法来验证命令的工作。以ImageMagick为例。它是这样的

desc "ImageMagick from source" 
    task :ImageMagick => :prepare do 
    d_url = "ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz" 
    file = "ImageMagick.tar.gz" 
    sh("#{os_installer} install -y ghostscript-devel ghostscript-library libpng-devel libjpg-devel") 
    Dir.chdir('downloads') do 
     sh("wget -O #{file} #{d_url}") 

     raise "ERROR: Unable to download ImageMagick" unless File.exist?(file) 

     sh("tar -xzvf #{file}") 
     unzip_dir = Dir.glob("ImageMagick-*").first 

     Dir.chdir(unzip_dir) do 
     sh("./configure --prefix=/usr --with-x=no --disable-static --with-modules --without-perl --without-magick-plus-plus --with-quantum-depth=8") 
     sh("make") 
     sh("make install") 
     sh("ldconfig") 
     end 

     raise "Unable to find ImageMagick" unless system("convert --version") 
    end 
    end 
+0

谢谢你的好榜样 – nfm 2011-05-29 23:13:39

2

傀儡,你可以说这样的事情在你的清单:

package{'foo': ensure => installed, } # native (like RPM) package providing one of your binaries, installed from a repo 

#then explicitly declare the dependency like this. This will be installed using 'gem install' from the default place used by gem 
package{'my_gem': 
    ensure => installed, 
    require => Package['foo'], 
    provider => 'gem', 
}