2017-02-12 8 views
2

私はユニットコントロールファイルをソース管理(例えばconfig)のままにしておきます。カピストラノ展開後にユニットはsystemdディレクトリにコピーされ、サービス(例えばpuma)は再起動してください。これを達成する最良の方法は何でしょうか?Capistranoとsystemdのインテグレーション

私は単にあなたがあなたの例で説明した内容のようなものが動作するように(未テストコード)としてa post-deploy task

namespace :deploy do 
[...] 

    before :published, :systemd 
    desc 'systemd' 
    task :systemd do 
    on roles(:web), in: :groups, limit: 3, wait: 10 do 
     within release_path do 
     execute "sudo cp config/puma.service /etc/systemd/system/puma.service" 
     execute "sudo cp config/puma-init /usr/bin/puma-init" 
     execute "sudo systemctl daemon-reload" 
     execute "sudo systemctl restart puma" 
     end 
    end 
    end 
end 

答えて

0

を追加すると思ってきました。代わりに、私が行ったことはシンボリックリンクを作成することです。

これを行うには、サービスファイルをレポのconfig/systemd/に移動することをおすすめします。一度デプロイし、ln -s $CURRENT_PATH/config/systemd/ /etc/systemd/system/myappのようにサーバー上にシンボリックリンクを作成します。今すぐデプロイすると、symlinkが指し示すパスが変更され(Capistranoがcurrentシンボリックリンクを管理しているため)、プロセスを再起動するだけです。

+0

ありがとうございます、あなたの仕事のための完全なコードを共有できますか?私はシンボリックリンクに問題があることを思い出しますが、最近のバージョンではおそらく解決されました。 – dimid

1

これが動作しているようですが、よりエレガントな解決策が

namespace :deploy do 
    [...] 

    before :published, :systemd 
    desc 'systemd integration' 
    task :systemd do 
    on roles(:web), in: :groups, limit: 3, wait: 10 do 
     within shared_path do 
     execute "sudo cp #{shared_path}/config/puma.service /etc/systemd/system/puma.service" 
     execute "sudo cp #{shared_path}/config/puma-init /usr/bin/puma-init" 
     execute "sudo systemctl daemon-reload" 
     execute "sudo systemctl restart puma" 
     end 
    end 
    end 
end 

もあります場合、私はまだあなたがそうでなければsudoが動作しません

set :pty, true 

する必要があることに注意して、疑問に思います。

関連する問題