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