Инициализировать rbenv и запустить скрипт ruby ​​из скрипта оболочки

Инициализировать rbenv и запустить скрипт ruby ​​из скрипта оболочки

Я хочу, чтобы svnserve запускал хук предварительной фиксации, написанный на ruby. Поскольку svnserve запускается от имени пользователя root, он ничего не знает об установке rbenv пользователя.

Я установил софт ссылку / usr / bin / ruby ​​-> /home/admin/.rbenv/shims/ruby. В результате, когда я пытаюсь

#!/usr/bin/ruby
puts "Pre-commit hook!"

Он показывает ошибку:

Transmitting file data .svn: Commit failed (details follow):
svn: Commit blocked by pre-commit hook (exit code 255) with no output.

Когда я запускаю вручную на сервере:

admin $ sudo ./pre-commit
/usr/bin/ruby: line 4: exec: rbenv: not found

Итак, я предполагаю, что инициализация rbenv необходима, но как?


person sadfuzzy    schedule 20.11.2012    source источник


Ответы (2)


В пути крючков:

предварительная фиксация:

#!/bin/bash
export HOME=/home/user
if [ -d $HOME/.rbenv ]; then
  export PATH="$HOME/.rbenv/shims:$PATH"
  eval "$(rbenv init -)"
fi
$0.rb $*

pre-commit.rb:

#!/usr/bin/env ruby
ARGV.each_with_index { |arg, index| puts "Index #{index}: Argument #{arg}" }
person sadfuzzy    schedule 21.11.2012
comment
Текущие версии rbenv используют $HOME/.rbenv/shims вместо $HOME/.rbenv/bin. В остальном сценарий sadfuzzy все еще хорош. - person seren; 19.01.2017

вы должны инициализировать rbenv перед его использованием.

/path/to/user/home/.rbenv/bin/rbenv init

затем установите глобальную версию ruby:

rbenv global DESIRED-RUBY-VERSION

или локально:

rbenv local DESIRED-RUBY-VERSION

или на оболочку:

rbenv shell DESIRED-RUBY-VERSION

хотя не уверен, что настройка оболочки будет работать без tty.

так что вы можете создать сценарий оболочки pre-commit.sh и зарегистрировать его как ловушку svn.

внутри него инициализируйте rbenv и вызовите ваш pre-commit.rb файл

person Community    schedule 20.11.2012
comment
Ну я знаю :) а как это сделать в одном скрипте (он называется subversion)? - person sadfuzzy; 20.11.2012
comment
Я думаю, ваш хук должен быть сценарием оболочки, который сначала инициализирует rbenv, а затем вызывает сценарий ruby? - person ; 20.11.2012
comment
Вы совершенно правы! Я хочу инициализировать и запустить код Ruby из скрипта. - person sadfuzzy; 20.11.2012
comment
+1 за это. У меня была аналогичная проблема, и в итоге я создал 2 сценария - hook.sh, который инициализирует rbenv и вызывает мой второй сценарий - hook.rb - person James Evans; 20.11.2012
comment
Как мне передать параметры в скрипт ruby ​​из хука перед фиксацией, который инициализирует rbenv? - person sadfuzzy; 21.11.2012
comment
@sadfuzzy, как выглядят ваши параметры? вы можете передать их как аргументы - pre-commit.rb "arg1" "arg2" "etc" и прочитать их $* в вашем скрипте ruby. обратите внимание на кавычки вокруг аргументов, они используются для обработки случая, когда ваши аргументы содержат пробелы - person ; 21.11.2012
comment
Спасибо! Я еще это нашел. Вот решение: pre-commit: #!/bin/bash export HOME=/home/user if [ -d $HOME/.rbenv ]; then export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)" fi $0.rb $* pre-commit.rb: #!/usr/bin/env ruby ARGV.each_with_index { |arg, index| puts "Index #{index}: Argument #{arg}" } - person sadfuzzy; 21.11.2012