LoginSignup
2
3

More than 5 years have passed since last update.

指定されたディレクトリ内部でgit pullするのをディレクトリ分、繰り返すshell script

Last updated at Posted at 2015-11-04

最近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
  1. nowdata, host は通知用に取得している
  2. slack.shというのは、slackへ発言するshell scriptである
  3. find分で/var/www/htmlの中にあるディレクトリを探索している
    • -mindepth 1で探索最下位を1にしている、自分を含まないようにしている(無いと自分./htmlを含む)
    • -maxdepth 1で探索最上位を1にしている、./*にあるものだけを対象とするため
    • -type dでファイルタイプがディレクトリのみとしている
  4. FILE がいわゆるthis
  5. pwdしないと今どこやってんのか不明である
  6. git pullはお好みで、cloneなりfetchなりなんなりに変えればいい
  7. 変数にコマンドを格納し、標準出力をslackに流すようにしている
  8. 最後になんか言わないと終わったかわからん

ただこれでもエラーハンドリングは出来ていない(というかset -euによってエラーが出てる時点で処理が止まる)ので本格的に自動化するならもうちょっとエラー内容とかもslackに来るようにしないといけないかな。

自分は手動でかけているので、いまんところは困っていない。しかし、shellはなんでも出来ていいもんですね。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3