グロースエンジニアのブログ

Ruby on Rails エンジニアです!開発に当たって勉強したことをまとめていこうと思います!

【Rails】capistrano でのデプロイを idobata に通知する

結構サックリいけるかなと思ったら、なぜかハマったのでメモがてら...

capstrano 3 だけど、

IdobataにCapistrano(2系)のdeploy通知を投げる - Qiita この辺を参考にしつつ、とりあえずそのままベタ書きして実行してみたら怒られた。

config/deploy.rb

after 'deploy:restart', 'deploy:notify_revision'

# user_name, user_repository, idobata_hook_url は自分のものに修正
namespace :deploy do
  # idobata 通知
  task :notify_revision do
    user_name = `git config --global user.name`.gsub("
", '')
    github_path = "https://github.com/user_name/user_repository/tree/#{current_revision}"
    source = "App was deployed by #{user_name} #{stage}deployed source tree: #{current_revision[0, 7]}"

    idobata_hook_url = "https://idobata.io/hook/custom/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    run "curl --data-urlencode 'source=#{source}' -d format=html #{idobata_hook_url}"
  end
end
cap aborted!

Don't know how to build task 'deploy:notify_revision' (see --tasks)

ゴニョゴニョしたけどなぜかタスクが読み取られず... 

 

タスクを分けて実行

capistrano のタスクは `lib/capistrano/tasks/idobata_notify_revision.cap` に切り出して実行してみた。

config/deploy.rb

# 上で追加した奴は全部削除して...

    after 'deploy:restart', 'idobata:notify'

lib/capistrano/tasks/idobata_notify_revision.cap を新規作成。

# user_name, user_repository, idobata_hook_url は自分のものに修正

namespace :idobata do

  task :notify do

    user_name = `git config --global user.name`.gsub("
", '')

    current_revision = "`cat #{current_path}/current`"

    github_path = "https://github.com/user_name/user_repository/tree/#{fetch(:branch)}"

    source = "App was deployed by #{user_name} #{fetch(:rails_env)}deployed source tree: #{fetch(:branch)}"

    idobata_hook_url = "https://idobata.io/hook/custom/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    on roles :all do

      execute "curl --data-urlencode 'source=#{source}' -d format=html #{idobata_hook_url}"

    end

  end

end

最初、ファイル名を `.rake` で作成しても読み取られず、いろいろ見てたら Capfile に .cap の指定をしてました...

Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }

はい、ごめんなさい...

あと、run じゃねーよ(NoMethodError: undefined method `run' for main:Object)!

とか、execute だけだと動かなかったりして  on roles :all do ... end で囲ったりして上記で大丈夫そうでした!

おまけ

デプロイタスクをテストするのに、毎回デプロイするのダルいな...って思ってたら、そのタスクだけ実行できた。上記の場合だと...

cap production idobata:notify

 って指定するとそのタスクを実行してくれる。はい、知りませんでした...

ってことで、デプロイタスクもいろいろ作っていこうと思います。