さくらのVPS を使いはじめる 8 - Redmine と Subversion
さくらのVPS への作業メモ 8。今回は Subversion のインストールと Redmine 連携設定などをおこなう。
- 2012/5/9 おしらせ
- 続編として、さくらのVPS(v3) 2GB プランへの作業メモ「さくらのVPS を改めて使いはじめる 9 – Ruby、Redmine、Subversion」を書きました
入門 Redmine 第 2 版
今回の設定で非常に参考になった書籍を紹介しておく。
Redmine を利用するなら必携の書。私は Chapter 4 「システム管理者編」を読むために購入したのだが他の章もスクリーンショットや設定例が満載。Redmine だけではなく Apache や Subversion の連携についても丁寧に解説されている。
チケット駆動についてピンとこない人も、Chapter 1 ~ 2 を読むうちに有用性を理解できそう。Trac との比較も面白い。次の版を出すときは Remember The Milk や Toodledo のようなタスク管理サービスとしての側面も掘り下げて欲しい。
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
mod_dav_svn のインストールと設定
mod_dav_svn を利用すると、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!
次は設定だが mod_dav_svn は 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 を指定してリポジトリブラウザを開いて操作する。
こんな感じで登録してみた。
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 - Defect #816: Remote Subversion repositories are not refreshed by the application - Redmine
他の要因としてはリポジトリのパスを 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 からリポジトリのページにアクセスしてみると...
あれ?**表示できてる!なんか既視感を覚える展開だ。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 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 2012-05-02T09:25:18Z
私もリポジトリ確認部分で「redmine リポジトリに、エントリ/リビジョンが存在しません。」の状態になり、
$ svn list –xml http:XXX.XXX.XXX.XXXを実行すると403エラーが返って来ました。
どこか設定に問題があるのでしょうか?
- 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 をインストールしたのですが、そちらではこの記事にあるような、リポジトリが見つからない問題は発生しませんでした。