ももらぼっ!にっき


2012年06月20日 [長年日記]

_ [環境構築] Joe'sのVPSを借りてみた。

OSC2012 北海道に参加したらJoe'sのVPSを1年間無料で貸してくれるとのことで 早速申し込んでみました。 用途も何も考えてないのでアレですが、いろいろやってみたかった環境を 構築してみようと思っています。

_ [環境構築] gitoliteでgitサーバ環境を作成する

…というわけで、今後git環境を自力で構築する機会がありそうなので、 サーバもあることだしやってみることにしました。 google先生に聞いてみるとgitoliteを使うのが良いらしいので、 その環境作成について記録を残しておきます。

情報もそこそこあるし楽勝かと思ったんですが、最近gitoliteがメジャーバージョンアップした為か、 日本語で解説してくれているブログ等の手法が軒並み使えなかったので結構苦労しました…。

Git、Perl等のインストールについてはここでは割愛します。 適当にyumなりapt-getなりしてください。 また、今回はCentOS6.2で構築してますが、多分他のOSでも同じようにいける…はず。

gitolite用ユーザの作成

まずは、gitolite用のユーザを作成します。 githubにならってgitという名前にしてみました。

# useradd git

gitoliteのインストール

git cloneしてgitoliteをインストールします。

# cd /usr/local/src
# git clone git://github.com/sitaramc/gitolite
# gitolite/install -ln /usr/local/bin
# ls -l /usr/local/bin/gitolite
lrwxrwxrwx. 1 root root 36  6月 19 22:25 2012 /usr/local/bin/gitolite -> /usr/local/src/gitolite/src/gitolite

これで、/usr/local/binにgitoliteコマンドのシンボリックリンクが作成されます。 本体はcloneしたリポジトリ上のファイルなので、インストールしたからといって cloneしたリポジトリを消しちゃダメです。

管理者ユーザ用の公開鍵を配置

次に、管理用ユーザの公開鍵を見えるところに置きます。 その際のファイル名がそのまま管理者のユーザ名になるみたい。

admin$ scp ~/.ssh/id_rsa.pub gitserver:/tmp/admin.pub

公開鍵を作っていなければssh-keygenで適宜作成してくださいな。

gitoliteのセットアップ

作成したgitolite用ユーザにsuしてsetupすると、gitoliteの管理用リポジトリと テスト用リポジトリが作成されます。

# su - git
$ gitolite setup -pk /tmp/admin.pub
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
Initialized empty Git repository in /home/git/repositories/testing.git/
WARNING: /home/git/.ssh/authorized_keys missing; creating a new one

公開鍵じゃない?

私の環境ではsetupのところで以下のようなエラーが出てしまってハマりました。

$ gitolite setup -pk /tmp/admin.pub
FATAL: errors found before logfile could be created
FATAL: die      '/tmp/admin.pub' does not seem to be a valid ssh pubkey file

admin.pubが公開鍵じゃないよって言われていて、 確かに、ssh-keygen -lがエラーを出してしまってます。

$ ssh-keygen -l -f /tmp/admin.pub
/tmp/admin.pub is not a public key file.

いろいろ悩んだ結果、ssh-keygenのバージョンが合ってないのかな? と予想を付け「sudo yum update」したら解決しました。 予想が合っていたのかどうかは定かではないが、解決したのでよしとしています。 SSH難しい。

テスト用リポジトリで動作確認

※ここからは、基本的にgitoliteを構築したサーバではなく、ローカルの環境で作業します。 プロンプトの前のadminとかmomotaroとかはユーザ名だと思ってください。

まずは、テスト用のリポジトリで動作確認してみます。

admin$ git clone git@gitserver:testing.git
Cloning into 'testing'...
warning: You appear to have cloned an empty repository.
admin$ cd testing
admin$ echo "Hello gitolite." > hello.txt
admin$ git add hello.txt
admin$ git commit -m"first commit"
[master (root-commit) e68732c] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 hello.txt
admin$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 221 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitserver:testing.git
 * [new branch]      master -> master

うまく動いてるっぽいですね。

別のユーザを作成してみる。

管理者用のユーザでリポジトリの操作ができたので、 次は別のユーザを作成してみることにします。

まずは、管理用のリポジトリをcloneします。

admin$ git clone git@gitserver:gitolite-admin.git
Cloning into 'gitolite-admin'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
admin$ cd gitolite-admin
admin$ tree
.
├── conf
│     └── gitolite.conf
└── keydir
       └── admin.pub

2 directories, 3 files

keydir以下に<ユーザ名>.pubという名前で公開鍵を置いて commit&pushするとユーザが登録されます。

admin$ cp /home/momotaro/.ssh/id_rsa.pub keydir/momotaro.pub
admin$ git add keydir/momotaro.pub
admin$ git commit -m"add momotaro user"
admin$ git push origin master

で、このmomotaro.pubを使ってgit cloneやpushすると 無事に作成されていることがわかります。

momotaro$ git clone git@gitserver:testing.git
momotaro$ cd testing
momotaro$ ls
hello.txt
momotaro$ echo "add comment." >> hello.txt
momotaro$ git commit -am"second commit"
momotaro$ git push origin master

リポジトリを追加してみる。

リポジトリを追加するには、conf/gitolite.confを編集するようです。

admin$ vi conf/gitolite.conf
admin$ git diff
diff --git a/conf/gitolite.conf b/conf/gitolite.conf
index 007f160..e915cb0 100644
--- a/conf/gitolite.conf
+++ b/conf/gitolite.conf
@@ -3,3 +3,7 @@ repo gitolite-admin

 repo testing
     RW+     =   @all
+
+repo repotest
+    RW      =   admin
+    R       =   momotaro
admin$ git commit -am "add repotest repository"
admin$ git push origin master
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 428 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Initialized empty Git repository in /home/git/repositories/repotest.git/
To git@gitserver:gitolite-admin.git
   eae3c06..37ce1c6  master -> master

push時のログからリポジトリが追加されていることが分かります。 また、ついでにユーザ毎のアクセスコントロールもしてみたので、 その辺の検証をしてみることにします。

admin$ git clone git@gitserver:repotest.git
admin$ cd repotest
admin$ echo "Hello repotest." > hello.txt
admin$ git add .
admin$ git commit -m"first commit"
admin$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 223 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitserver:repotest.git
 * [new branch]      master -> master

adminはRWなので、pushできていることが分かります。

momotaro$ git clone git@gitserver:repotest.git
momotaro$ cd repotest
momotaro$ cat hello.txt
Hello repotest.

momotaro$ echo "edit by momotaro" >> hello.txt
momotaro$ git commit -am "second commit"
momotaro$ git push origin master
FATAL: W any repotest momotaro DENIED by fallthru
(or you mis-spelled the reponame)
fatal: The remote end hung up unexpectedly

momotaroユーザはRなので、cloneはできてもpushはエラーになっています。 きちんと権限制御が働いていますね。すばらしい。

リポジトリを消してみる。

検証できたので最後にリポジトリを消してみます。 消す場合はconf/gitolite.confを編集するだけじゃダメっぽいです。

admin$ vi conf/gitolite.conf
admin$ git diff
diff --git a/conf/gitolite.conf b/conf/gitolite.conf
index e915cb0..007f160 100644
--- a/conf/gitolite.conf
+++ b/conf/gitolite.conf
@@ -3,7 +3,3 @@ repo gitolite-admin

 repo testing
     RW+     =   @all
-
-repo repotest
-    RW      =   admin
-    R       =   momotaro
admin$ git push origin master
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 369 bytes, done.
Total 4 (delta 1), reused 1 (delta 0)
remote: WARNING: split conf not set, gl-conf present for 'repotest'
remote: WARNING: split conf not set, gl-conf present for 'repotest'
remote: WARNING: split conf not set, gl-conf present for 'repotest'
remote: WARNING: split conf not set, gl-conf present for 'repotest'
To git@gitserver:gitolite-admin.git
   37ce1c6..055e2c7  master -> master

何やら不審なエラーが出てます。 gitoliteを構築したサーバにログインして手でリポジトリを消してやる 必要があるようでした。

admin$ ssh gitserver
$ su -
# su - git
$ rm -rf repositories/repotest.git

これで本当にいいかは不明です…。 よっぽどのことが無い限りリポジトリは消さない方がよさそうです。

本日のツッコミ(全2件) [ツッコミを入れる]
_ moata (2012年09月19日 18:23)

can somebody please explain in english why am getting error <br>FATAL: die '/tmp/admin.pub' does not seem to be a valid ssh pubkey file

_ とり (2012年10月28日 22:56)

remote: WARNING: split conf not set, gl-conf present for 'repotest' <br>これは私も出ていたので調べてみたら、 <br> <br>http://sitaramc.github.com/gitolite/emergencies.html <br> <br>には、対象のrepo.gitからgl-confを削除すれば良いと書いてありました。 <br>参考になれば。