ユゲタです。
WEBサイト構築用のフレームワークって便利なものがたくさん公開されていますが、自作したのが一番使いやすいと思って、作り込んでいるんですが、
PHPのcomposerを見習って、ライブラリ管理を自動で行えるように、リポジトリ(github)にあるデータが更新されているかどうかをチェックできるスクリプトを書いてみました。
チェックプログラムを実行した時に、対象のライブラリがない場合は自動でcloneできるようにしてみました。
shellコード
#!/bin/bash
# check-directory /vendor
# フォルダがない場合は作成
DIR="plugin"
if [ ! -e $DIR ]; then
mkdir $DIR
fi
# 任意pluginのチェック
PLUGIN="test"
if [ -e $DIR/$PLUGIN ];then
cd $DIR/$PLUGIN
# check-head(commit-id)
CID0=`git log --pretty=format:"%H"|head -n 1`
echo $CID0
CID1=`git ls-remote origin HEAD|awk '{print $1}'`
echo $CID1
if [ $CID0 = $CID1 ]; then
echo "Same !";
else
echo "Diff !";
fi
else
# clone
git clone https://github.com/yugeta/test.git $DIR/$PLUGIN
fi
実行注意点
このプログラムを実行すると、実行した階層に"plugin"というフォルダが作られてその中にtest登録してあるgithubのリポジトリがcloneされます。
その後、githubのリポジトリに更新があった場合に、コマンドを叩くと"diff"文字列が表示され、更新がない場合は"same"と表示されます。
diffの時に、git pullを実行すれば、更新がある場合に自動更新ができるスクリプトの出来上がりです。
プログラム制御して、任意アップデートにしたい場合は、別のスクリプトで実行して、連動させるといいでしょう。
解説
このプログラムのポイントは、gitリポジトリのコミットIDを取得して、ローカル(公開サーバー)とサーバー(github)に違いがあるかどうかを判定するという処理です。
ローカルリポジトリのコミットIDを取得するには、"git log"を仕様しているんですが、オプションのpretty-formatでIDのみを抜き出しています。
git log --pretty=format:"%H"
一方Github側からは、fetchなどでデータを一旦抜き出す方法もありますが、最新のコミットIDのみ取得できればいいので、普段はあまり使わない、"ls-remote"というオプションを使用します。
git ls-remote origin HEAD
最新情報なのでHEAD位置を取得するんですが、このままだと、HEADという文字がくっついてくるので、awkでID部分だけを抽出するように細工しています。
本来なら多機能なGITに、リポジトリとローカルのコミット状態の比較がダイレクトにできてもいいぐらいなのですが、今のバージョンでは機能が見つけられなかったので、「無い」という判断で力技で行うようにしました。
うすうすお気づきの人もいるかもしれませんが、テンプレートファイルにライブラリ一覧を記述しておき、それぞれloopで回しながらこの処理をすることで、リポジトリ型のライブラリの自動更新やアップデート確認などが一括または自動でできてしまうという便利ツールにできます。
PHPのconposerだけでなく、javascriptライブラリや、その他のモジュール群なども、この方式で便利なデプロイ環境が構築できますね。
そこまで高機能なツールに作り込んだらまたこのブログでご紹介したいと思います。
0 件のコメント:
コメントを投稿