【问题标题】:Capistrano 3 - Understand tasksCapistrano 3 - 了解任务
【发布时间】:2013-11-17 13:05:26
【问题描述】:

我试图了解 capistrano 3.1 是如何工作的,但由于它缺乏文档(它的 capistrano,所以......),我的理解低于我的理解。

让我解释一下。

这是从 capistrano/rails gem 中提取的 sn-p

namespace :deploy do

  desc 'Runs rake db:migrate if migrations are set'
  task :migrate => [:set_rails_env] do
    on primary fetch(:migration_role) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, "db:migrate"
        end
      end
    end
  end

  #[...]
end

当执行cap integration deploy:migrate时,它会发送以下命令: cd /srv/app/releases/20131106101722 && ( RAILS_ENV=integration /tmp/app/rvm-auto.sh . rake assets:precompile )

我将为delayed_job 提供的(非工作)代码稍微更改为该代码

namespace :delayed_job do
  def args
    fetch(:delayed_job_args, '')
  end

  def delayed_job_roles
    fetch(:delayed_job_server_role, :app)
  end

  def delayed_job_bin
    fetch(:delayed_job_bin, :'bin/delayed_job')
  end

  desc 'Restart the delayed_job process'
  task :restart do
    on roles(delayed_job_roles) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute delayed_job_bin, 'restart', args
        end
      end
    end
  end
end

我得到以下命令cd /srv/winddle/current && ( RAILS_ENV=integration bin/delayed_job restart )

显然,它错过了bundle exec 命令。 我深入研究了 capistrano/bundler 和 capistrano/rails 以寻找某种可以自动将 bundle exec 添加到任何这些命令(或强制注册 ssh kits 命令)但找不到任何钩子。

我找到的唯一解决方案是使用 execute :bundle, :exec, delayed_job_bin, :start, args 这当然是不可接受的。

欢迎任何适当的解决方案/解释。 问候

【问题讨论】:

    标签: ruby-on-rails ruby delayed-job capistrano3


    【解决方案1】:

    deploy.rb 中添加以下行,然后使用the code provided by delayed_job,而不是将script 更改为bin,我看到你已经这样做了:

    set :bundle_bins, fetch(:bundle_bins, []).push('bin/delayed_job')
    

    对于 RVM 的用户,请添加以下内容:

    set :rvm_map_bins, fetch(:rvm_map_bins, []).push('bin/delayed_job')
    

    来源:https://github.com/capistrano/bundler#usage

    【讨论】:

      【解决方案2】:

      我刚刚开始使用 Capistrano,并且还在为缺乏文档而苦苦挣扎,如果这篇文章没有达到目的,非常抱歉。

      v3 很大程度上依赖于sshkit,因此阅读相关文档应该会有很大帮助。自述文件提供了一个可以解决您的问题的示例。

      SSHKit.config.command_map.prefix[:rake].push("bundle exec")
      puts SSHKit.config.command_map[:rake]
      # => bundle exec rake
      

      我还在Semaphore blog post 中找到了替代解决方案。

      SSHKit.config.command_map[:rake]  = "bundle exec rake"
      SSHKit.config.command_map[:rails] = "bundle exec rails"
      

      【讨论】:

        猜你喜欢
        • 2013-11-25
        • 2016-11-08
        • 2014-03-30
        • 1970-01-01
        • 2015-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多