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
これで本当にいいかは不明です…。 よっぽどのことが無い限りリポジトリは消さない方がよさそうです。
_ moata [can somebody please explain in english why am getting erro..]
_ とり [remote: WARNING: split conf not set, gl-conf present for '..]