2017-02-12 103 views
2

我想保留我的單元文件在源代碼管理中(例如在config),這樣在部署capistrano之後,該單元將被複制到systemd目錄中,服務(例如puma)將重新啓動。什麼是實現這一目標的最佳方式?Capistrano和系統集成

我想簡單地增加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。現在,當您部署時,符號鏈接指向的路徑將會更改(由於Capistrano受管理的current符號鏈接),您只需重新啓動進程即可。

+0

謝謝,你能分享完整的代碼爲你的任務?我記得systemd在符號鏈接方面存在問題,但也許在最近的版本中已經解決了。 – 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 

,請注意,你需要

set :pty, true 

否則sudo將無法​​正常工作。