ある日インフラのすごい人に
「イケてるデプロイシステムならリリースディレクトリ名はyyyyMMddHHmmssじゃなくてGitのコミットハッシュ値だよね〜」
とサラッと言われたので、サラッとできると思ってチャレンジしてみたら結局ゴリッとシェルを書いて解決した話です。
Capistrano側
# リリースディレクトリ名の変更
set :release_hash, ENV['GIT_COMMIT']
Rake::Task["deploy:new_release_path"].clear
namespace :deploy do
desc 'set release path'
task :new_release_path do
set_release_path(fetch(:release_hash))
end
end
ちなみにCapistranoのバージョンは3.6.1ですが、おそらく3系であれば変わらないと思います。
デプロイ用のシェル
if [ $# -eq 0 ]; then
BRA="master"
else
BRA=$1
fi
$BRA #ブランチ名を確認
VER=`git rev-parse --short $BRA`
$VER #コミットハッシュ値を確認
bundle exec cap production deploy BRANCH=$BRA GIT_COMMIT=$VER #Bundlerを使用しない場合はcap以降のみ
第一引数をブランチ名として、そのコミットハッシュ値を取得し、capコマンドに渡しています。
使い方
sh deploy.sh {branch名}
上記のコマンドで任意のブランチがその最新のコミットハッシュ値をディレクトリ名とするディレクトリにデプロイされます。
引数を指定しなかった場合はmasterがデプロイされます。
最後に
「イケてるデプロイシステムならリリースディレクトリ名はyyyyMMddHHmmssじゃなくてGitのコミットハッシュ値だよね〜」
これが本当にサラッと言われたので、Capistrano3単体でサラッと実現できるかと思いきや、できなかったという話です。
Capistrano3でできるもんだと思って色々調べてしまい、かなり時間をかけてしまいました。
参考
Capistrano3でリリースディレクトリをJSTにする方法
こちらのQiita記事がCapistrano3の内部処理も解説されており、とても参考になりました。