Subversionのフック・スクリプトでコミット前にRedmineのチケットを確認

RedmineのチケットとSubversionのリビジョンの連携を徹底するために、コミット時にチケット番号の指定を強制するようにした。

Subversionのフックとは?*1

  • 特定のタイミングで特定の外部プログラムを実行することであり、そのプログラムはフック・スクリプトと言われる。
  • 外部プログラムを実行する条件は次の通り。
    • リポジトリの hooks ディレクトリに決められたファイル名で存在する。
    • そのファイルが実行可能。フック・スクリプトと言っているがバイナリの実行ファイルでも OK 。 linux の場合は実行パーミッションがセットされている必要がある。
    • ユーザにそのファイルを実行する権限がある。
  • 実行可能なファイル(コミット関連)
    • start-commit ファイル
    • pre-commit ファイル
    • post-commit ファイル
      • コミットされ、新しいリビジョンが作られた後に実行。
      • 第一引数 : リポジトリへのパス
      • 第二引数 : 今回作られたリビジョン番号
      • 終了コードは無視される。

コミットに制約を設ける

制約内容:

  1. 参照用(refs)のチケット番号が指定されていて、そのチケットがRedmimeに存在すること。
  2. 完了用(fixes)のチケット番号が指定されていた場合は、そのチケットがRedmineに存在して、かつ、完了していないこと。
  • pre-commitの内容
#!/bin/sh

REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
#$SVNLOOK log -t "$TXN" "$REPOS" | \
#   grep "[a-zA-Z0-9]" > /dev/null || exit 1

#参照用のチケット番号の確認
$SVNLOOK log -t "$TXN" "$REPOS" | \
grep -i -E "refs[ ]*[#]*[0-9]+" > /dev/null || \
{ echo "No refs ticket number.(refs #)" 1>&2 && exit 1; }

#チケット進捗状態確認の関数
getTicketRatio()
{
mysql -s -u root redmine <<__REDMINE__
select
    issue_statuses.default_done_ratio
from
    issues 
,   issue_statuses
where
    issues.id = ${1}
and issues.status_id = issue_statuses.id
; 
__REDMINE__
} 

#参照用のチケット番号の取り出し
TICKET_NO=`$SVNLOOK log -t "$TXN" "$REPOS" | sed -e "s/.*refs[ ]\+[#]*\([0-9]\+\).*/\1/i" | grep -i -E "^[0-9]+$"`
if [ "NULL" == ${TICKET_NO:-NULL} ]; then
  echo "No refs ticket number.(refs #)" 1>&2
  exit 1
else
  #チケット進捗状態確認
  TICKET_RATIO=`getTicketRatio ${TICKET_NO}`

  #進捗状態が確認できない場合はコミット不可
  if [ "NULL" == ${TICKET_RATIO:-NULL} ]; then
    echo "Ticket #${TICKET_NO} is nothing." 1>&2
    exit 1
  fi 
fi

#完了用のチケット番号の取り出し
TICKET_NO=`$SVNLOOK log -t "$TXN" "$REPOS" | sed -e "s/.*fixes[ ]\+[#]*\([0-9]\+\).*/\1/i" | grep -i -E "^[0-9]+$"`
if [ "NULL" != ${TICKET_NO:-NULL} ]; then
  #チケット進捗状態確認
  TICKET_RATIO=`getTicketRatio ${TICKET_NO}`

  #100%の時はコミット不可
  if [ "NULL" == ${TICKET_RATIO:-NULL} ]; then
    echo "Ticket #${TICKET_NO} is nothing." 1>&2
    exit 1
  elif [ 100 -eq ${TICKET_RATIO} ]; then
    echo "Ticket #${TICKET_NO} is complite." 1>&2
    exit 1
  fi
fi

# Check that the author of this commit has the rights to perform
# the commit on the files and directories being modified.
#commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

# All checks passed, so allow the commit.
exit 0

テスト

先ずはサンプルのリポジトリを作成
cd /home/svnrepos
svnadmin create --fs-type fsfs test
chown -R apache:apache test
  • モジュール登録
cd /home/test
svn import -m 'Import project' test http://localhost/svn/test
ローカルPCでテスト
  • ローカルPCに作業コピー
cd ~
svn co http://svnServer/svn/test/trunk test
  • ローカルPCでファイルを追加
cd ~/test
>test.html
svn add test.html
  • ローカルPCでコミット
    • コミットログなしのパターン
cd ~/test
svn commit

--- 結果 ---
追加しています              test.html
ファイルのデータを送信しています .svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: 'pre-commit' hook failed with error output:
No refs ticket number.(refs #)
    • 参照用チケット番号指定なしのパターン
cd ~/test
svn commit -m "ファイル追加 refs"
--- 結果 ---
追加しています              test.html
ファイルのデータを送信しています .svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: 'pre-commit' hook failed with error output:
No refs ticket number.(refs #)
    • 参照用チケット番号が存在しないのパターン
cd ~/test
svn commit -m "ファイル追加 refs 9999"

--- 結果 ---
追加しています              test.html
ファイルのデータを送信しています .svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: 'pre-commit' hook failed with error output:
Ticket #9999 is nothing.
    • 完了用チケット番号が存在しないのパターン
cd ~/test
svn commit -m "ファイル追加 refs 1 fixes 9999"

--- 結果 ---
追加しています              test.html
ファイルのデータを送信しています .svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: 'pre-commit' hook failed with error output:
Ticket #9999 is nothing.
    • 完了用チケット番号が完了しているパターン
cd ~/test
svn commit -m "ファイル追加 refs 1 fixes 12"

--- 結果 ---
追加しています              test.html
ファイルのデータを送信しています .svn: コミットに失敗しました (詳しい理由は以下のとおりです):
svn: 'pre-commit' hook failed with error output:
Ticket #12 is complite.
    • OKのパターン
cd ~/test
svn commit -m "ファイル追加 refs 1 fixes 1"

--- 結果 ---
追加しています              test.html
ファイルのデータを送信しています .
リビジョン ? をコミットしました。

Redmineのテーマを替える

Redmineのテーマを替える

Redmine.JP Blogが日本語環境で読み易くしたテーマを公開してくれたので、これを有難く利用させて頂くことにする。
日本語環境で読みやすいRedmine用テーマ「farend basic」公開 | Redmine.JP Blog

  • テーマ入手&展開
cd /var/redmine/public/themes
wget http://blog.redmine.jp/assets/2010/03/23/redmine_theme_farend_basic_20100324.tgz
tar zxvf redmine_theme_farend_basic_20100324.tgz
chown -R nobody:nobody farend_basic
  • テーマ変更

[設定]→[表示]のところで"farend_basic"を選択して保存する。

touch /var/redmine/tmp/restart.txt
  • 感想

自分の環境はUbuntuメイリオがないんであんまし意味がないと思ったけど、フォントの大きさが変わっててある程度見やすくなった。
チケット一覧で優先度別に背景色が変わるのも有難い。
ただ、元が0.9.3用のテーマなので、trunk(r3768)の環境には合わない所がある。
チケット一覧をチケットNoでソートするとsubtaskingの親子関係が分かるような構成で表示されるのだが、それが無効になってしまう。
とりあえず自分で修正してみよう。

スタイルシートの一部を修正

  • diffして気になった差異(左向きがオリジナル)
75d73
< #sidebar .contextual { margin-right: 1em; }

111d108
< table.list caption { text-align: left; padding: 0.5em 0.5em 0.5em 0; }

113,124c110,111
< tr.project td.name a { white-space:nowrap; }
< 
< tr.project.idnt td.name a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;}
< tr.project.idnt-1 td.name {padding-left: 0.5em;}
< tr.project.idnt-2 td.name {padding-left: 2em;}
< tr.project.idnt-3 td.name {padding-left: 3.5em;}
< tr.project.idnt-4 td.name {padding-left: 5em;}
< tr.project.idnt-5 td.name {padding-left: 6.5em;}
< tr.project.idnt-6 td.name {padding-left: 8em;}
< tr.project.idnt-7 td.name {padding-left: 9.5em;}
< tr.project.idnt-8 td.name {padding-left: 11em;}
< tr.project.idnt-9 td.name {padding-left: 12.5em;}
---
> tr.project td.name a { padding-left: 16px; white-space:nowrap; }
> tr.project.parent td.name a { background: url('../../../images/bullet_toggle_minus.png') no-repeat; }

131,141d117
< tr.issue.idnt td.subject a {background: url(../images/bullet_arrow_right.png) no-repeat 0 50%; padding-left: 16px;}
< tr.issue.idnt-1 td.subject {padding-left: 0.5em;}
< tr.issue.idnt-2 td.subject {padding-left: 2em;}
< tr.issue.idnt-3 td.subject {padding-left: 3.5em;}
< tr.issue.idnt-4 td.subject {padding-left: 5em;}
< tr.issue.idnt-5 td.subject {padding-left: 6.5em;}
< tr.issue.idnt-6 td.subject {padding-left: 8em;}
< tr.issue.idnt-7 td.subject {padding-left: 9.5em;}
< tr.issue.idnt-8 td.subject {padding-left: 11em;}
< tr.issue.idnt-9 td.subject {padding-left: 12.5em;}
< 

163,167c139,141
< tr.message td.subject { padding-left: 20px; }
< tr.message td.created_on { white-space: nowrap; }
< tr.message td.last_message { font-size: 80%; white-space: nowrap; }
< tr.message.locked td.subject { background: url(../images/locked.png) no-repeat 0 1px; }
< tr.message.sticky td.subject { background: url(../images/bullet_go.png) no-repeat 0 1px; font-weight: bold; }
---
> tr.message td.last_message { font-size: 80%; }
> tr.message.locked td.subject a { background-image: url(../images/locked.png); }
> tr.message.sticky td.subject a { background-image: url(../images/sticky.png); font-weight: bold; }

220,226d232
< #watchers ul {margin: 0;  padding: 0;}
< #watchers li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;}
< #watchers select {width: 95%; display: block;}
< #watchers a.delete {opacity: 0.4;}
< #watchers a.delete:hover {opacity: 1;}
< #watchers img.gravatar {vertical-align: middle;margin: 0 4px 2px 0;}
< 

236d241
< color:#505050;

269,276d274
< div.issue div.subject div div { padding-left: 16px; }
< div.issue div.subject p {margin: 0; margin-bottom: 0.1em; font-size: 90%; color: #999;}
< div.issue div.subject>div>p { margin-top: 0.5em; }
< div.issue div.subject h3 {margin: 0; margin-bottom: 0.1em;}
< 
< #issue_tree table.issues { border: 0; }
< #issue_tree td.checkbox {display:none;}
< 

407,412d404
< .tabular label.inline{
< float:none;
< margin-left: 5px !important;
< width: auto;
< }
< 

448,449d439
< input#principal_search, input#user_search {width:100%}
< 

530,533d519
< table.cal .starting a, p.cal.legend .starting {background: url(../images/bullet_go.png) no-repeat -1px -2px; padding-left:16px;}
< table.cal .ending a, p.cal.legend .ending {background: url(../images/bullet_end.png) no-repeat -1px -2px; padding-left:16px;}
< table.cal .starting.ending a, p.cal.legend .starting.ending {background: url(../images/bullet_diamond.png) no-repeat -1px -2px; padding-left:16px;}
< p.cal.legend span {display:block;}

663,664d649
< #parent_issue_candidates ul li {width: 500px;}
< 

791,796d779
< 
< .task_todo.parent { background: #888; border: 1px solid #888; height: 6px;}
< .task_late.parent, .task_done.parent { height: 3px;}
< .task_todo.parent .left  { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-left: -5px; left: 0px; top: -1px;}
< .task_todo.parent .right { position: absolute; background: url(../images/task_parent_end.png) no-repeat 0 0; width: 8px; height: 16px; margin-right: -5px; right: 0px; top: -1px;}
< 
  • 気になった差異をRedmine.JPの"farend_basic"に反映したんで公開

https://dl.dropbox.com/u/8158115/redmine_theme_farend_basic_for_trunk_r3768.tar.gz
とりあえず動いてる。使う方は自己責任でお願いします。

Redmine公式のテーマ'10.6.20追記

いろんなテーマが公開されている。
Theme List - Redmine

*1:再起動なしでも変更したテーマが有効になった

Redmineのトラッカー、ワークフロー、マイルストーン、バージョンについて考える

そもそもトラッカー、ワークフローとは何なのか?

トラッカーは、異なる種類のチケットを分類するものです。トラッカーごとに以下のものを定義できます。

どうやらチケットを分類するための言葉らしい。

ワークフロー(英: Workflow)は、リソースを体系的に組織化し、役割と、物質、エネルギー、情報の流れを文書化および学習が可能なかたちで作業プロセスのなかに規定することで実現される、確実な反復可能性を持つ活動パターンである。ワークフローは、物理的な輸送、サービス展開、情報処理など、何らかの具体的意図を持って設計される。

Redmine的にはチケットの始まりから終わりまでの『状態(ステータス)』または『作業(ワーク)』という解釈でいいかな。

仕事に当てはめてみる

トラッカー ワークフロー(始まりから終わりまで)
改定 要件定義→見積り→設計→製作→試験→出荷→納品
要件定義→見積り→設計→製作→試験→出荷→マージ→試験→納品
要件定義→見積り→取り消し
障害 障害発生→再現性確認→改修→試験→出荷→報告書提出
障害発生→再現性確認→改修→試験→出荷→マージ→試験→報告書提出
障害発生→再現性確認→取り消し
障害発生→瑕疵外の障害
課題 課題発生→確認→設計→製作→試験→出荷
課題発生→確認→取り消し
レビュー 依頼→レビュー→処置→確認
問合せ 質問→回答→確認

ざっとこんなもんか、、、
『レビュー』『問合せ』は、『改定』『障害』『課題』のトラッカーに含むのでサブトラッカーってことになるのな。
RedmineではSubtasking*1という機能があるので、トラッカーとサブトラッカーを親Taskと子Taskという扱いにしてみよう。
まぁ上の表を見せてもプロジェクト内の開発者の理解して貰えないと思うので、流れ図に起こした方が吉。

#'10.6.16追記:この考え方では全然ダメだった・・・考え直そ

マイルストーンとバージョンって何?

マイルストーン(Milestone) とは、鉄道や道路等の起点よりの距離をマイルで表した距離標識の一つ。マイルマーカー(Milemaker )、マイルポスト(Milepost・MP)ともいう。

”距離”を表す言葉ね。

ソフトウェア構成管理(ソフトウェアこうせいかんり、Software Configuration Management、SCM)とはソフトウェア開発プロジェクトをその成果物を通して制御・管理する方法論である。ソースコードや文書などの成果物の変更履歴を管理し、製品のバージョンやリビジョンに個々の成果物のどのバージョンが対応しているかを識別し、任意のバージョンの製品を再現可能とする。

”構成を管理するコード”という解釈にしとこ。


Tracではマイルストーンとバージョンを分けて考えるが、Redmineでは同一の意味として扱う。
故にRedmineはマイルストールという言葉がない。(プラグインで出来るのかも知れないが。)
余程長期のプロジェクトを扱う場合は、マイルストーンとバージョンを分けて管理すべきだろうが、
中期、短期のプロジェクトを扱う場合は、バージョンだけで十分。
もしRedmineで長期プロジェクトを扱う場合は、Redmine独特のサブプロジェクトという考え方が出来るので、
そちらに置き換えて管理すればいいだろう。


最終出荷物 … メインプロジェクト内のバージョンで管理
途中出荷物 … サブプロジェクト内のバージョンで管理

これまた仕事に当てはめる

基本的にワークフローの”出荷”がソースを構成する上での終点になるので、出荷予定日をバージョンとして扱ってみる。
バージョンは『100614-RC』と言う事にしよう。

Subversionのインストール及びRedmineと連携

Subversionのインストール方法とRedmineで認証する方法のメモ

yum install subversion mod_dav_svn mod_auth_mysql authz_svn_module

MySQLのusersテーブルで認証することで、Redmineの特定のプロジェクトに参加しているユーザのみがSVNでcommit可能となる。
ただし、誰でもcheckout出来るような設定になっている。

/etc/httpd/conf.d/subversion.conf
----------------------------------------------------------------
<Location /svn>
   DAV svn
   SVNParentPath /home1/svnrepos
   <LimitExcept GET PROPFIND OPTIONS REPORT>
        AuthMySQLEnable         On
        AuthMySQLSocket         /var/lib/mysql/mysql.sock
        AuthMySQLHost           localhost
        AuthMySQLUser           redmine
        AuthMySQLPassword       redmine
        AuthMySQLDB             redmine
        AuthMySQLUserTable      "users,members,projects"
        AuthMySQLNameField      "users.login"
        AuthMySQLUserCondition  "users.id=members.user_id and projects.id=members.project_id and projects.identifier='mine-project'"
        AuthMySQLPasswordField  "users.hashed_password"
        AuthMySQLPwEncryption   sha1
        AuthMySQLNoPasswd       Off

        AuthType Basic
        AuthName "Authorization Realm"
        Require valid-user
   </LimitExcept>
</Location>
----------------------------------------------------------------
mkdir /home1/svnrepos
chown -R apache:apache /home1/svnrepos
service httpd restart

Redmineを最新版のスイッチ&プラグインのコードレビューをインストール

RedmineのSubtaskingを使ってみたいが、バージョン1.0.0に組み込まれるようで、7月まで待たなくてはならない。
なので、とりあえず最新版(trunk)にスイッチして、使用してみる。
後、プラグインのコードレビューの気になるのでインストールしてみる。

Redmineリポジトリ切り替え

■現状のリポジトリを確認

# cd /var/redmine
# svn info
----------------------------------------------------------------------
パス: .
URL: http://redmine.rubyforge.org/svn/branches/0.9-stable
リポジトリのルート: http://redmine.rubyforge.org/svn
リポジトリ UUID: e93f8b46-1217-0410-a6f0-8f06a7374b81
リビジョン: 3735
ノード種別: ディレクトリ
準備中の処理: 特になし
最終変更者: jplang
最終変更リビジョン: 3728
最終変更日時: 2010-05-01 21:38:44 +0900 (土, 01  5月 2010)
----------------------------------------------------------------------

■最新版のリポジトリに切り替え

# cd /var/redmine
# svn switch http://redmine.rubyforge.org/svn/trunk

■データベース再作成

# mysql
----------------------------------------------------------------------
drop database redmine;
create database redmine;
grant create,select,insert,delete,update,index,drop,alter on redmine.* to redmine@localhost identified by 'password';
set password for 'redmine'@'localhost' = password('redmine');
flush privileges;
----------------------------------------------------------------------

■セッション暗号化用鍵の生成

# rake config/initializers/session_store.rb

■データベースの初期化

# rake db:migrate RAILS_ENV=production
# rake redmine:load_default_data RAILS_ENV=production
------------------------------------------------------
Select language: bg, bs, ca, cs, da, de, el, en, es, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sr, sv, th, tr, uk, vi, zh, zh-TW [en] ja
------------------------------------------------------

redmineディレクトリの所有者をnobodyに変更してappache再起動

# cd /var
# chown -R nobody:nobody ./redmine
# service httpd restart

■使った感じ
親→子→孫といった具合にチケットを作ることができる。
チケット一覧で親チケットでソートすれば題名のところで関連が分かるが、参考サイトの通りまだ改善の余地あり、という所だろうか。

プラグインのコードレビューをインストール

■ダウンロード&展開(念のため)

# cd vendor/plugins
# wget http://r-labs.googlecode.com/files/redmine_code_review-0.2.9.3.zip
# unzip redmine_code_review-0.2.9.3.zip

■マイグレート&apache再起動

# rake db:migrate_plugins RAILS_ENV=production
# service httpd restart

Redmineの管理設定
後は参考サイト通りに。
http://www.r-labs.org/projects/r-labs/wiki/Code_Review

「ロールと権限」で各ロールにコードレビューの権限設定をします。
プロジェクトの設定で コードレビュー モジュールをチェックします。
プロジェクトの設定でコードレビュータブを開き、コードレビューに割り当てるトラッカーを選択します。

Redmineのインストール

RedmineとはRuby on Railsで作られているプロジェクト管理ツール。
Tracに比べると知名度が低いようだが、Railsが気になるのとデフォルトのテーマがTracよりRedmineの方が見やすいと思ったので、これを使ってみることにする。
CentOS 5.4にRedmine0.9.3をインストールしてみる。

インストール環境

パッケージ バージョン
Ruby 1.8.6
RubyGems 1.3.6
Ruby on Rails 2.3.5
Redmine 0.9.3

インストール手順

# vi /etc/yum.repos.d/ruby.repo
-------------------------------------------------------
[ruby]
name=ruby
baseurl=http://repo.premiumhelp.eu/ruby/
gpgcheck=0
enabled=0
-------------------------------------------------------
  • rubyのインストール

ruby は1.8.6 が必要なので、1.8.5がインストールされている場合は削除する。(yum listで確認)

# yum remove ruby rdoc ruby-devel ruby-libs.i386

ruby 1.8.6 をインストール

# yum install ruby rdoc ruby-devel --enablerepo=ruby
# yum install subversion
# yum install mysql mysql-server mysql-devel
# yum install gcc gcc-c++ httpd-devel apr-devel

ディレクトリの作成

# mkdir -p /opt/rubygems
# cd /opt/rubygems

■ダウンロード&展開

# wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
# tar xvfz rubygems-1.3.6.tgz
# cd rubygems-1.3.6

■インストール

# ruby setup.rb
# gem install -v=2.3.5 rails
# gem install mongrel
# gem install mysql -- --with-mysql-lib=/usr/lib/mysql

■サービス起動

# service mysqld start
# chkconfig mysqld on

■データベース作成

# mysql
----------------------------------------------------------------------
drop database redmine;
create database redmine;
grant create,select,insert,delete,update,index,drop,alter on redmine.* to redmine@localhost identified by 'password';
set password for 'redmine'@'localhost' = password('redmine');
flush privileges;
----------------------------------------------------------------------

■文字化け対策
MySQLのデフォルトの文字コードはlatin1らしいので、これをutf8に変更する。

# vi /etc/my.cnf
----------------------------------------------------------------------
[client]
default-character-set = utf8
[mysqld]
default-character-set = utf8
----------------------------------------------------------------------
  • Redmine0.9.3をインストール

■チェックアウト

# cd /var
# svn checkout http://redmine.rubyforge.org/svn/tags/0.9.3/ redmine

ディレクトリ移動

# cd /var/redmine

■データベース設定

# vi config/database.yml
------------------------------------------------------
production:
  adapter: mysql
  database: redmine	
  username: redmine
  password: redmine
  host: localhost
  encoding: utf8
------------------------------------------------------

■メール発信の設定(Yahoo)

# vi config/email.yml
------------------------------------------------------
production:
  delivery_method: :async_smtp
  smtp_settings:
    address: smtp.mail.yahoo.co.jp
    port: 587
    domain: yahoo.co.jp
------------------------------------------------------

■セッション暗号化用鍵の生成

# rake config/initializers/session_store.rb

■データベースの初期化

# rake db:migrate RAILS_ENV=production
# rake redmine:load_default_data RAILS_ENV=production
------------------------------------------------------
Select language: bg, bs, ca, cs, da, de, el, en, es, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, nl, no, pl, pt, pt-BR, ro, ru, sk, sl, sr, sv, th, tr, uk, vi, zh, zh-TW [en] ja
------------------------------------------------------

■動作確認

# script/server -e production

(http://xxx.xxx.xxx.xxx:3000/で確認可能)

Passengerを使ってRedmineApache上で動かす手順

  • passengerのインストール
# gem install passenger
  • passengerの設定
# passenger-install-apache2-module

次のようなログが出力されるので控えておく。

--------------------------------------------
The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

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

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Press ENTER to continue.


--------------------------------------------
Deploying a Ruby on Rails application: an example

Suppose you have a Rails application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      DocumentRoot /somewhere/public    # <-- be sure to point to 'public'!
      <Directory /somewhere/public>
         AllowOverride all              # <-- relax Apache security settings
         Options -MultiViews            # <-- MultiViews must be turned off
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:

  /usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/doc/Users guide Apache.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
http://www.modrails.com/

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
  • appacheの設定
# vi /etc/httpd/conf/httpd.conf
------------------------------------------------------------------------
   LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/ext/apache2/mod_passenger.so
   PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.11
   PassengerRuby /usr/bin/ruby

   <VirtualHost *:80>
      ServerName redmine.localhost.localdomein
      DocumentRoot /var/redmine/public
      <Directory /var/redmine/public>
         AllowOverride all
         Options -MultiViews
      </Directory>
   </VirtualHost>
------------------------------------------------------------------------

'10.5.31追記(Mazinさんのを参考に)
※ コメント(#)は取り除かないとエラーになる。

このままだとRailsのアプリしか動かないので、次のようにRailsBaseURIでredmineを紐付ける。

# vi /etc/httpd/conf/httpd.conf
------------------------------------------------------------------------
   LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/ext/apache2/mod_passenger.so
   PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.11
   PassengerRuby /usr/bin/ruby

#   <VirtualHost *:80>
#      ServerName redmine.localhost.localdomein
#      DocumentRoot /var/redmine/public
#      <Directory /var/redmine/public>
#         AllowOverride all
#         Options -MultiViews
#      </Directory>
#   </VirtualHost>
RailsBaseURI /redmine
------------------------------------------------------------------------
# cd /var/www/html
# ln -s /var/redmine/public redmine
# cd /var
# chown -R nobody:nobody ./redmine
  • appache再起動
# service httpd restart

CentOS5.4のインストール

RedmineのデータベースをSQLiteからMySQLに変更しようと思ったんでSQLiteyumでremoveしたら、いろんな物が一緒に削除されてしまった(笑)
依存パッケージが大量にあったようで、その中にyumも含まれていた・・・お陰でyumでインストールができなくなってしまった。
yumが依存関係を表示してくれたのに、それを無視したのが原因・・・今後は良く見て実行しよう(^^;

で、
特に大事な物はデータは入っていなかったので、CentOSを新規にインストールすることにした。

CentOSのサイトよりインストーラを入手

CentOS Project

CentOS 5.4のインストール

PCのスペック

CPU Intel Celeron 866MHz
メモリ 1GB
ディスク 120GB×2

ディスクパーテーション

マウントポイント タイプ 容量
/boot ext3 101MB
/ LVM PV 115GB
swap swap 2GB

ディスクパーテーション詳細

グループ バイス マウントポイント タイプ 容量
VolGroup00 LogVol01 / ext3 115GB
LogVol02 swap 2GB
RAIDバイス /dev/md0 /boot ext3 101MB
/dev/md1 VolGroup00 LVM PV 117GB
ハードドライブ /dev/hdc1 /dev/md0 ソフトウェアRAID 101MB
/dev/hdc2 /dev/md1 ソフトウェアRAID 117GB
/dev/hdd1 /dev/md0 ソフトウェアRAID 101MB
/dev/hdd2 /dev/md1 ソフトウェアRAID 117GB

ソフトウェアの選択*1

  • "Server"だけを選択する。

初期設定

  • 参考サイト(ホントお世話になってます)

CentOSで自宅サーバー構築

  • パッケージの最新化
# yum update
  • パッケージ管理システム設定

yum-updatesd削除

# yum remove yum-updatesd

■fastestmirrorプラグインインストール
(インストールパッケージダウンロード時の最適ミラーサイトを自動選択するようにする)

# yum install yum-fastestmirror

yum-cronインストール

# yum install yum-cron
# service yum-cron start

■パッケージ自動更新自動起動設定

# chkconfig yum-cron on
# vi /etc/sysconfig/selinux
<hr width="50%" align="left"/>
<font color="green">[]#SELINUX=enforcing[]</font>
SELINUX=disabled
<hr width="50%" align="left"/>

*1:CentOS5.4のインストーラリポジトリを追加すると落ちるので注意