2016-05-30 9 views
1

Ich versuche eine kontinuierliche Deployment-Routine mit github Webhooks und capistrano zu implementieren.capistrano Deployment-Shell-Skript schlägt fehl, wenn es durch github webhook ausgeführt wird

Mein Plan ist es, meine Capistrano-Rake-Aufgabe in ein Shell-Skript zu schreiben und sie von einer Controller-Aktion in einem anderen Rails-Projekt aufzurufen, das ist der Github-Webhook. Hier

ist das Shell-Skript (wallet_deploy.sh)

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

Hier ist das Protokoll

/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>' 

Hier wird die Controller-Aktion

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 Einsatz funktioniert perfekt, wenn i Führen Sie es manuell in der Shell

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

Nicht sicher, was ich falsch mache und gibt es einen anderen Ansatz, dies zu implementieren?

Antwort

0

Ihre Rails-App, die auf den Webhook wartet, hat bereits eine eigene Bundler-Umgebung. Wenn Sie versuchen, Ihr Skript mithilfe von system zu erweitern, erbt das Skript diese aktuelle Bundler-Umgebung. Dies ist wahrscheinlich, warum Sie einen Fehler "capistrano ist nicht Teil des Bündels" bekommen.

eine frische Bündler-Umgebung für Ihr Skript, versuchen Sie dies verwendet, um sicherzustellen, dass:

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

Von Bündler der bundle execdocumentation:

Jeder, der eine Subshell Ruby-Code (wie System öffnet, Backticks, oder% x {}) verwendet automatisch die aktuelle Bundler-Umgebung. Wenn Sie einen Ruby-Befehl verwenden müssen, der nicht Teil Ihres aktuellen Pakets ist, verwenden Sie die Methode "with_clean_env" mit einem Block.

Und:

with_clean_env Verwendung ist auch notwendig, wenn Sie zu einem anderen Bündel Beschuss aus sind. Alle Bundler-Befehle, die in einer Subshell ausgeführt werden, erben die aktuelle Gemdatei, sodass Befehle, die im Kontext eines anderen Bundles ausgeführt werden müssen, auch with_clean_env verwenden müssen.

+0

Vielen Dank! Es hat funktioniert –

+0

@SharnJayantha könnten Sie die Antwort als akzeptiert markieren, dann? Vielen Dank –