最近L2MEというサービスを作ったのだが、このサービスではユーザーごとにディレクトリを作成している。
そのディレクトリ内ではgit cloneされた本体がいて、つまり1user:1dirという関係。
そこでデプロイとして、gitのmasterブランチがPullRequestなんかでマージされたりなんぞして更新時に、なんかCIが走ると仮定して、各々のdirでgit pullされてほしい。それもディレクトリ分繰り返して欲しい。
で、以下のようにした。ちなみに、対象ディレクトリ以外は無視するようにgit config core.sparsecheckout trueの設定を前もってしてある。(ユーザー作成時にするようにしている)
なお、個人的な趣味嗜好でbashである。めんどいので、ほぼまんまなコードを貼る。
# !/bin/bash
set -eu
nowdate=`date "+%Y/%m/%d %T"`
host=`hostname -f`
echo -e '!!start git pull carnival!!' | ./slack.sh
find /var/www/html -mindepth 1 -maxdepth 1 -type d | while read FILE
do
echo '----------'
echo 'find: '${FILE}
cd ${FILE}
pwdmsg=$(pwd)
gitmsg=$(git pull)
slackpost=${pwdmsg}'\n'${gitmsg}
echo -e ${slackpost} | ./slack.sh
done
echo -e '!!done git pull carnival!!' | ./slack.sh
-
nowdata,hostは通知用に取得している -
slack.shというのは、slackへ発言するshell scriptである -
find分で/var/www/htmlの中にあるディレクトリを探索している
-
-mindepth 1で探索最下位を1にしている、自分を含まないようにしている(無いと自分./htmlを含む) -
-maxdepth 1で探索最上位を1にしている、./*にあるものだけを対象とするため -
-type dでファイルタイプがディレクトリのみとしている
-
FILEがいわゆるthis -
pwdしないと今どこやってんのか不明である -
git pullはお好みで、cloneなりfetchなりなんなりに変えればいい - 変数にコマンドを格納し、標準出力をslackに流すようにしている
- 最後になんか言わないと終わったかわからん
ただこれでもエラーハンドリングは出来ていない(というかset -euによってエラーが出てる時点で処理が止まる)ので本格的に自動化するならもうちょっとエラー内容とかもslackに来るようにしないといけないかな。
自分は手動でかけているので、いまんところは困っていない。しかし、shellはなんでも出来ていいもんですね。