12

Bundler hace un trabajo increíble al asegurarse de que estén instaladas todas las gemas correctas.¿Cómo debo gestionar las dependencias binarias para mis gemas en producción?

Sin embargo, algunas gemas dependen de los binarios (por ejemplo, Paperclip depende de ImageMagick, PDFKit depende de wkhtmltopdf) que pueden o no estar instalados en el sistema que se está implementando.

Me ha picado esto dos veces recientemente y necesito encontrar la mejor manera de evitar que vuelva a suceder.

¿Hay una buena manera de garantizar que estos binarios externos y bibliotecas estén instalados? ¿Tiene bundler algún soporte para ello? ¿Debo simplemente modificar mi script de implementación capistrano? ¿Debo incluir los binarios en mi repositorio y asegurarme de que las gemas los busquen en el lugar correcto?

Se me ocurren algunas formas de abordar este problema, pero quiero saber qué es lo que cree que funciona mejor y por qué.

Respuesta

6

No estoy seguro si esto es aplicable para usted, pero nosotros usamos puppet para este propósito. Otra alternativa (similar) es chef.

Entonces, lo que hacemos es 'guiar' la configuración de nuestras máquinas, pero independientemente de nuestras recetas capistrano. No es completamente ideal, pero también permite una separación más limpia: nuestros sistemas chicos/devops usan marionetas, y los desarrolladores de rieles usan capistrano.

+0

Se verá en él - He oído hablar de ellos, pero no he usado antes. Gracias por una nueva idea! – nfm

12

Desde mi experiencia el mismo problema con usted, donde mis servidores son plataformas de diferencia (OpenSuSe, CentOS y OSX).

Puse la secuencia de comandos para instalar binario (yum, zypper, apt-get, etc.) en el script capistrano, use el método de sistema de ruby ​​() para verificar que el comando funcione. en tu ejemplo de ImageMagick. Es algo como esto

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

Gracias por el buen ejemplo – nfm

2

Con Títeres, se podría decir algo como esto en su manifiesto:

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', 
} 
Cuestiones relacionadas