Heroku scheduler and Rails rake tasks
— March 7, 2014
tl;dr we are using the heroku scheduler with Rails and Rake to keep our dyno awake; this will also work for any custom short periodical task.
Heroku scheduler
The Heroku scheduler is a “free” application add-on that helps you run short tasks every 10, 60 or 3600 minutes. You can use it as much as you want per month, but AFAIK it uses minutes from your dynos. That said, be careful if you are on a tight budget.
For our use case this will work flawlessly given it’s not a key aspect of our application and it’s mostly for development use.
Adding the scheduler
There are 2 ways to apply this add-on to your application; from the web interface or the CLI.
To use the CLI you must have the heroku toolbelt installed.
$ heroku addons:add scheduler
ping.rake
It’s time to create our rake task in Rails. First step is to create a file
within the lib/tasks
directory of our Rails application.
$ touch lib/tasks/ping.rake
Then add this code:
require 'net/http'
namespace :ping do
desc "Ping our heroku dyno every 10, 60 or 3600 min"
task :start do
puts "Making the attempt to ping the dyno"
if ENV['URL']
puts "Sending ping"
uri = URI(ENV['URL'])
Net::HTTP.get_response(uri)
puts "success..."
end
end
end
Environment variables
Now you have your rake task ready to use, but… we are using environment variables in our task and they must be exported to heroku and locally (testing):
$ heroku config:set URL=http://xxx.herokuapp.com/ #replace xxx with your heroku appmane
to test the task locally you can either use
export URL=http://xxx.herokuapp.com/
or the dotenv gem and runrake ping:start
.
Testing the task
To test if task is working as expected within the heroku environment you have to
commit this code and deploy your application; after that you will be able to use
heroku run
to test the task:
$ heroku run rake ping:start
If the output from the command was successful you just need to add the task to the scheduler and that’s it.
Adding the task to the scheduler
$ heroku addons:open scheduler
This will open the website in which you will need to add the task to be run
(e.g. rake ping:start
), dyno size (1x) and frequency (60minutes).
You are all set, if you want to check if it’s been run just check the heroku log
in a couple of hours heroku logs --ps scheduler.1
.