Slack notifications with Slack-Notify gem

We have been using Slack at OmbuLabs opens a new window for a while now after switching from HipChat, and haven’t looked back. It looks and feels much better than any other available platform of its kind. Slack provides WebHooks opens a new window , which you can use to post messages to your team’s channels.

We use Solano CI opens a new window (formerly Tddium) for our automated builds. By default, the system sends e-mails whenever a build passes or fails, but we wanted to be notified in our Slack channels. Enter the slack-notify opens a new window gem, which makes Slack notifications super simple in Ruby.

To get started, first set up an incoming webhook opens a new window .

Once that’s done, you can create the Rake task which Solano can run when the build has finished running:

  def current_branch
    `git symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3-`.strip
  end

  task :post_build_hook do
    require 'slack-notify'

    webhook_url = "https://hooks.slack.com/services/your-hook"
    base_url = "#{ENV['TDDIUM_API_SERVER']}"
    session_id = "#{ENV['TDDIUM_SESSION_ID']}"
    build_status = "#{ENV['TDDIUM_BUILD_STATUS']}"

    client = SlackNotify::Client.new(channel: "#your-channel",
                                     webhook_url: webhook_url,
                                     username: "Solano CI",
                                     icon_emoji: ":shipit:")
    msg = "_#{current_branch}_ *#{build_status}*! "
    msg << "Check build details at: "
    msg << "http://#{base_url}/1/reports/#{session_id}"
    client.notify(msg)
  end

This will let #your-channel know the branch for which the build ran, whether it passed, failed or errored, and a link to the build report.

You also need to explicitly call it after the build is finished in your solano.yml or tddium.yml file:

:tddium:
  :hooks:
    :post_build: RAILS_ENV=test bundle exec rake tddium:post_build_hook

We have also set up deployment notifications, so whenever someone deploys to production, the Slack channel is notified:

namespace :notify do
  task :start, roles: [:app] do
    msg = "#{USERNAME} started deploying #{REPO} (#{GIT_TAG}) to production"
    notify_slack(msg)
  end

  task :done, roles: [:app] do
    msg = "#{USERNAME} just deployed #{REPO} (#{GIT_TAG}) to production"
    notify_slack(msg)
  end
end

before "deploy", "notify:start"
after "deploy", "notify:done"

There are many different use cases, just make sure not to spam your team with too many notifications. At some point, you may want to set up a channel dedicated solely to notifications if you are part of a bigger team.