class Heroku::Command::Run

run one-off commands (console, rake)

Public Instance Methods

console() click to toggle source
HIDDEN: run:console [COMMAND]

open a remote console session

if COMMAND is specified, run the command and exit

NOTE: For Cedar apps, use `heroku run console`

Examples:

$ heroku console
Ruby console for example.heroku.com
>>
# File lib/heroku/command/run.rb, line 124
def console
  puts "`heroku #{current_command}` has been removed. Please use: `heroku run` instead."
  puts "For more information, please see:"
  puts " * https://devcenter.heroku.com/articles/one-off-dynos"
  puts " * https://devcenter.heroku.com/articles/rails3#console"
  puts " * https://devcenter.heroku.com/articles/console-bamboo"
end
detached() click to toggle source
run:detached COMMAND

run a detached dyno, where output is sent to your logs

-s, --size SIZE      # specify dyno size
-t, --tail           # stream logs for the dyno

Example:

$ heroku run:detached ls
Running `ls` detached... up, run.1
Use `heroku logs -p run.1` to view the output.
# File lib/heroku/command/run.rb, line 66
def detached
  command = args.join(" ")
  error("Usage: heroku run COMMAND") if command.empty?
  opts = { :attach => false, :command => command }
  opts[:size] = options[:size] if options[:size]

  app_name = app
  process_data = action("Running `#{command}` detached", :success => "up") do
    process_data = api.post_ps(app_name, command, opts).body
    status(process_data['process'])
    process_data
  end
  if options[:tail]
    opts = []
    opts << "tail=1"
    opts << "ps=#{process_data['process']}"
    log_displayer = ::Heroku::Helpers::LogDisplayer.new(heroku, app, opts)
    log_displayer.display_logs
  else
    display("Use `heroku logs -p #{process_data['process']} -a #{app_name}` to view the output.")
  end
end
index() click to toggle source
run COMMAND

run an attached dyno

-s, --size SIZE      # specify dyno size
--exit-code          # return exit code from process

Example:

$ heroku run bash
Running `bash` attached to terminal... up, run.1
~ $

$ heroku run -s hobby -- myscript.sh -a arg1 -s arg2
Running `myscript.sh -a arg1 -s arg2` attached to terminal... up, run.1
# File lib/heroku/command/run.rb, line 41
def index
  if ARGV.include?('--') || ARGV.include?('--exit-code')
    Heroku::JSPlugin.install('heroku-run')
    Heroku::JSPlugin.run('run', nil, ARGV[1..-1])
    return
  end
  command = args.join(" ")
  error("Usage: heroku run COMMAND") if command.empty?
  warn_if_using_jruby
  run_attached(command)
end
rake() click to toggle source
run:rake COMMAND

WARNING: `heroku run:rake` has been deprecated. Please use `heroku run rake` instead."

remotely execute a rake command

Example:

$ heroku run:rake -T
Running `rake -T` attached to terminal... up, run.1
(in /app)
rake test  # run tests
# File lib/heroku/command/run.rb, line 102
def rake
  deprecate("`heroku #{current_command}` has been deprecated. Please use `heroku run rake` instead.")
  command = "rake #{args.join(' ')}"
  run_attached(command)
end

Protected Instance Methods

console_history_add(app, cmd) click to toggle source
# File lib/heroku/command/run.rb, line 210
def console_history_add(app, cmd)
  Readline::HISTORY.push(cmd)
  File.open(console_history_file(app), "a") { |f| f.puts cmd + "\n" }
end
console_history_dir() click to toggle source
# File lib/heroku/command/run.rb, line 171
def console_history_dir
  FileUtils.mkdir_p(path = "#{home_directory}/.heroku/console_history")
  path
end
console_history_file(app) click to toggle source
# File lib/heroku/command/run.rb, line 191
def console_history_file(app)
  "#{console_history_dir}/#{app}"
end
console_history_read(app) click to toggle source
# File lib/heroku/command/run.rb, line 195
def console_history_read(app)
  history = File.read(console_history_file(app)).split("\n")
  if history.size > 50
    history = history[(history.size - 51),(history.size - 1)]
    File.open(console_history_file(app), "w") { |f| f.puts history.join("\n") }
  end
  history.each { |cmd| Readline::HISTORY.push(cmd) }
rescue Errno::ENOENT
rescue => ex
  display "Error reading your console history: #{ex.message}"
  if confirm("Would you like to clear it? (y/N):")
    FileUtils.rm(console_history_file(app)) rescue nil
  end
end
console_session(app) click to toggle source
# File lib/heroku/command/run.rb, line 176
def console_session(app)
  heroku.console(app) do |console|
    console_history_read(app)

    display "Ruby console for #{app}.#{heroku.host}"
    while cmd = Readline.readline('>> ')
      unless cmd.nil? || cmd.strip.empty?
        console_history_add(app, cmd)
        break if cmd.downcase.strip == 'exit'
        display console.run(cmd)
      end
    end
  end
end
rendezvous_session(rendezvous_url, &on_connect) click to toggle source
# File lib/heroku/command/run.rb, line 148
def rendezvous_session(rendezvous_url, &on_connect)
  begin
    set_buffer(false)
    rendezvous = Heroku::Client::Rendezvous.new(
      :rendezvous_url => rendezvous_url,
      :connect_timeout => (ENV["HEROKU_CONNECT_TIMEOUT"] || 120).to_i,
      :activity_timeout => nil,
      :input => $stdin,
      :output => $stdout)
    rendezvous.on_connect(&on_connect)
    rendezvous.start
  rescue Timeout::Error, Errno::ETIMEDOUT
    error "\nTimeout awaiting dyno, see https://devcenter.heroku.com/articles/one-off-dynos#timeout-awaiting-process"
  rescue OpenSSL::SSL::SSLError
    error "\nSSL error connecting to dyno."
  rescue Errno::ECONNREFUSED, Errno::ECONNRESET
    error "\nError connecting to dyno, see https://devcenter.heroku.com/articles/one-off-dynos#timeout-awaiting-process"
  rescue Interrupt
  ensure
    set_buffer(true)
  end
end
run_attached(command) click to toggle source
# File lib/heroku/command/run.rb, line 135
def run_attached(command)
  app_name = app
  opts = { :attach => true, :ps_env => get_terminal_environment }
  opts[:size] = options[:size] if options[:size]

  process_data = action("Running `#{command}` attached to terminal", :success => "up") do
    process_data = api.post_ps(app_name, command, opts).body
    status(process_data["process"])
    process_data
  end
  rendezvous_session(process_data["rendezvous_url"])
end