Bundler做了一项非常棒的工作,确保在部署时安装所有正确的宝石。
但是,有些宝石依赖于二进制文件(例如Paperclip依赖于ImageMagick,PDFKit依赖于wkhtmltopdf),可能会也可能不会安装在正在部署的系统上。
我最近被这两次咬过,需要找出防止它再次发生的最佳方法。
有没有一种方法可以确保安装这些外部二进制文件和库?捆绑商是否有任何支持?我应该修改我的capistrano部署脚本吗?我应该在我的存储库中包含二进制文件,并确保宝石在正确的位置查找它们吗?
我可以想办法解决这个问题,但想知道你认为最有效的方法,以及原因。
答案 0 :(得分: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
答案 1 :(得分:6)
不确定这是否适用于您,但我们会将puppet用于此目的。 另一个(类似的)替代方案是chef。
所以我们所做的是'脚本'我们机器的设置,但独立于我们的capistrano配方。 它不是完全理想的,但它也允许更清晰的分离:我们的系统人员/ devops使用木偶,铁轨开发人员使用capistrano。
答案 2 :(得分:2)
使用Puppet,您可以在清单中说出类似的内容:
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',
}