はじめに
この記事はLinkbal Advent Calendar 2018の14日目の記事です(投稿日が1日過ぎていることは内緒です)。
どうも、水野(キンチキ)です。今回は前回の記事と同じくシェル周りのネタです。
capistranoのデプロイコマンドが長い
capistranoでのデプロイは bundle exec cap production deploy
ですよね。これならまだいいのですが、hogeブランチをstging環境にデプロイする場合だと bundle exec cap staging deploy BRANCH=hoge
という長いコマンドになります。
bundle exec
はaliasの作成などでいいですが、環境名とブランチ名をいちいち打つのは非常にめんどくさいです。
私は1年ほど前に諸事情で毎日様々なブランチを合計で最低10回はデプロイしているときがありました。それなのに毎回こんな長いコマンドを打つのは耐えられませんでした。
もちろん、ctrl+rによるインクリメント検索(peco使用)で毎回コマンドのすべてを打ってはいませんでしたが、それでもいちいちブランチ名を変えたりするのがとにかく面倒でした。
そして、毎日何回もデプロイする場合、馬鹿にならない時間をコマンドを入力することに取られます。
ということで、思考停止で簡単にデプロイできるcapistrano用のラッパーのシェルスクリプトを作成しました。
capistrano用のラッパーのシェルスクリプト
プロジェクトのルートディレクトリに適当な名前でファイルを作成し、以下を記載してください。
ここではファイル名を deploy.sh
とします。
なお、このシェルスクリプトは私の人生初シェルスクリプトなので、イマイチな点があるかと思います。
そういう点がありましたら、コメントや編集リクエストを頂けると幸いです。
#!/bin/sh
# usage用のテキスト
usage="usage: deploy.sh <target_environment> <target_branch>\n<target_branch> default is current branch\nex: deploy.sh stg develop"
# 引数の数が0 または2より多い場合エラー
if [ $# -eq 0 ] || [ $# -gt 2 ]; then
echo $usage
exit 1
fi
# environment が存在しないものならエラー
# devとstaging環境がある想定
# productionは怖いので外しておく
environment=$1
if [ $environment != "dev" ] && [ $environment != "stg" ] && [ $environment != "staging" ]; then
echo "deploy.sh: $1: No such environment"
exit 1
fi
# stg だった場合 staging に変換
[ $environment = "stg" ] && environment="staging"
# current branch name を $current_branch に入れる
current_branch=$(echo $(git symbolic-ref --short HEAD | tr -d '\n'))
# コマンド実行
# 引数が2つのときは2つ目の引数に入力したブランチをデプロイ
if [ $# -eq 2 ]; then
bundle exec cap $environment deploy BRANCH=$2
# 引数が1つのときはカレントブランチをデプロイ
elif [ $# -eq 1 ] && [ -n $current_branch ]; then
bundle exec cap $environment deploy BRANCH=$current_branch
fi
ファイルを作成したら以下のコマンドで実行権限を付与します。
$ chmod +x deploy.sh
あとは以下のようなコマンドでデプロイ可能です。
# staging環境にカレントブランチをデプロイ
$ ./deploy.sh stg
# dev環境にhogeブランチをデプロイ
$ ./deploy.sh dev hoge
このシェルスクリプトは、余分なものを一切入力せずに環境名とブランチ名だけ入力すればデプロイできます。
また、ブランチ名を省略すればカレントブランチをデプロイしてくるため、タイピング量が減ってとても快適です。
ただ、私は ./deploy.sh
すら入力するのが面倒だったので、パスが通ったディレクトリにファイルをコピーして、ファイル名を capdep
として capdep stg
としていました。
・・・これを書いていて思いましたが、gitリポジトリで他の人が使っていてかつ変更されることを考えると alias capdep=./deploy.sh
のようにエイリアスを作成したほうがいいですね。
おわりに
この記事のシェルスクリプトはかなり簡単なものです。
しかし、簡単なシェルスクリプトでもいろいろなことができます。
決った手順で複数のコマンドを実行したり、長いコマンドを打つことがある方は、シェルスクリプトを書いて楽にすることを検討してみるいいかもしれませんね。
それではまた。