Cron As A Service

2012-02-11 10:35:19 by jdixon

I recently found myself in the need for a way to run a one-off Ruby script at scheduled intervals. As this is a work project I didn't just want to run it on my laptop or some random server. Turns out there's an easy way to run this for free on the Heroku Cedar platform without having to piggyback it on a "real" application. Because there are no web processes running, we'll be able to limit our dyno usage to a single dyno (in other words, it's free).

The script itself handles garbage collection duties for removing expired hosts off our beta account with Boundary. Basically I just want it to run every hour and cull anything that hasn't reported to their collectors in a day. For the purpose of this article the contents of the script are inconsequential, although I intend to present it fully in a future post.

To run your own scheduled Ruby code, you'll first need to create Gemfile and Gemfile.lock files. These Bundler files are used by the Cedar platform to determine that you need the Ruby buildpack.

$ cd oscar

$ ls -l
total 16
-rw-r--r--  1 jdixon  jdixon   47 Feb 11 09:25 Gemfile
-rw-r--r--  1 jdixon  jdixon  189 Feb 11 09:25 Gemfile.lock

total 8
-rw-r--r--  1 jdixon  jdixon  954 Feb 11 09:25 purge_meters

You'll want to initialize your git repo (if you haven't already) and commit. Create a new Heroku app and add push it to the Heroku git server.

$ git init .
Initialized empty Git repository in /Projects/oscar/.git/

$ git add .

$ git ci -m "initial commit"
[master (root-commit) 41ec621] initial commit
 3 files changed, 56 insertions(+), 0 deletions(-)
 create mode 100644 Gemfile
 create mode 100644 Gemfile.lock
 create mode 100644 bin/purge_meters

$ heroku create -s cedar
Creating blooming-robot-7955... done, stack is cedar | [email protected]:blooming-robot-7955.git
Git remote heroku added

$ git push heroku master
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 1002 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)

-----> Heroku receiving push
-----> Ruby app detected
-----> Installing dependencies using Bundler version 1.1.rc.7
       Running: bundle install --without development:test --path vendor/bundle 
         --binstubs bin/ --deployment
       Fetching gem metadata from
       Installing json (1.6.4) with native extensions
       Installing mime-types (1.17.2)
       Installing rest-client (1.6.7)
       Using bundler (1.1.rc.7)
       Your bundle is complete! It was installed into ./vendor/bundle
       Cleaning up the bundler cache.
-----> Discovering process types
       Procfile declares types -> (none)
       Default types for Ruby  -> console, rake
-----> Compiled slug size is 1.5MB
-----> Launching... done, v4 deployed to Heroku

To [email protected]:blooming-robot-7955.git
 * [new branch]      master -> master

Next, add the Scheduler addon to your app.

$ heroku addons:add scheduler:standard
-----> Adding scheduler:standard to blooming-robot-7955... done, v5 (free)
       This add-on consumes dyno hours, which could impact your monthly bill.
       To learn more:
       To manage scheduled jobs run:
       heroku addons:open scheduler

Now you'll need to specify the task you want to run (your Ruby script). Run the following command to open the Scheduler dashboard in your default web browser.

$ heroku addons:open scheduler
Opening scheduler:standard for blooming-robot-7955...

Click the Add Job... link to edit your task command. For my task I wanted to run the script with bundle exec ruby. Choose your Frequency, optionally select the Next Run time, and then Save. Once this is saved you can also click the Run button to run the job manually and look for any errors in the Task Output.

Voila, you have your own free cron job running through the wonders of THE CLOUD. Now go off and conquer the world!

Add a comment:




max length 4000 chars