最近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はなんでも出来ていいもんですね。