Git

gitでシンプルなデプロイ環境を作る

More than 1 year has passed since last update.

gitで最低限のデプロイ環境を作る際のメモ。

いろいろなCIツールを使うまでもない、小規模なコンパイルいらずのWebアプリのデプロイ環境を作る。

CIツールを使う場合でも基礎となる知識なので整理しておく。


やりたいこと


  • ローカルで開発。

  • リモートにpush

  • pushを拾って、公開ディレクトリにpull


イメージ

図で書くとこんな感じ。

git01

今回は、独自のリモートリポジトリを使うが、ここが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ファイルを定義します。


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

などとする。