Subversion サーバは昔も家にたてていたのですが、ローカルサーバを Atom 機にしてからまだインストールしていなかったので CentOS 5.5 上に改めて構築してみました。
すぐたつと思ったら、いろいろ罠があってはまったのでメモ代わりの投稿です。 結論から言うと思った通りにたてることができませんでした。。orz
とりあえず、CentOS 5.5 に subvesion と Apache + mod_dav_svn をインストール。 mod_dav_svn は新しいものを使いたかったので、rpmforge から 1.6 系をもってきています。
[root@localhost conf.d]# rpm -q httpd
httpd-2.2.3-43.el5.centos
[root@localhost conf.d]# rpm -q mod_dav_svn
mod_dav_svn-1.6.12-0.1.el5.rf
でもって、/etc/http/conf.d/subvesion.conf を以下のようにしました。 全権限を BASIC 認証にしたのと、DocumentRoot が Apache とかぶると問題がでるようなので、新しいポートで mod_dav をたてています。
<VirtualHost *:8082>
<Location />
DAV svn
SVNParentPath /home/apache/svn
SVNListParentPath on
DavDepthInfinity on
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from 192.168.0.0/24
AuthType Basic
AuthName "Authorization Realm"
AuthUserFile /home/apache/passwd/.htpasswd
Require valid-user
</Location>
</VirtualHost>
DocumentRoot かぶりの問題は、mod_dav_svn の FAQ に記載がありました。
Webブラウザからリポジトリを見られるようにしているんだけど、’svn checkout’ が、「301 Moved Permanently」というエラーになる。何が悪いの?
解決策としては、リポジトリの<Location>を、通常の Web 共有として既に公開されている領域とオーバーラップしないようにするか、もしくはその中へ収めるべきだ。
ここがまず一発目にはまったポイントでした。。
さてディレクティブに SVNParentPath というのがありますが、これが親ディレクトリから subversion を使う設定です。 要はプロジェクトの作成の権限をユーザがもてることになります。
てなわけで、Eclipse の Subclipse (SVNKit) からプロジェクトの共有を発行すると…。
svn: can not read HTTP status line
PROPFIND request failed on '/'
エラー。。 なじぇ。。
http status line が読めないということで、まず SVNKit のソースを疑ったのが間違いの始まり。。 org.tmatesoft.svn.core.internal.io.dav.http の自前パーサでやっているようだったので、バグっているのかと。。
で、いろいろいじっていると、なんと本気で PROPFIND メソッドで status line が返ってきていないことが発覚。。
hiromasa@hiromasa-cube:~$ telnet 192.168.0.100 8082
Trying 192.168.0.100...
Connected to 192.168.0.100.
Escape character is '^]'.
PROPFIND / HTTP/1.1
Host: aaa
Authorization: Basic fjwi094j403fj49fj949
Connection closed by foreign host.
いきなりぶったぎられています。。 おかしいなぁということで、SVNParentPath の下に svnadmin create test とかして svn リポジトリをつくってそこを対象に同じ事をしてみると…
hiromasa@hiromasa-cube:~$ telnet 192.168.0.100 8082
Trying 192.168.0.100...
Connected to 192.168.0.100.
Escape character is '^]'.
PROPFIND /test HTTP/1.1
Host: aaa
Authorization: Basic fjwi094j403fj49fj949
HTTP/1.1 207 Multi-Status
Date: Sat, 21 Aug 2010 01:51:23 GMT
Server: Apache/2.2.3 (CentOS)
Content-Length: 2306
Connection: close
Content-Type: text/xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8"?>
(以下略)
ちゃんと返ってくる~。 なじぇ~。 権限?ということで OPTIONS を発行してみると、、
hiromasa@hiromasa-cube:~$ telnet 192.168.0.100 8082
Trying 192.168.0.100...
Connected to 192.168.0.100.
Escape character is '^]'.
OPTIONS / HTTP/1.1
Host: aaa
Authorization: Basic fjwi094j403fj49fj949
HTTP/1.1 200 OK
Date: Sat, 21 Aug 2010 01:43:25 GMT
Server: Apache/2.2.3 (CentOS)
DAV: 1,2
DAV: version-control,checkout,working-resource
DAV: merge,baseline,activity,version-controlled-collection
DAV: http://subversion.tigris.org/xmlns/dav/svn/depth
DAV: http://subversion.tigris.org/xmlns/dav/svn/log-revprops
DAV: http://subversion.tigris.org/xmlns/dav/svn/partial-replay
DAV: http://subversion.tigris.org/xmlns/dav/svn/mergeinfo
DAV: <http://apache.org/dav/propset/fs/1>
MS-Author-Via: DAV
Allow: OPTIONS,GET,HEAD,POST,DELETE,TRACE,PROPFIND,PROPPATCH,COPY,MOVE,LOCK,UNLOCK
Content-Length: 0
Connection: close
Content-Type: httpd/unix-directory
Connection closed by foreign host.
ちゃんと Allow されているっぽい。。 なぞぞーん。。
で、ふと Apache の error_log を PROPFIND したタイミングでみてみると、、
[Sat Aug 21 11:53:30 2010] [notice] child pid 3497 exit signal Segmentation fault (11)
セグってるし。。 どうりですぐ切断されるはずです。。
てなわけで Apache が悪いのか mod_dav_svn が悪いのか、組み合わせが悪いのかちょっと分かりませんが、これ以上はぼくの手におえなそうです。 まぁアプリ的な設定が悪いわけではなさそうなのが収穫。
とりあえず SVNParent に直アクセスするのはあきらめて、プロジェクトできるたびに svnadmin create する運用にしたいとおもいます。 Eclipse にリポジトリいっぱい登録しなきゃいけないのがいたいですが、しょうがない。。
無事 Eclipse や TortoiseSVN からもみることができるようになりました。
ほいでもって、Redmine からも接続。
Eclipse の mylyn から Redmine につなげば、チケットとくくりつくようなことも可能なはずです。 もうちょっとやってみるデス。


























Redmine を Tomcat6 にデプロイ
先日インストールしましたプロジェクト管理ツールの Redmine ですが、1.0.1 として 1系の正式版がでました!
というわけで、先日は mod_rails で動作させていましたが、せっかくなので今度は JRuby を使って Tomcat6 上にデプロイしてみたいと思います。
なにか利点があるかって話ですが、1パッケージにして JavaVM で動作させておけば、OS にのっている Ruby 実行環境に依存しなくて済むのがいいところ。 gem のバージョン依存とか考えなくていいし、Servlet の実行環境さえあればどこにでも乗せられるのでなかなか便利かもしれません。
とりあえず、.war 玉をつくる作業した環境は以下の通りです。
java version "1.6.0_21"[sudo] password for hiromasa:まずは、JRuby のインストールから。
$ sudo wget http://jruby.org.s3.amazonaws.com/downloads/1.5.2/jruby-bin-1.5.2.tar.gzでもって、必要な gems を入れていきます。 ぼくは PostgreSQL で動作させているため、jdbc はポスグレのになります。
warbler というのが、Rails のアプリを .war 玉にしてくれるありがたいものです。 あと、rack が 1.0.1 じゃないと後で Redmine を動かしたときに Exception するので入れておきます。
でもって、Redmine をダウンロードしてきて、普通に config を設定していきます。 config/database.xml については以下のように。
# MySQL (default setup).以下、Redmine のファイルを置いた直下のディレクトリにて。
これで DB のマイグレーションができるハズです。(ここでは .war をつくるのと同じ環境に入れてます)
$ sudo jruby -S rake db:migrate RAILS_ENV="production"でもって、いよいよ warbler で .war をつくります。 まずは config をつくってもらいます。
ほいでもって、できた config を編集。
config/warble.rb
config.gems << "activerecord-jdbcpostgresql-adapter"config.gem_dependencies = trueconfig.webxml.rails.env = 'production'最後の rack のバージョン指定をしないと依存関係でおちるようです。(新しい方が使われてしまう)
できたら、いよいよ。
1: $ sudo jruby -S warbleこころを込めて配置します。 ここでは、war つくった環境と同じなのでそのまま…
無事デプロイ成功。 起動しました。
でもって、添付ファイルについてが気になって調べてみたのですが、どうやら WEB-INF/files に置かれる模様。 こんなところに置いてたらちょっとしたことで消えちゃういますのでシンボリックリンクで対応。
デプロイするたびにですが、しょうがないですね。 設定とか実はあるのかもしれませんがとりあえず。 あとは必要なら mod_ajp でつなぐなど。
というわけで、できあがった redmine.jar と Tomcat さえあればどこでも動くようになりました。 とりあえず事務所に持って行きます。。(笑)
DB マイグレーションは、 .war 作成でつかった JRuby 自体もただコピーするだけで他に持って行けると思うので、それでマイグレーション動かするのが良さそうですね。
エクスポートインポートでいければ Stax Networks とかにもデプロイできるかもしれません。(ただしファイルがかけないため、添付ファイルはだめだと思われる)
さて気になる .war ファイルですがほどいてみると以下のようになっていました。
画像が小さくて見にくいですが、WEB-INF/gems/gems に依存する gems が格納されるようです。 あとは、ひとつの filter から jruby を起動して .rb を動的コンパイルしつつ動作という感じでしょうか。
動きはきびきびして、いい感じです。 先ほど入れて一通り動作見たばかりなので、もうちょっと動作させてみたいと思います。
以上、デプロイ田中でした。 ざっ。