Slack integration for Capistrano deployments.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.


Gem Version Code Climate Build Status

Send notifications to Slack about Capistrano deployments.


  • Capistrano >= 3.8.1
  • Ruby >= 2.0
  • A Slack account


  1. Add this line to your application's Gemfile:

    gem 'slackistrano'
  2. Execute:

    $ bundle
  3. Require the library in your application's Capfile:

    require 'slackistrano/capistrano'


You have two options to notify a channel in Slack when you deploy:

  1. Using Incoming WebHooks integration, offering more options but requires one of the five free integrations. This option provides more messaging flexibility.
  2. Using Slackbot, which will not use one of the five free integrations.

Incoming Webhook

  1. Configure your Slack's Incoming Webhook.

  2. Add the following to config/deploy.rb:

    set :slackistrano, {
      channel: '#your-channel',
      webhook: 'your-incoming-webhook-url'


  1. Configure your Slack's Slackbot (not Bot).

  2. Add the following to config/deploy.rb:

    set :slackistrano, {
      channel: '#your-channel',
      team: 'your-team-name',
      token: 'your-token'

Optional Configuration & Overrides

By default Slackistrano will use a default icon and username. These, can be overriden if you are using the default messaging class (ie. have not specified your own).

  1. Configure per instructions above.

  2. Add the following to config/deploy.rb:

    set :slackistrano, {
     username: 'Foobar the Deployer',
     icon_emoji: ':thumbsup:', # takes precedence over icon_url
     icon_url: '',

Test your Configuration

Test your setup by running the following command. This will post each stage's message to Slack in turn.

$ cap production slack:deploy:test


Deploy your application like normal and you should see messages in the channel you specified.

Customizing the Messaging

You can customize the messaging posted to Slack by providing your own messaging class and overriding several methods. Here is one example:

if defined?(Slackistrano::Messaging)
   module Slackistrano
     class CustomMessaging < Messaging::Base

       # Send failed message to #ops. Send all other messages to default channels.
       # The #ops channel must exist prior.
       def channels_for(action)
         if action == :failed

       # Suppress updating message.
       def payload_for_updating

       # Suppress reverting message.
       def payload_for_reverting

       # Fancy updated message.
       # See
       def payload_for_updated
           attachments: [{
             color: 'good',
             title: 'Integrations Application Deployed :boom::bangbang:',
             fields: [{
               title: 'Environment',
               value: stage,
               short: true
             }, {
               title: 'Branch',
               value: branch,
               short: true
             }, {
               title: 'Deployer',
               value: deployer,
               short: true
             }, {
               title: 'Time',
               value: elapsed_time,
               short: true
             fallback: super[:text]

       # Default reverted message.  Alternatively simply do not redefine this
       # method.
       def payload_for_reverted

       # Slightly tweaked failed message.
       # See
       def payload_for_failed
         payload = super
         payload[:text] = "OMG :fire: #{payload[:text]}"

       # Override the deployer helper to pull the best name available (git, password file, env vars).
       # See
       def deployer
         name = `git config`.strip
         name = nil if name.empty?
         name ||= Etc.getpwnam(ENV['USER']).gecos || ENV['USER'] || ENV['USERNAME']

The output would look like this: Custom Messaging

To set this up:

  1. Add the above class to your app, for example lib/custom_messaging.rb.

  2. Require the library after the requiring of Slackistrano in your application's Capfile.

    require_relative 'lib/custom_messaging'
  3. Update the slackistrano configuration in config/deploy.rb and add the klass option.

    set :slackistrano, {
      klass: Slackistrano::CustomMessaging,
      channel: '#your-channel',
      webhook: 'your-incoming-webhook-url'
  4. If you come up with something that you think others would enjoy submit it as an issue along with a screenshot of the output from cap production slack:deploy:test and I'll add it to the Wiki.

Disabling posting to Slack

You can disable deployment notifications to a specific stage by setting the :slackistrano configuration variable to false instead of actual settings.

set :slackistrano, false


  • Notify about incorrect configuration settings.


  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request