2016-05-30 1 views
1

Я пытаюсь реализовать непрерывную процедуру развертывания с использованием github webhooks и capistrano.скрипт оболочки оболочки capistrano терпит неудачу при выполнении через github webhook

Мой план состоит в том, чтобы поместить мою задачу capistrano rake в сценарий оболочки и вызвать ее из действия контроллера в другом проекте рельсов, который является веб-узлом github.

Вот сценарий оболочки (wallet_deploy.sh)

#!/bin/bash 
cd $HOME/work/wallet 
bundle exec cap production deploy > wallet_deploy_log 2>&1 

Вот лог

/home/deploy/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/bundler-1.11.2/lib/bundler/rubygems_integration.rb:304:in `block in replace_gem': capistrano is not part of the bundle. Add it to Gemfile. (Gem::LoadError) 
    from /home/deploy/.rbenv/versions/2.2.4/bin/cap:22:in `<main>' 

Здесь действие контроллер

def release_request 
    system("./wallet_deploy.sh") 
    #DeployWorker.perform_async // tried using a worker too with no success 

    render :text => params.to_s 
end 

развертывания Cap отлично работает, когда я выполнить его вручную в корпусе

[email protected]:~/apps/ci/current$ ./wallet_deploy.sh 

Не знаете, что я делаю неправильно, и существует ли другой подход к реализации этого?

ответ

0

Приложение Rails, которое прослушивает webhook, уже имеет собственную среду Bundler. Когда вы пытаетесь выложить свой сценарий с помощью system, скрипт наследует текущую среду Bundler. Вероятно, именно поэтому вы получаете ошибку «capistrano is not part of the bundle».

Для обеспечения свежей среды Bundler используется для сценария, попробуйте следующее:

Bundler.with_clean_env do 
    system("./wallet_deploy.sh") 
end 

От Bundler-х bundle execdocumentation:

Любой код рубин, который открывает подоболочку (как системы, обратные кавычки, или% x {}) автоматически будет использовать текущую среду Bundler. Если вам нужно выложить команду Ruby, которая не является частью вашего текущего пакета, используйте метод with_clean_env с блоком.

И:

Использование with_clean_env также необходим, если вы выкладывая на другую связку. Любые команды Bundler, запущенные в подоболочке, наследуют текущий Gemfile, поэтому команды, которые нужно запускать в контексте другого пакета, также должны использовать with_clean_env.

+0

Спасибо! Это сработало –

+0

@SharnJayantha вы могли бы пометить ответ как принятый, тогда? благодаря –

Смежные вопросы