2017-02-12 64 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将无法​​正常工作。