Как запросить ввод данных пользователем при запуске кода ruby ​​на удаленном сервере с capistrano? - PullRequest
0 голосов
/ 31 января 2019

Я хочу подтвердить действие при запуске задачи capistrano на удаленном сервере:

task :do_someting do
  on roles(:primary) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :rails, :runner,
          %Q['require "do_something"; Do::Something.()']
      end
    end
  end
end

Где `DoSomethig выглядит следующим образом:

require "highline/import"

class DoSomething

  def self.call
    query_db_for_objects.each do |obj|
      answer = ask "Are you sure to do something with #{obj}? (y/n)"
      rerun unless answer == 'y'
      do_something
    end
  end

end

Метод ask от highlineПохоже, что gem не работает при запросе с удаленного сервера, а команда bundle exec cap production do_something зависает навсегда.

Как я могу запросить ввод данных с удаленного сервера при выполнении этой задачи capistrano?

1 Ответ

0 голосов
/ 02 февраля 2019

Мне удалось прочитать ответ пользователя с удаленного сервера со следующим кодом рубина

task :do_someting do

  class ConfirmHandler
    def on_data(command, stream_name, data, channel)
      if data.to_s =~ /\?$/
        prompt = Net::SSH::Prompt.default.start(type: 'confirm')
        response = prompt.ask "Please enter your response (y/n)"
        channel.send_data "#{response}\n"
      end
    end
  end

  on roles(:primary) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :rails, :runner,
          %Q['require "do_something"; Do::Something.()']
      end
    end
  end

end

, где Do::Something имеет метод ask_user, который выглядит следующим образом:

class Do::Something

  def self.call
    answer = ask_user
    puts "Answer is: #{answer}"
  end

  def self.ask_user
    puts 'Do something?'
    `read response; echo $response`
  end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...