2017-02-12 26 views
2

Я хотел бы сохранить файлы своих модулей в исходном контроле (например, в config), так что после развертывания capistrano устройство будет скопировано в каталог 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. Теперь, когда вы развертываете, путь, на который указывает ссылка на символическую ссылку, изменится (из-за связанной с 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 не будет работать.