Ruby gems não reconhecidas no script bash

0

Eu criei um aplicativo node.js que escuta os webhooks. Atualmente ele é usado para construir um site jekyll.

Eu o configurei no meu servidor e jekyll build funciona perfeitamente quando eu o executo na raiz do meu site jekyll (que está enviando os ganchos). Quando executo o aplicativo node.js sobre o ssh em um shell, tudo funciona bem quando um git hook é acionado.

No entanto, quando o aplicativo node.js é executado a partir de um script upstart (mostrado abaixo), não parece encontrar as gemas. Ele continua pedindo dependências que eu tenho certeza que instalei (globalmente e também para meu usuário).

Dentro do script, coloquei echo'which jekyll' e isso mostra que, de fato, está apontando para o jekyll bin: /home/christophe/.gem/ruby/2.0.0/bin/jekyll instalado localmente. Mas logo abaixo que eu executo o comando jekyll e ele falha:

/usr/lib/ruby/2.0.0/rubygems/dependency.rb:296:in 'to_specs': Could not find 'jekyll' (>= 0) among 31 total gem(s) (Gem::LoadError)
    from /usr/lib/ruby/2.0.0/rubygems/dependency.rb:307:in 'to_spec'
    from /usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_gem.rb:47:in 'gem'
    from /home/christophe/.gem/ruby/2.0.0/bin/jekyll:22:in '<main>'

Como posso executar este script bash para executar corretamente o jekyll?

Upstart

# /etc/init/libservice.conf
# Task to automatically start the library service.

author "Christophe De Troyer"
description "Run the githook for the blog."

# Path of the configuration files
env PROJ="/home/christophe/jekyll-builder"

# Configure to run as 'christophe'
setuid christophe
setgid christophe

script
    export PATH=/home/christophe/.gem/ruby/2.0.0/bin:$PATH
    cd $PROJ
    gulp run
end script    

start on startup
#Respawn the process if it crashes
#If it respawns more than 10 times in 5 seconds stop
respawn limit 10 5

Construir script

#!/bin/bash                                            

########################                               
# Parameters from Node #                               
########################                               

giturl=$1                                              
reponame=$2                                            
branch=$3                                              
ownermail=$4                                           
reporoot=$5                                            
htmlsink=$6                                            
www=$7                                                 

##########                                             
# Script #                                             
##########                                             

# Check to see if reponame exists. If not, git clone it
if [ ! -d $reporoot ]; then                            
    mkdir -p $reporoot                                 
    git clone $giturl $reporoot                        
fi                                                     

# Checkout and pull branch.                            
cd $reporoot                                           
git checkout $branch                                   
git pull origin $branch                                
cd -                                                   


echo 'which jekyll' 
jekyll # fails                                   
# Run jekyll                                           
jekyll build -s $reporoot -d $htmlsink    # fails too

Atualização:

gem env quando conectado como usuário:

    RubyGems Environment:
  - RUBYGEMS VERSION: 2.0.14
  - RUBY VERSION: 2.0.0 (2014-01-12 patchlevel 384) [x86_64-linux-gnu]
  - INSTALLATION DIRECTORY: /var/lib/gems/2.0.0
  - RUBY EXECUTABLE: /usr/bin/ruby2.0
  - EXECUTABLE DIRECTORY: /usr/local/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /var/lib/gems/2.0.0
     - /home/christophe/.gem/ruby/2.0.0
     - /usr/share/rubygems-integration/2.0.0
     - /usr/share/rubygems-integration/all
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/

gem env de dentro do script, executado a partir do aplicativo node.js em execução por meio do upstart, fornece:

RubyGems Environment:
  - RUBYGEMS VERSION: 2.0.14
  - RUBY VERSION: 2.0.0 (2014-01-12 patchlevel 384) [x86_64-linux-gnu]
  - INSTALLATION DIRECTORY: /var/lib/gems/2.0.0
  - RUBY EXECUTABLE: /usr/bin/ruby2.0
  - EXECUTABLE DIRECTORY: /usr/local/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /var/lib/gems/2.0.0
     - /.gem/ruby/2.0.0
     - /usr/share/rubygems-integration/2.0.0
     - /usr/share/rubygems-integration/all
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/

Observe que GEM_PATHS não possui o prefixo do diretório inicial na segunda entrada. Eu tentei resolver isso colocando env GEM_PATH="/home/christophe/.gem/ruby/2.0.0" no script inicial, mas isso não alterou nada.

No entretanto, resolvi-o colocando uma lista de deps manualmente como root. No entanto, não acho que essa seja uma boa abordagem, já que o upstart está sendo executado explicitamente como meu usuário. E, em segundo lugar, este software precisa ser executado em um servidor em que não tenho permissões de root. Então, eu ainda gostaria de saber uma correção.

sudo gem install jekyll
sudo gem install jekyll-gist
sudo gem install jekyll-cite
sudo gem install jekyll-scholar
sudo gem install addressable -v 2.3.5
sudo gem install yajl-ruby -v 1.2.0
sudo gem install pygments.rb
sudo gem install posix-spawn
    
por Christophe De Troyer 08.01.2016 / 16:27

2 respostas

0

Você tentou definir o ambiente GEM_HOME ? Consegui pelo menos obter um serviço iniciante listando um diretório de instalação personalizado por meio de algo como:

cd
gem install rake --install-dir grepable

E, em seguida, usando um /etc/init/footest.conf service de:

author "Nobody"
description "Echo some details"

env GEM_HOME="/home/jdoe/grepable"

setuid jdoe
setgid jdoe

script
    /usr/bin/gem environment
end script    

start on startup
respawn limit 10 5

E depois de um reinício,

# fgrep -1 grep /var/log/upstart/footest.log
  - RUBY VERSION: 1.9.3 (2013-11-22 patchlevel 484) [x86_64-linux]
  - INSTALLATION DIRECTORY: /home/jdoe/grepable
  - RUBY EXECUTABLE: /usr/bin/ruby1.9.1
  - EXECUTABLE DIRECTORY: /home/jdoe/grepable/bin
  - RUBYGEMS PLATFORMS:
--
  - GEM PATHS:
     - /home/jdoe/grepable
     - /.gem/ruby/1.9.1

Para um serviço de produção, presumivelmente, usaríamos um --install-dir / GEM_HOME de algum lugar adequado não no espaço do fornecedor nem em seu diretório inicial.

    
por 08.01.2016 / 19:37
0

Depois de algumas horas de agonia, eu finalmente consertei.

O truque era definir o PATH para: /home/cdetroye/.rbenv/shims:/home/cdetroye/.rbenv/bin:/usr/local/bin:/usr/bin:/bin .

# /etc/init/libservice.conf
# Task to automatically start the library service.

author "Christophe De Troyer"
description "Run the githook for the blog."

# Path of the configuration files

env PATH=/home/cdetroye/.rbenv/shims:/home/cdetroye/.rbenv/bin:/usr/local/bin:/usr/bin:/bin

# Configure to run as 'christophe'
setuid cdetroye
setgid cdetroye

script
    cd $PROJ
    gulp run
end script    

start on startup
#Respawn the process if it crashes
#If it respawns more than 10 times in 5 seconds stop
respawn limit 10 5
    
por 08.01.2016 / 19:51