ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

「git push」で、本番へのデプロイを自動でやってみた。

スポンサードリンク

http://www.flickr.com/photos/43134988@N00/6773178494
photo by Proudlove


タイトル通り。


初めての試みなので楽しみ+(0゚・∀・) + ワクテカ +



調査


やり方がわからないので、ひたすらぐぐる


色々調べたところ、こっちがわかりやすかった。


git hook 引用多めのため非公開



説明も書こうかなと思ったけど、もう上の記事で問題ないと思う。

やりたいこと


最初はbitbucketにフックさせて、デプロイということをやりたかった。


しかし、1. bitbucketの認証鍵を商用サーバで発行しなければならない。2.商用サーバにbitbucketからPOSTするスクリプトを用意しなければならない。3.結局商用サーバで、git pullしなければならない。


などと、なんか途中で面倒になったので、こうしました。

  1. 商用サーバにもリモートリポジトリを用意(これでフックする)
  2. ローカルで、2つのリポジトリにpushする
  3. 商用サーバでpushが通知されたら、デプロイ用のシェルスクリプトを実行


こんな感じ。


実践

ローカルの作業


ローカルリポジトリの .git/config を修正して、とあるpushを実行すると、2つのリポジトリが更新されるように修正します。

  • .git/config
# この記述を追加
[remote "all"]
	url = ${ bitbucket のリポジトリパス }
	url = ${ 商用サーバのgitのリポジトリパス }


ちなみに、商用サーバでリポジトリ用のパスを開放するのも何だったので、sshと併用しています。

サーバでの作業

んで、舞台は変わって商用サーバへ


リポートリポジトリを作成します。


任意のディレクトリで実行します。

$ git init --share --bare


フック用のスクリプトを配置しましょう。


どうやら、git/hooks/ の中に配置すればおkらしいです。


今回は、post-receive にフックさせたいので、そのままの名前を使います。※実行権限も忘れずに

$ touch git/hooks/post-receive
$ chmod +x git/hooks/post-receive


テストでスクリプトファイルを作成する。

$ vim git/hooks/post-receive

# こんな感じのスクリプトファイルを作成
# ==================
#!/bin/bash

echo "TEST" >/tmp/test.log
# ==================


これで、フックできるようになると思います。


試してみる。pushを実行

$ git push all master
Everything up-to-date


おろ? 動作していない・・・?


どうやら、pushしたとしてもリポジトリが更新されないと動作しないもよう


というわけで、何かしたらファイルを追加してコミットしてみて、pushしてみた。


すると、、、

$ cat /tmp/test.log
TEST


おお! すげ。動いたっぽいですね。


次に、簡単なデプロイスクリプトを用意します。


ちなみに、cakephp用です。


また、先程のフック用スクリプトも修正します。

  • post-receive
#!/bin/bash

# git client ディレクトリを移動する
cd ~/git/pull/

# ここでリモート(ローカルに配置している)リポジトリからpullする
git pull origin master

# んで、デプロイ用のスクリプトを実行
bash ~/deploy.sh
  • deploy.sh
#!/bin/bash

# valiable
# ソースが入っているディレクトリからコピーする。
ROOT_DIR="~/git_pull/git"
DOC_ROOT_DIR="/var/www/htdocs"

# file copy
\cp -rf ${ROOT_DIR}/app/ ${DOC_ROOT_DIR}
\cp -rf ${ROOT_DIR}/lib/ ${DOC_ROOT_DIR}
\cp -rf ${ROOT_DIR}/public_html/ ${DOC_ROOT_DIR}

# make directory
# copyの中に入っているから、これはいらないっぽい
# mkdir -p ${DOC_ROOT_DIR}/app/tmp/cache
# mkdir ${DOC_ROOT_DIR}/app/tmp/logs

# permission
chmod 777 -R ${DOC_ROOT_DIR}/app/tmp


これでおk。post-receiveと同様にdeploy.shにも実行権限を渡すことを忘れないのでね。


今回は自分で書いちゃったけど、こっちを参考にしたほうがいいかも。


qiita.com


まとめ


linuxだから、crontabでも構わないんだけど、できればすぐ反映させたいので、これがやりたかった。


バリバリコミットしていくぞー(^ω^ = ^ω^)おっおっおっ

追記


そういえば、デプロイするシェルスクリプトについて


これはコピーじゃあなくて、rsyncdのほうがいいかも。


ファイルを削除する場合もあると思うので。