2011-09-13 14 views
9

Obtuve el servidor con la configuración anterior.Bundler + RVM + Passenger + Despliegue de Capistrano y gemas perdidas

Esta es la parte importante de mi receta deploy.rb:

$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) 
require 'rvm/capistrano' 
require 'bundler/capistrano' 

set :rvm_ruby_string, 'ruby-1.9.2-p290' 
set :rvm_type, :system 
set :bundle_flags, "--deployment" 

set :default_environment, { 
    'PATH' => ENV['PATH'], 
    'RAILS_ENV' => ENV['RAILS_ENV'] 
} 

set :stages, %w(staging production) 
require 'capistrano/ext/multistage' 

Correr cap staging deploy como es, conduce a un error:

* executing "cd /mnt/data-store/project/releases/shared && 
bundle install --gemfile /mnt/data-store/project/releases/shared/Gemfile 
--path /mnt/data-store/project/shared/bundle --deployment --without development test" 

** [out :: localhost] The --deployment flag requires a Gemfile.lock. 
Please make sure you have checked your Gemfile.lock into version control 
before deploying. 

... rolling back ... 

failed: "env PATH=... RAILS_ENV=staging rvm_path=/usr/local/rvm /usr/local/rvm/bin/rvm-shell 'ruby-1.9.2-p290' -c 'cd /mnt/data-store/project/releases/shared && bundle install --gemfile /mnt/data-store/project/releases/shared/Gemfile --path /mnt/data-store/project/shared/bundle --deployment --without development test'" on localhost 

Gemfile y Gemfile.lock están en el control de código fuente . Ejecuté bundle install localmente primero para generar el archivo .lock. Pero el bundler/capistrano apunta a/mnt/data-store/project/releases/shared/Gemfile así que simplemente copié manualmente ambos archivos allí. Estoy seguro de que lo estoy haciendo mal aquí. Supongo que debería copiarse automáticamente.

implementar ejecuta de nuevo (1) y no falló en el paquete de instalación, que incluso tenía

Your bundle is complete! It was installed into /mnt/data-store/project/shared/bundle en la salida.

PERO, una de mis tareas de límite ejecuta un rastrillo. El resultado de esto es: * No se pudo encontrar bcrypt-ruby-3.0.1 en ninguna de las fuentes * Intente ejecutar bundle install.

Procediendo con mi aventura, descubrí que una vez que tienes .bundle/config con BUNDLE_PATH: /mnt/data-store/project/shared/bundle Funciona. Tenía este directorio, probablemente creado por bundler, bajo /mnt/data-store/releases/shared/, así que lo copié manualmente en la raíz de los raíles.

Ahora, rake/rails c work.

bundle show twitter muestra .../shared/bundle/ruby/1.9.1/gems/twitter-1.7.1.

PERO, la redistribución me lleva de vuelta a (1), porque el directorio .bundle no está allí.

preguntas de hormigón:

  1. ¿Es necesario crear/copia .bundle/config manualmente?
  2. ¿Debo copiar Gemfile/Gemfile.lock manualmente al directorio compartido? ¿Qué pasa si agrego gemas? ¿Debo tener dos copias o sincronizarlas manual o programáticamente?
  3. ¿QUÉ ESTOY HACIENDO EQUIVOCADO?

¡Gracias!

Respuesta

5

mirada a esta parte en el archivo deployment.rb (código Bündler)

args = ["--gemfile #{File.join(context.fetch(:current_release), bundle_gemfile)}"] 
args << "--path #{bundle_dir}" unless bundle_dir.to_s.empty? 

Hay una clave llamada :current_release, esta clave es probable que no se ajusta correctamente con Capistrano por alguna razón.

la :current_release en bundler apuntará a la carpeta "compartida" en lugar de la versión más reciente (con la marca de tiempo)

Esto se está poniendo ejecutado el before 'deploy:finalize_update'.

Lo que haría para arreglar esto es agregar tu propio gancho a este evento.

before 'deploy:finalize_update', 'x:set_current_release' 

Y este es el método real

task :set_current_release, :roles => :app do 
   set :current_release, latest_release 
end 
+1

Gracias! Todavía no entiendo por qué 'current_release' apunta a la ruta compartida en lugar de a la versión real. – elado

0

error

The --deployment flag requires a Gemfile.lock. Please make sure you have checked your Gemfile.lock into version control before deploying. 

ocurre cuando hay algo dentro de su directorio unwantend comunicados en el servidor. Solo debe haber directorios con versiones anteriores de su aplicación (sus nombres comienzan con una fecha similar a 20111025125442).

Por lo tanto, elimine los directorios o archivos no deseados y luego intente implementar de nuevo.

+0

Esto fue todo para mí. ¡Gracias! –

+0

Recibí este error sin otros directorios dentro de la carpeta de lanzamientos ... – aardvarkk

Cuestiones relacionadas