Подтвердить что ты не робот

Как мне управлять бинарными зависимостями для моих драгоценных камней в производстве?

Bundler делает огромную работу по обеспечению того, чтобы все нужные драгоценные камни были установлены при развертывании.

Однако некоторые драгоценные камни зависят от двоичных файлов (например, Paperclip зависит от ImageMagick, PDFKit зависит от wkhtmltopdf), которые могут быть установлены или не установлены на развертываемой системе.

Я недавно был укушен этим дважды, и мне нужно выяснить, как лучше это предотвратить.

Есть ли хороший способ гарантировать, что эти внешние двоичные файлы и библиотеки установлены? У поставщика есть какая-либо поддержка? Должен ли я просто изменить развертывание capistrano script? Должен ли я включать двоичные файлы в мой репозиторий и убедиться, что драгоценные камни ищут их в нужном месте?

Я могу придумать несколько способов подойти к этой проблеме, но хочу знать, что вы считаете лучшим, и почему.

4b9b3361

Ответ 1

Не уверен, что это применимо для вас, но мы используем puppet для этой цели. Другой (аналогичный) вариант - шеф-повар.

Итак, мы делаем "script" настройку наших машин, но независимо от наших рецептов capistrano. Это не совсем идеально, но это также позволяет более чистое разделение: наши ребята/декомплекторы систем используют марионетку, а разработчики рельсов используют capistrano.

Ответ 2

Из моего опыта та же проблема с вами, где мои серверы - это разностные платформы (OpenSuSe, CentOS и OSX).

Я установил script для установки двоичных файлов (yum, zypper, apt-get и т.д.) в capistrano script, для проверки работы команды используйте метод 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 

Ответ 3

С помощью 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',
}