2010-09-17 20 views
52

Ho un'app Rails 3 di base che funziona localmente nella mia casella di sviluppo, ma voglio testare la distribuzione in anticipo per assicurarmi che tutto funzioni. Sto usando Capistrano per la distribuzione.Rails 3 - Errori Bundler/Capistrano

Quando eseguo cap deploy (dopo tutte le altre impostazioni necessarie), si rompe su questo comando con questo errore:

[...] 
* executing 'bundle:install' 
* executing "bundle install --gemfile /var/www/trex/releases/20100917172521/Gemfile --path /var/www/trex/shared/bundle --deployment --quiet --without development test" 

servers: ["www.[my domain].com"] 
[www.[my domain].com] executing command 
** [out :: www.[my domain].com] sh: bundle: command not found 
command finished 
[...] 

Quindi sembra che non riesce a trovare il comando bundle sul server.

Tuttavia, quando accedo al server ...

$ ruby -v 
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux] 
$ rails -v 
Rails 3.0.0 
$ bundle -v 
Bundler version 1.0.0 

... le bundle comando funziona bene.

Cosa potrebbe andare storto?

-

(Inoltre, per completezza :)

$ which ruby 
~/.rvm/rubies/ruby-1.9.2-p0/bin/ruby 
$ which rails 
~/.rvm/gems/ruby-1.9.2-p0/bin/rails 
$ which bundle 
~/.rvm/gems/ruby-1.9.2-p0/bin/bundle 

risposta

89

UPDATE:

Per RVM> = 1.11.3, si dovrebbe ora basta usare il rvm-capistrano gem. Per i vecchi RVM> = 1.0.1, la risposta di seguito si applica ancora.


RISPOSTA ORIGINALE:

Va bene, anche se ho ancora non ho ottenuto una piena cap deploy al lavoro, ho fatto correggere questo problema. Il problema era Capistrano che cercava di utilizzare un percorso diverso per Bundler (e altre gemme) rispetto ai percorsi RVM.

Controlla il tuo percorso Capistrano facendo cap shell, quindi echo $PATH. Probabilmente vedrete il vostro standard /usr/local/bin e /usr/bin, ma quello non è dove RVM ha Bundler, e altri, memorizzati.

Modificare il file Capistrano config/deploy.rb, e aggiungere le seguenti righe, per these instructions:

# Add RVM's lib directory to the load path. 
$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) 

# Load RVM's capistrano plugin.  
require "rvm/capistrano" 

set :rvm_ruby_string, '1.9.2' 
set :rvm_type, :user # Don't use system-wide RVM 

Che finalmente Capistrano per vedere Bundler e iniziare gemme di carico in modo appropriato.

+1

ho sistema installato rvm ampio e la distribuzione con l'utente locale. Per farlo funzionare devo essere sicuro che l'utente da cui sto distribuendo ha impostato correttamente il rvm. La risoluzione dei problemi .bashrc descritta http://rvm.beginrescueend.com/rvm/install/ qui ha aiutato –

+1

Forse ti troverai qui se proverai ad aggiornare l'integrazione di rvm capistrano da quanto elencato qui: http: // ariejan. net/2011/09/14/lighting-fast-zero-downtime-deployments-with-git-capistrano-nginx-and-unicorn? utm_source = rubyweekly & utm_medium = email al nuovo approccio menzionato in questa risposta. Se rimuovi le linee 'default_environment' assicurati di rimuovere anche' default_run_options [: shell] = 'bash'' altrimenti non avresti ancora rvm sulla shell capistrano. –

+0

Questo non funziona per me. Funziona solo: set: bundle_cmd, 'source $ HOME/.bash_profile && bundle' – hipertracker

7

L'ultima riga dovrebbe essere in realtà

set :rvm_type, :user 

che è, l'utente deve essere un simbolo e non una variabile, altrimenti si otterrà

undefined local variable or method `user' 
+1

Hai assolutamente ragione. La risposta è aggiornata –

2

Era la mia comprensione che il comando bundle non è stato trovato perché la variabile PATH, definita nel ~/.bash_profile dell'utente, non è caricata da Capistrano.

Per aggirare questo ho creato un compito: bundle_gems.

task :bundle_gems do 
    run "cd #{deploy_to}/current && export PATH=/usr/local/pgsql/bin:/opt/ruby-enterprise-X.X.X/bin:$PATH && bundle install vendor/gems" 
end 

Nota che includo anche il percorso a binari PostgreSQL - l'installazione della gemma pg stava fallendo perché non potevano essere trovati, anche se potrebbe essere trovato fascio.

Questo sembra un approccio disordinato, però. Presumibilmente esiste un luogo più "globale" per definire percorsi ai binari che non conosco.

Aggiornamento 23/12

Per aggiungere una directory a $ PATH per tutti gli utenti: https://serverfault.com/questions/102932/adding-a-directory-to-path-in-centos

Tuttavia, questo ancora non verrà caricato perché è una shell non di login non interattivo.

Un suggerimento è stato quello di aggiungere i percorsi a/etc/bashrc: How do I set $PATH such that `ssh [email protected] command` works?

Tuttavia anche questo non ha funzionato per me. Credo che sia perché SSH non carica/etc/bashrc neanche.

Un altro suggerimento era di modificare ~/.ssh/environment: http://www.ruby-forum.com/topic/79248. Tuttavia questo sembra quasi disordinato come specificare i percorsi in deploy.rb.

26

Bundler non trovato perché .bash_profile non viene caricato e quindi il PATH è errato. Questo probabilmente perché hai lo script RVM in .bash_profile.

La semplice risposta è spostare lo script RVM da .bash_profile in .bashrc e Capistrano dovrebbe essere in grado di trovarlo (verificare anche che .bash_profile sources .bashrc).

Capistrano utilizza SSH per eseguire comandi sul server tramite non-interactive shell. Questa sessione shell sarà source .bashrc but not .bash_profile. Ho aggiunto un'istruzione ECHO ad entrambi e ho eseguito un LS via SSH. Si può vedere nei risultati qui sotto che solo .bashrc è di provenienza:

$ ssh [email protected] ls 
.bashrc loaded 
git 
file1 
file2 
+0

È buona prassi procurarsi sempre il tuo '.bash_profile' dal tuo' .bashrc'? In questo modo il tuo '.bash_profile' viene sempre prelevato indipendentemente dal fatto che si tratti di una shell interattiva o non interattiva – user2490003

7

No rvm/capistrano ha lavorato per me. La soluzione migliore che ho trovato è stata aggiunta al file di deploy.rb la seguente riga (è per RVM non a livello di sistema):

set :bundle_cmd, 'source $HOME/.bash_profile && bundle'

+4

Hm ... ricevendo ora un errore 'sh: source: not found'. – Vivek

11

ho avuto un problema identico con rbenv. La soluzione era prendere le linee specifiche di rbenv dal fondo del mio file .bashrc e metterle in cima. La prima riga del mio file .bashrc restituiva un'interruzione se la shell non era in esecuzione in modalità interattiva.

0

Ho provato un numero di suggerimenti. Ha avuto problemi con l'impostazione dei percorsi nel file deploy.rb per l'ambiente RVM. La mia soluzione finale era quello di includere le seguenti:

nel file di configurazione/deploy.rb aggiuntivo:

require "bundler/capistrano" 

anche in config/deploy.rb, o nel mio caso config/production.rb com'ero utilizzando l'opzione a più stadi per Capistrano

after "deploy", "rvm:trust_rvmrc" 

Questo passaggio assicura semplicemente che smettiamo di ottenere il 'vuoi fiducia il file .rvmrc' e chiama un compito nel deploy.file di RB come ad esempio:

namespace :rvm do 
    task :trust_rvmrc do 
     run "rvm rvmrc trust #{release_path}" 
    end 
end 

Dopo aver messo in queste lievi modifiche sono stato in grado di eseguire cap production deploy che ha verificato il codice; ha eseguito la distribuzione della pipeline di asset, ha collegato la cartella di rilascio all'attuale, eseguito bundle install e pulito.

1

Questo ha funzionato per me:

set: bundle_cmd, 'sorgente $ HOME/.bash_profile & & fascio'