gitで最低限のデプロイ環境を作る際のメモ。
いろいろなCIツールを使うまでもない、小規模なコンパイルいらずのWebアプリのデプロイ環境を作る。
CIツールを使う場合でも基礎となる知識なので整理しておく。
###やりたいこと
- ローカルで開発。
- リモートにpush
- pushを拾って、公開ディレクトリにpull
###イメージ
図で書くとこんな感じ。
今回は、独自のリモートリポジトリを使うが、ここがGitHubとかでもいい。
###前提条件
- ローカル、リモートにgitがインストールされていること(Mac想定)
- リモート(サーバ)にはsshで透過ログインできること
###手順
まずは、push,pullの流れを手動でやってみる。
####リモートリポジトリの用意(リモート)
とりあえず、外からは非公開かつ、チームがアクセスできるディレクトリを用意し、リモートリポジトリにする。
cd /var/www
sudo mkdir test.git
cd test.git
git init --bare
必要に応じて、適切なグループ権限等を設定する。通常はチームメンバーに対する書き込み権限が必要でしょう。みんなに共有する場合は、
git init --bare --shared
とかのほうが早い。
####ローカルの作業場の作成とリモートの登録
まずは、作業フォルダとpushするテストファイルを作っておきます。
mkdir test
cd test
git init
echo "hello" > index.html
git add .
git commit -m "1st commit"
commitしたものが無いとエラーになるのでコミットしておきます。
リモートリポジトリを登録するには、
git remote add origin ssh://servername/var/www/test.git
とする。前提でも書きましたがが、sshログインができることが前提です。
####とりえずpushしてみる
とりあえず、pushできるかやってみます。
git push origin master
エラーが出たなら対処します。
####とりあえずpull(clone)してみる。
最初は、リモートリポジトリも何も登録されていないのでcloneしてみます。
cd /var/www/html
git clone /var/www/test.git test
ブラウザでアクセスしてみると、
hello
と表示されている。
あとは、pushをhookして、自動的にpullするようにすれば良い。
####リモートサーバからのclone
上記の例では、ローカル経由でcloneしたが、通常は、リモートリポジトリと最終デプロイ先であるサーバは分離されていることが普通である。その場合、
git clone ssh://username@servername/var/www/test.git
という書式でcloneすればいい。このとき、もちろんサーバ間でsshログインできるよう鍵の設定が必要である。
###自動化してみる
自動化は、pushを検知して、それをトリガーにして、pullを実行する。
パスフレーズ有りのssh鍵を使う場合は、自動化の中にpassphrase入力自動化のロジックが必要になり面倒です。ssh-agent,sshpass等を使うか、passphrase無しの鍵を使うのが無難です。
####パスフレーズを要求しないようにする
鍵をいじれる環境なら、
cd ~/.ssh
mv id_rsa id_rsa.old
openssl rsa -in id_rsa.old id_rsa
chmod 600 id_rsa
とする。
####リモートリポジトリのpost-receiveを設定する
リモートリポジトリには、各種イベントをhookして、スクリプトを実行する仕組みがあります。pushを検知して何かをやるには、post-receiveというのを定義します。
cd /var/www/test.git/hooks
vi post-receive
で、post-receiveファイルを定義します。
#!/bin/sh
cd /var/www/html/test
git --git-dir=.git pull
としします。デプロイ先のディレクトリに移動し、そこでgit pullをします。ただ、書き方は上記の用に少し特殊。
CIツールは、このシェルスクリプトが巨大化したものだと思っていていいだろう。
post-receiveファイルは実行形式でる必要があるので、
chmod a+x post-receive
として実行権限を与える。ちゃんと動くか、
./post-receive
などとして単独で実行してみる。動くようなら、あとは一連の動きを試す。
###一連の動きを試してみる
最初にローカルで作ったindex.htmlを編集し、add, commit, pushをしています。
#編集
git add .
git commit -m "hoge"
git push origin master
リモートサーバ上のファイルが更新されていればOKです。
本番サーバがある場合にも、本番サーバのDocument rootでpull(clone)すればいいでしょう。
以上。
###パーミッションについて
チームで開発する場合、メンバーに適切なパーミッションを付与する必要がある。気をつけるのは、
1.リモートリポジトリに対する権限
2.デプロイ先対する権限
の2つ。
1.の場合、
error: insufficient permission for adding an object to repository database ./objects
とか言われる。これは、--sharedにしておけば解決できる。
2.の場合、
error: cannot open /var/www/html/test/.git/FETCH_HEAD: Permission denied
などと言われる。
どちらも、メンバーが所属するグループを作成し、該当のフォルダ、ファイルに対して、
chgrp -R groupname dir
chmod -R g+w dir
などとすればいい。
###メモ
####リモートリポジトリの確認
git remote
リポジトリ等の内容の確認
git config -l
リモートリポジトリの削除
git remote rm origin
などとする。