Make deployment visible with Capistrano, Autotagger, Git and Sendgrid
There comes a time in every project when the deployment process comes of age, and that development arrives with its own set of Capistrano recipes and Rake tasks. The project I’m on hit that point recently, and one of the neat outcomes of its nascent puberty was a simple Capistrano recipe to send a git changelog to our project mailing list.
Here’s what this looks like:
$ cap staging deploy
... stuff happens here ...
* executing `sendgrid:notify'
Changelog:
04fc6dd adding capistrano deployment messages
To use this in your Rails project, the first thing you need is a sendgrid account. If you’re budget-minded, you can always use the credentials your Heroku app is using.
$ heroku create
Creating heroku-wackiness-90210... done, stack is cedar
http://heroku-wackiness-90210.herokuapp.com/ | git@heroku.com:heroku-wackiness-90210.git
Git remote heroku added
$ heroku addons:add sendgrid:starter
Adding sendgrid:starter on heroku-wackiness-90210... done, v2 (free)
Use `heroku addons:docs sendgrid:starter` to view documentation.
$ heroku config -s
SENDGRID_PASSWORD=s3kr17
SENDGRID_USERNAME=yodawg@heroku.com
This process uses Capistrano and Autotagger. For information on setting up Capistrano, their wiki is an excellent starting point. For Autotagger setup with Capistrano, Jeff Dean’s auto_tagger repository is the canonical source of information.
After you’re up and running with Capistrano and Autotagger, you need to add the following file under lib/recipes/sendgrid_notifier.rb
:
require 'mail'
set :sendgrid_user, "whatever"
set :sendgrid_password, "secret"
set :sendgrid_domain, "pivotallabs.com"
set :sender, "Now Hiring <jobs@pivotallabs.com>"
set :recipient, "Steve Squivot <you@square.com>"
namespace :sendgrid do
task :notify do
sendgrid = {
:address => "smtp.sendgrid.net",
:port => 587,
:domain => sendgrid_domain,
:user_name => sendgrid_user,
:password => sendgrid_password,
:authentication => 'plain',
:enable_starttls_auto => true
}
auto_tagger = AutoTagger::CapistranoHelper.new(
:stage => rails_env,
:stages => auto_tagger_stages).auto_tagger
previous_sha = auto_tagger.refs_for_stage(stage).last.sha
current_sha = auto_tagger.repo.latest_commit_sha
mail = Mail.new(from: recipient, to: sender)
mail.delivery_method :smtp, sendgrid
mail.subject = "[#{stage}] New Deployment!"
mail.body = `git log --oneline #{previous_sha}..#{current_sha}`
mail.deliver!
end
end
Then, let’s add a line to include this recipe in our Capfile:
require File.expand_path("../lib/recipes/sendgrid_notifier.rb", __FILE__)
Finally, let’s try it out:
$ cap ci sendgrid:notify
* executing `sendgrid:notify'
Changelog:
04fc6dd add a recruiter message to send off to Square
Alright! The email’s on its way. If you need to call this in your custom deployment step, it’s as easy as sticking sendgrid.notify
into your Capfile
.
Happy deploying!
About the Author