2016-05-30 9 views
1

github webhooksとcapistranoを使用して継続的なデプロイメントルーチンを実装しようとしています。github webhookで実行するとcapistranoデプロイメントシェルスクリプトが失敗する

私の計画では、capistrano rakeタスクをシェルスクリプトに入れ、github webhookである別のrailsプロジェクトのコントローラアクションから呼び出します。ここで

は、シェルスクリプト(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 

キャップの展開が完全に動作しているされていますシェル内で手動で実行する

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

私は何が間違っているのか分かりませんし、これを実装する別のアプローチがありますか?

答えて

0

webhookをリッスンしているあなたのRailsアプリケーションは、すでに独自のBundler環境を持っています。 systemを使用してスクリプトにシェルすると、そのスクリプトは現在のBundler環境を継承します。これはたぶん、あなたが "カピストラーノはバンドルの一部ではありません"というエラーを起こしている理由です。バンドラーのbundle execdocumentationから

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

:これを試して、新鮮なバンドラー環境はスクリプトに使用されていることを確認する

システムのようなサブシェル(、バッククォートを開き、任意のRubyコードを、または%x {})は現在のBundler環境を自動的に使用します。現在のバンドルの一部ではないRubyコマンドにシェルする必要がある場合は、with_clean_envメソッドをブロックとともに使用してください。

そして:あなたは別のバンドルに砲撃されている場合with_clean_envを使用して

も必要です。サブシェルで実行されるBundlerコマンドは現在のGemfileを継承するので、別のバンドルのコンテキストで実行する必要があるコマンドもwith_clean_envを使用する必要があります。

+0

ありがとうございました!それは働いた –

+0

@SharnJayanthaはあなたが受け入れられたとして答えをマークできますか?ありがとう –

関連する問題