Capistrano 3によるデプロイをSlackに通知する

井原(@ihara2525)です。

今つくっているRailsアプリケーションのデプロイにはCapistrano 3を使っています。

slackistranoというgemを使うとデプロイの開始や終了を簡単にSlackに通知できるようになるのですが、終了の通知にgitの最後のコミットの内容とそれへのリンクが含まれるように、ちょっとカスタマイズしてみます。

通知されるようにする設定自体は、slackistranoのREADME通りにやればさくっとできると思います。

で、slack_msg_finishedという値でデプロイ終了時のメッセージを設定できるようなのでそれを変更します。

config/deproy.rb

set :slack_msg_finished, -> { "#{ENV['USER'] || ENV['USERNAME']} has finished deploying branch #{fetch(:branch)} of #{fetch(:application)} to #{fetch(:rails_env, 'production')}.\n> #{fetch(:git_last_commit_message)}" }

get_last_commit_messageという値は別のタスクをつくってそちらで設定します。 (repo_urlがgit@github.comであることを前提にしているので、ここをもう少し賢くしてあげると良さそうですね。)

lib/capistrano/tasks/git.rake

namespace :git do
  task :last_commit_message do
    repository_path = "#{fetch(:deploy_to)}/repo"
    on roles(:db) do
      within repository_path do
        repo_path = fetch(:repo_url).scan(/git@github\.com:(.*)\.git/).flatten[0]
        message = capture :git, 'log', '-1', %{--pretty=format:'<https://github.com/#{repo_path}/commit/%h|%h> - %an: "%s"' HEAD}
        set :git_last_commit_message, message.force_encoding('UTF-8')
      end
    end
  end
end

あとは、Slackへの通知が終了する前に、このgit:last_commit_messageを呼び出してgit_last_commit_messageに値が設定されるようにしましょう。

config/deploy.rb

before 'slack:deploy:finished', 'git:last_commit_message'

slackistranoのREADMEにあるように、

$ cap production slack:deploy:finished

で通知のテストができるので実行してみると、こんな感じの通知になっていると思います。

f:id:ihara2525:20150522161651p:plain

今は一人で開発をやっているのでコミットの内容も全部把握しているわけですが、、複数人での開発になると便利だと思います!多分!