さくらVPSにgit環境を構築 & git pushでデプロイ

gitの勉強をかねて、さくらVPSにあるpublic_htmlさんを、gitからCommit&Pushでデプロイ?できる環境を構築してみました。
最初はこんな感じでやりたかったのですが、なんかうまくできませんでした。
push

 

 

 

 

 

最終的にはbitbucket通さずに、そのままリモートとクライアントでやり取りする形になりました。
結構強引ですがメモしておきます。
リモート:CentOS 5.5・ローカル:MacOS X 10.8

1. はじめに

のちに使うgitosisでは、~/.ssh/authorized_keys を管理用リポジトリの
post-update hook を使って自動的に書き換えることでユーザ管理を実現しています。
したがって、gitosis を使うには OpenSSH 形式の ~/.ssh/authorized_keys が使える事が前提です。
sshでの公開鍵認証方式ができるように設定しておきます。
sshの設定

2. gitインストール

gitをインストールします

$ sudo yum install git

ユーザ名とメールアドレスを設定します

$ git config --global user.name "your_name"
$ git config --global user.email "your_mail@your.com"

3. gitosisインストール

次にgitosisをインストールします。
このツールで複数ユーザのSSHを利用したリポジトリの共有ができます。
類似のサービスにgitliteがありますが,今回はなんとなくこっちにしました。

gitosisをインストールします。

$ sudo aptitude install gitosis
 以下の新規パッケージがインストールされます:
   gitosis python-pkg-resources{a} python-setuptools{a} 
 更新: 0 個、新規インストール: 3 個、削除: 0 個、保留: 0 個。
 284kB のアーカイブを取得する必要があります。展開後に 1217kB のディスク領域が新たに消費されます。

次に適当な公開鍵を使ってリポジトリを初期化します。
gitosisは~/.ssh/authorized_keysに必要な定義を追加します。
新しくgit用のユーザーを作成してもok

gitosis user でsshkeyを作っておく.

$ sudo su gitosis
gitosis$ gitosis-init < ~/.ssh/id_rsa.pub
 Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
 Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
gitosis$ ls -a
 .ssh     gitosis  repositories

これで、リモート側のgitosisの設定は終わりです。
あとはクライアント側から設定用のリポジトリをcloneして、そこで設定を編集します。

 ※ ローカル側での操作(SourceTreeなどのgitクライアント用のソフトを使っても良い。その場合はこのような感じでcloneできるはずssh://gitosis@your_remote_server.com:22(ssh port)/gitosis-admin.git)

 $ git clone gitosis@your_remote_server.com:gitosis-admin.git
 Initialized empty Git repository in /home/osamu/gitosis-admin/.git/
 remote: Counting objects: 5, done.
 remote: Compressing objects: 100% (4/4), done.
 remote: Total 5 (delta 0), reused 5 (delta 0)
 Receiving objects: 100% (5/5), done.

cloneが完了すると以下の様なディレクトリ構成、鍵の配置、confファイルの内容になっているはず

$ ls
 gitosis-admin
$ cd gitosis-admin/
$ ls
 gitosis.conf    keydir
$ ls keydir
 user_name@your_server_name.pub
$ cat gitosis.conf
 [gitosis]
 
 [group gitosis-admin]
 writable = gitosis-admin
 members = your_name@your_server_name.com

新しいユーザーを追加する場合は、そのユーザーの鍵をkyedirディレクトリにコピーして、confファイルを設定する。
登録した公開鍵を使って gitosis アカウントにログイン可能になる。

4. 新規リポジトリ作成

ここでようやくpublic_htmlが登場する。
先ほどのgitosis.confに以下のように追加し、pushする。

※ ローカル側での操作
$ vi gitosis.conf
...
[group gitosis-admin]
members = your_name@your_server_name.com
writable = public_html
...
$ git commit -a -m "my_project created"
$ git push

gitosisの設定がこれで完了したので、ローカル側でpublic_htmlディレクトリを作成し、pushしてリモートへ反映させる。

$ mkdir public_html
$ cd public_html
$ git init
$ git remote add origin gitosis@your.server.com:public_html.git
$ git push origin master:refs/heads/master

5. git pushしたときにデプロイされるようにする

リモート側に接続し、gitosisでログイン。
リモート側の中でもcloneし、リポジトリを展開する。

$ su gitosis
gitosis$ git clone /var/lib/gitosis/repositories/public_html.git
Initialized empty Git repository in /var/lib/gitosis/repositories/public_html/.git/

ローカルからのpushを受け取ったらこのディレクトリでpullされるように、hookスクリプトの設定をする。
post-receiveに「(cd /var/lib/gitosis/repositories/public_html; git –git-dir=.git pull)」を追記する。
以下のようになるはず。

sh-4.1$ cd public_html.git
sh-4.1$ ls
HEAD  branches	config	description  hooks  info  objects  refs
sh-4.1$ cd hooks
sh-4.1$ ls
applypatch-msg.sample  post-commit.sample  post-receive.sample	post-update.sample     pre-commit.sample  prepare-commit-msg.sample
commit-msg.sample      post-receive	   post-update		pre-applypatch.sample  pre-rebase.sample  update.sample
sh-4.1$ cat post-receive
#!/bin/sh
#
# An example hook script for the "post-receive" event.
#
# The "post-receive" script is run after receive-pack has accepted a pack
# and the repository has been updated.  It is passed arguments in through
# stdin in the form
#    
# For example:
#  aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
#
# see contrib/hooks/ for a sample, or uncomment the next line and
# rename the file to "post-receive".
#. /usr/share/git-core/contrib/hooks/post-receive-email

(cd /var/lib/gitosis/repositories/public_html; git --git-dir=.git pull)

6. シンボリックリンク作成

実際、各ユーザのpublic_htmlをリポジトリの展開先にすればいいと思っていたのだが、
権限の関係でうまくいかなかったので、シンボリックリンクを作成して誤魔化した…orz

ファイルやディレクトリのシンボリックリンクを作成するコマンドは

$ ln -s ~/doc/work/link-moto.txt ./link-saki/

なので、これを使ってpublic_htmlにリンクをはる。

[root@user_name repositories]# ln -s /var/lib/gitosis/repositories/public_html /home/user_name/public_html

あと、/home/user_name/のパーミッションを711にしておく。chmod 711 /home/user_name

はぁ、もっとうまくやりたい…

About

プログラムと農業とスノーボードと釣り

Read More