【问题标题】:Capistrano and systemd integrationCapistrano 和系统集成
【发布时间】:2017-02-12 19:20:31
【问题描述】:

我想将我的单元文件保存在源代码控制中(例如 config),这样在 capistrano 部署后,单元将被复制到 systemd 目录,并且服务(例如 puma)将被重新启动。实现这一目标的最佳方法是什么?

我想过简单地添加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

【问题讨论】:

    标签: deployment capistrano capistrano3 systemd


    【解决方案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 将不起作用。

    【讨论】:

      【解决方案2】:

      类似于您在示例中描述的内容将起作用。作为替代方案,我所做的是创建一个符号链接。

      为此,我建议将您的服务文件移动到您的存储库中的 config/systemd/ 之类的位置。部署一次,然后在服务器上创建一个符号链接,如ln -s $CURRENT_PATH/config/systemd/ /etc/systemd/system/myapp。现在,当您部署时,符号链接指向的路径将发生变化(由于 Capistrano 管理的 current 符号链接),您只需重新启动进程即可。

      【讨论】:

      • 谢谢,你能分享你的任务的完整代码吗?我记得 systemd 存在符号链接问题,但也许在最近的版本中已解决。
      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2011-05-27
      相关资源
      最近更新 更多