アカベコマイリ

HEAR NOTHING SEE NOTHING SAY NOTHING

さくらのVPS を使いはじめる 8 - Redmine と Subversion

さくらのVPS への作業メモ 8。今回は Subversion のインストールと Redmine 連携設定などをおこなう。

入門 Redmine 第 2 版

今回の設定で非常に参考になった書籍を紹介しておく。

Redmine を利用するなら必携の書。私は Chapter 4 「システム管理者編」を読むために購入したのだが他の章もスクリーンショットや設定例が満載。Redmine だけではなく Apache や Subversion の連携についても丁寧に解説されている。

チケット駆動についてピンとこない人も、Chapter 1 ~ 2 を読むうちに有用性を理解できそう。Trac との比較も面白い。次の版を出すときは Remember The MilkToodledo のようなタスク管理サービスとしての側面も掘り下げて欲しい。

Apache モジュールの設定を httpd.conf から分離する

前回まで Passenger の設定を httpd.conf の末尾に記述していたのだが追加モジュールの設定は外部へ分離することにした。何か機能を追加するたびに httpd.conf を編集するのは面倒でミスも入りやすい。

幸い Apache には conf.d という特別なディレクトリが用意されていて、そこに *.conf という形式でファイルを保存しておくと自動的に読み込まれる。この動作は httpd.conf 内の以下の設定によっておこなわれる。

#
# Load config files from the config directory "/etc/httpd/conf.d".
#
Include conf.d/*.conf

まず /etc/httpd/conf/httpd.conf 末尾の Passenger 用の設定を切り取る。そして以下のようにファイルを新規作成して...

$ sudo vi /etc/httpd/conf.d/passenger.conf

切り取った内容を貼り付けて保存。

LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.15
PassengerRuby /usr/local/bin/ruby

RailsBaseURI /redmine

/etc/httpd/conf.d の内容は以下。

$ ls -l /etc/httpd/conf.d
合計 20
-rw-r--r-- 1 root root  392  8月 31 01:32 README
-rw-r--r-- 1 root root  230  9月 23 15:39 passenger.conf
-rw-r--r-- 1 root root  566  8月 31 01:32 proxy_ajp.conf
-rw-r--r-- 1 root root 1181  8月 11  2009 subversion.conf
-rw-r--r-- 1 root root  299  8月 31 01:32 welcome.conf

Apache の設定確認と再起動をおこなう。

  • 追記 2010/10/04

    • apachectl restart よりも service httpd restart の方が Apache の状態を表示する分、望ましいと思うので訂正
$ sudo apachectl configtest
Syntax OK
$ sudo service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

成功なら passenger.conf が読み込まれて Redmine も正常動作するはず。

Subversion のインストール

Redmine の重要な機能にバージョン管理ツールとの連携がある。ソース コード修正などをおこないバージョン管理ツールにコミットする時、どのチケットに起因する変更だったのかを記録したりチケットの状態を解決にできたりする。連携可能なバージョン管理ツールは以下。

これらの内 Subversion (以下、SVN) と Git のどちらかを採用しようと考えていた。Git も魅力的で特にローカル リポジトリには惹かれるものがあったがノウハウやツールの充実から今回は SVN にする。SVN から Git への移行も可能なので今すぐ Git にしなくてもよいという考えもある。

ではさっそくインストールしてみよう。標準でパッケージが用意されているので yum を利用できる。

$ sudo yum -y install subversion
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * addons: www.ftp.ne.jp
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Setting up Install Process
Package subversion-1.4.2-4.el5_3.1.x86_64 already installed and latest version
Package subversion-1.4.2-4.el5_3.1.i386 already installed and latest version
Nothing to do

あれ?インストール済みなのか?まあ、入っているのでよしとする。そしてバージョン確認。

$ svn --version --quiet
1.4.2

リポジトリの作成

まずはすべてのリポジトリのルートとなるディレクトリを作成する。この中に各リポジトリ用のサブ ディレクトリを作成してゆくことになる。

$ sudo mkdir /var/lib/svn

次にリポジトリをひとつ作成してみる。

今回は Owl というライブラリを管理するために owl という名前にしてみる。リポジトリ名はすべて小文字とした。オープンソース プロジェクトでも仕事でも大文字の混じったリポジトリ名を見たことがないので意味のある慣習なのだろう。

$ sudo svnadmin create /var/lib/svn/owl

作成されたレポジトリ内のファイルやフォルダは初期状態では root 所有となっている。これを Apache 経由でアクセスしたいので Apache の実行ユーザーから読み書きできるように所有者を変更しておく。確認のために中身を表示。

$ sudo chown -R apache:apache /var/lib/svn/owl
$ ls -l /var/lib/svn/owl
合計 28
-rw-r--r-- 1 apache apache  229  9月 23 13:57 README.txt
drwxr-xr-x 2 apache apache 4096  9月 23 13:57 conf
drwxr-xr-x 2 apache apache 4096  9月 23 13:57 dav
drwxr-sr-x 5 apache apache 4096  9月 23 13:57 db
-r--r--r-- 1 apache apache    2  9月 23 13:57 format
drwxr-xr-x 2 apache apache 4096  9月 23 13:57 hooks
drwxr-xr-x 2 apache apache 4096  9月 23 13:57 locks

moddavsvn のインストールと設定

moddavsvn を利用すると、Apache 経由で Subversion のリポジトリを操作できる。Subversion 専用のポートを開放する必要もない。WebDAV を利用して公開することになるのでブラウザからもリポジトリを表示できる。

まずはインストール。yum を利用できるので非常に手軽。

$ sudo yum -y install mod_dav_svn
... 中略 ...
Installed:
  mod_dav_svn.x86_64 0:1.4.2-4.el5_3.1

Complete!

次は設定だが moddavsvn は Apache 用のモジュールなので /etc/httpd/conf.d に専用の conf ファイルを追加する。

$ sudo vi /etc/httpd/conf.d/svn.conf

そして以下のように編集。

<Location /svn>
    DAV           svn
    SVNParentPath /var/lib/svn
    AuthType      Basic
    AuthName      "Subversion Repository"
    AuthUserFile  /etc/httpd/conf.d/svn_auth
    Require       valid-user
</Location>

Location ディレクティブにはリポジトリのルートを指定。3 行目のリポジトリ指定もルートとした。この指定ならばすべてのリポジトリに同じ設定が適用される。リポジトリを追加した場合でも conf ファイルの変更や Apache の再起動が不要なので便利である。リポジトリごとに設定を分ける場合は、ディレクティブの指定を /svn/リポジトリ名 として SVNParentPath の代りに SVNPath、内容はリポジトリへのパスとする。

4 行目以降は BASIC 認証に関する設定。これを指定することで Web ブラウザーなどからリポジトリにアクセスしたときユーザーとパスワードによる保護をおこなえる。

次はパスワード ファイルを作成する。svn.conf の 6 行目に指定したパスに touch コマンドでファイルを用意してパスワードを設定。USERNAME の部分は SVN のリポジトリにアクセスするユーザーを記述すること。

Redmine からのリポジトリ参照にもここで設定した内容が必要。Redmine にユーザーを作成済みならば、そのユーザーとパスワードを指定することで Redmine のログイン情報を利用したリポジトリ参照がおこなえる。便利だ。

$ sudo touch /etc/httpd/conf.d/svn_auth
$ sudo htpasswd /etc/httpd/conf.d/svn_auth USERNAME
New password: XXXXXX
Re-type new password: XXXXXX
Adding password for user USERNAME

すべての設定を終えたら Apache の設定チェック & 再起動。

$ sudo apachectl configtest
Syntax OK
$ sudo service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

成功していれば Web ブラウザーから http://XXX.XXX.XXX.XXX/svn/リポジトリ名 へアクセスすることでリポジトリ情報を閲覧できる。BASIC 認証を有効にしているのでユーザーとパスワードの問い合わせダイアログが表示されるだろう。

リポジトリの使用準備が整ったらファイルなどを追加してみる。Windows ユーザーなら TortoiseSVN を利用するのが手軽でよい。以前、このブログで紹介したときはローカルにリポジトリを作っていたが今回はさくらのVPS 上に作成したリポジトリの URL を指定してリポジトリブラウザを開いて操作する。

TortoiseSVN

こんな感じで登録してみた。

Redmine とリポジトリの関連付け

Redmine のプロジェクトとリポジトリを関連付けてみる。まずはプロジェクトのページにアクセスして、メニューから「設定」→「リポジトリ」を選択。バージョン管理システムには Subversion、URL はリポジトリの URL を指定する。

リポジトリとの関連付け

リポジトリのユーザーとパスワードに Redmine へログインしているユーザーが設定されているならば、そのまま「作成」ボタンを押す。リポジトリを見るための専用ユーザーを指定する場合は先にユーザーとパスワードを追加しておき (前述)、それを設定する。

関連付けが完了したのでさっそく表示してみよう。プロジェクトのメニューからリポジトリを選ぶと専用のページに移動する。

リポジトリが見えない

あれ?エラーが出ている。リポジトリに 、エントリ/リビジョンが存在しません。とはどういうことなのだろう?このキーワードでググると Redmine の処理に不具合があり SVN から取得したリストをうまくパースできないらしい。確かに Redmine のログファイルを見ると以下のように出力されている。

Error parsing svn output: #<REXML::ParseException: No close tag for /lists/list>

で、これを直す為には Redmine ディレクトリ内の lib/redmine/scm/adapters/subversion_adapter.rb を修正しなければならないそうだ。しかし流石に 1.0.1 としてリリースされているソフトウェアでこんなバグが残っているとは思えない。

他の要因としてはリポジトリのパスを Redmine がうまく解釈できないことがあるそうだ。原因確認のためにRedmine のディレクトリ内で SVN のリポジトリリストを出力してみる。

$ cd /var/lib/redmine
$ svn list --xml http://XXX.XXX.XXX.XXX/svn/owl
<?xml version="1.0"?>
<lists>
<list
   path="http://XXX.XXX.XXX.XXX/svn/owl">
認証領域: <http://XXX.XXX.XXX.XXX:80> Subversion Repository
'XXXX' のパスワード:
... 中略 ...
</list>
</lists>

中略の部分にはリポジトリの構成が XML形式で出力されている。OK ということなのだろうか?ではなぜ、Redmine から表示できないのだろう?と思ってもう一度、Redmine からリポジトリのページにアクセスしてみると...

Redmine から見たリポジトリ

あれ?**表示できてる!なんか既視感を覚える展開だ。svn list --xml を実行してリスト出力した効果なのだろうか?釈然としないのでこの後に 2 つリポジトリを作成して別プロジェクトと関連付けてみたりしたのだがエラーになることはなかった。謎すぎる。

だがとりあえず Redmine とバージョン管理システムを連携運用するところまでは成功。さくらのVPS を借りた目的として、もっとも大きいものが解決したので、作業メモのシリーズとしてはいったん、終わりにする。

...今回はここまで。残る作業は細かなメンテナンスぐらいなので、今後は個別に記録してゆく予定。

Comments from WordPress

  • moat5 2011-02-01T16:24:06Z

    [Apache モジュールの設定を httpd.conf から分離する]のRailsBaseURIの値に、タグが表示されていました。ご報告まで。

  • mota5 2011-02-01T16:26:16Z

    おかげさまで、Redmineを稼動させることができました。ありがとうございました。ただ、railsは3.0.3のままでいけてしまいました。

  • akabeko akabeko 2011-02-01T23:05:00Z

    @moat5
    [Apache モジュールの設定を httpd.conf から分離する]のRailsBaseURIの値に、タグが表示されていました。ご報告まで。

    すみません。タグが表示されるというのは、どのような状態なのでしょうか?
    コード部分に HTML タグが混じったりするのでしょうか。

    この記事を Firefox 3.6.13、IE8、Chrome 8 で表示してみたのですが、RailsBaseURI のコード部分は正常に表示されているようでした。

    なお、上記とは関係ないのですが、この調査のおかげでこのブログを IE で表示した時、スクリプトエラーになる問題に気付いたので、修正しておきました。

    コメント欄の枠などを角丸にするために利用していた jQuery プラグインでエラーになっていました。今は無効にしてあります。

  • mota5 2011-02-26T07:35:49Z

    @akabeko
    あら。いま見ましたらRailsBaseURIの部分が正常に表示されていました。。。ちなみに、Chromeで見ていました。

  • ji-ta 2012-03-05T07:41:37Z

    丁寧な解説で助かっております。

    私もリポジトリ確認部分で「redmine リポジトリに、エントリ/リビジョンが存在しません。」の状態になり、

    $ svn list --xml http:XXX.XXX.XXX.XXX

    を実行すると、「暗号化されていないパスワードを保存しますか (yes/no)?」との
    メッセージが表示されました。これにyesで回答するとRedmineからリポジトリを見ることができました。

  • bluez bluez 2012-05-02T09:25:18Z

    私もリポジトリ確認部分で「redmine リポジトリに、エントリ/リビジョンが存在しません。」の状態になり、

    $ svn list –xml http:XXX.XXX.XXX.XXXを実行すると403エラーが返って来ました。

    どこか設定に問題があるのでしょうか?

  • akabeko akabeko 2012-05-06T06:32:47Z

    予想になってしまいますが、403 エラーの場合、アクセスが許可されていない状態なので、SVN リポジトリか Redmine のディレクトリに設定されたパーミッションや所有者に問題があるのかもしれません。

    この記事でいうと、

    sudo chown -R apache:apache /var/lib/svn/owl

    という部分が所有者の設定となります。上記例の場合、/var/lib/svn/owl というリポジトリのディレクトリに対して、所有者を apache に変更しています。

    ちなみに最近、さくらのVPS(v3) 環境に最新の Redmine 1.4.1 をインストールしたのですが、そちらではこの記事にあるような、リポジトリが見つからない問題は発生しませんでした。