gitを用いてWebサイトのバージョン管理をする際に、pushしたら自動でサイトに更新を反映してくれるというものです。わざわざ、毎回Webサーバーにsshでログインして作業する手間が省けるので、とても便利です。
構成
- ローカル : MacBook
- サーバー : 仮想マシーン(Ubuntu Server) + nginx
※公開キー 認証でMacBookと仮想マシーンはssh接続できる状態です。
やりたい事としては、
- ローカルの環境(Mac)で開発を行う。
- git pushでサーバーにpushする。
- サーバーはmasterブランチにpushされた場合は、ファイルの更新を行う。
- Webサイトに更新が反映される!
といった流れです。
環境構築
環境構築のおおまかな流れ
- サーバー上の公開ディレクトリをgitで管理する
- bareリポジトリを作成する
- bareリポジトリにpushされたら自動的にデプロイするように設定
- ローカルにcloneしてくる
bareリポジトリの作成
現在、公開しているディレクトリを~/web_root/とします。ここで、web_rootをgitで管理するためにinitして、現在ディレクトリ無いにあるファイルをすべて追加します。
cd ~/web_root/ git init git add . # 現在ディレクトリ内にあるファイルをすべて追加 git commit -m "first commit" # 適当にコミット
これで、現在の公開ディレクトリをgitで管理することができました。
次は、ベアリポジトリを作成します。ベアリポジトリとは、実際のファイルを持たない更新の情報のみを持っているリポジトリで、複数人で作業をする際に用いられるそうです。複数人で作業をする際にノンベアリポジトリに直接プッシュすると問題があるので、ベアリポジトリを作成しそこにたいして変更を行うそうです。
こちらのサイトの説明がとてもわかりわかりやすかったです。
ベアリポジトリとノンベアリポジトリ:理論編〜GitでWordPressのテーマを管理
(http://www.nekotricolor.com/entry/theory-of-bare-and-non-bare-repository-manage-wordpress-themes-with-git)
ベアリポジトリの作成
cd ~ git clone --bare web_root .web_root.git --> cloning into bare repository '.web_root.git' --> ...done.
web_rootのベアリポジトリを.web_root.gitとして作成されました。(.gitと最後につけるのはベアリポジトリの慣習だそうです。)
サイト更新の自動化
ベアリポジトリにpushされた際に、自動で公開されているリポジトリ(web_root)が更新されるようにします。
cd ~/.web_root/hooks/ ls --> applypatch-msg.sample --> commit-msg.sample --> post-update.sample --> pre-applypatch.sample --> pre-commit.sample --> pre-push.sample --> pre-rebase.sample --> prepare-commit-msg.sample --> update.samplevim
いろいろファイルがありますが、このディレクトリでpost-receiveに記述された内容がpushされた際に実行されるみたいです。
今回は、postされた際に公開リポジトリ側からpullさせたいので、このような記述になります。
vim post-receive # 新たに作成する == post-receiveの内容 == #! /bin/sh cd ~/Develop/web_root/ git --git-dir=.git pull ~/Develop/.web_root.git master
これを記述して保存。実行権限がないので、実行権限を付加します。
chmod +x post-receive
これで、.web_root.gitにpushされた際にweb_rootが自動でpullを行いページの内容が更新されるようになりました。以上で、サーバー側の設定は終了です。
ローカル環境
先ほど作成したベアリポジトリをローカル環境にcloneしてきます。
git clone ユーザ名@ホスト名:~/.web_root.git
ユーザ名@ホスト名はsshの接続先(Webを公開しているサーバーにsshで接続する際と同じ)で、user@example.com みたいな感じになります。~/.ssh/configに設定を書くと便利になるので、ぜひ調べてみてください。
cloneしてきたディレクトリ内で作業を行い、変更後にpushを行うとサーバー側のファイルも更新されています。
# (変更後) git commit -am "デプロイテスト" git push origin # 何かエラー(サーバー側を含めて)があれば、ここにエラーメッセージが表示される --> Counting objects: 6, done. --> Delta compression using up to 4 threads. --> Compressing objects: 100% (5/5), done. --> Writing objects: 100% (6/6), 631 bytes | 0 bytes/s, done. --> Total 6 (delta 1), reused 0 (delta 0) --> remote: From /home/takunoko/Develop/.web_root --> remote: * branch master -> FETCH_HEAD --> remote: Updating e80469a..9277b5f --> remote: Fast-forward --> remote: index.html | 4 ++-- --> remote: index.php | 3 +++ --> remote: 2 files changed, 5 insertions(+), 2 deletions(-) --> remote: create mode 100644 index.php --> To vm_ubuntu:~/Develop/.web_root.git --> e80469a..9277b5f master -> master # こんな感じのメッセージがでればOK
これで、サイトに更新が反映されるはずです。めでたしめでたし。
GitHubでも管理する
ついでに、ソースコードをGitHubでも管理したいと思います。
GitHubでリポジトリを作成後にリモートリポジトリを追加します。
git remote add github https://github.com/takunoko/(リポジトリ名).git # ファイルに変更を加えてpushする際に、push先を指定する git push github # githubにpush git push origin # 先ほど設定したベアリポジトリへpushする
これで、ソースコードはGitHubで管理して、ベアリポジトリにpushすると自動でサイトが更新されるという構成にできました。便利!!
まとめ
ベアリポジトリを用いてサーバーの更新を行うことによって、pushを行うだけで変更を反映できるというのはかなり便利です。
(gitの使い方をもっとしっかり勉強せねば。。。)
参考サイト
git pushでデプロイを自動化する | 中庸の道
[http://kouritsu.biz/auto-deploy-by-git-hook-and-git-push/]
Gitのフック(hook)を使って自動的にデプロイする | Smart (rfs.jp)
[http://rfs.jp/server/git/git-hook-post-receive.html]
ベアリポジトリとノンベアリポジトリ:理論編〜GitでWordPressのテーマを管理
| トリコロールな猫
[http://www.nekotricolor.com/entry/theory-of-bare-and-non-bare-repository-manage-wordpress-themes-with-git]
訂正
記事の途中サイト更新の自動化あたりからweb_rootがlab_log(自分の実行した際のディレクトリ名)になっていましたので訂正しました。ご指摘ありがとうございます。
2015/10/17
すごくいい記事なんですが、web_rootがlab_logに突然変わっているので混乱します。直したほうが良いのでは?
ご指摘ありがとうございます。
確かに途中からweb_rootがlab_log(自分が実行した時のディレクトリ名)に変わっておりました。
修正いたしました。