redmine0.9系へのアップグレード失敗談

仕事のタスクはBTSredmine(当時使用してたのは0.8.4)を利用して管理してるのですが、先日からwikiへの書き込みに失敗するケースが頻発するようになりました。原因がよく分からなかったこともあり、せっかくなので11日の休日を利用して0.9.2へアップグレードしてみました。

が、すごいイージーな失敗で結構苦労したのと、失敗ケースの情報はあまりググってみてもみつからないので情報共有のために失敗談を残しておきます。

まず結論からいくと、filesディレクトリなどの移行が面倒だからと言って横着して、これまでのredmineディレクトリ内に新しいバージョンのredmineの内容をコピーすると痛い目を見ます。ちゃんと0.8系のディレクトリで移行すべきファイル(filesディレクトリの他、config/database.yml や config/email.yml )を新しいredmineディレクトリにコピーしましょう(本当にイージーなミスだ……)。

では、これまでのredmineディレクトリ内に新しいバージョンのredmineの内容をコピーしてアップグレード作業を進めていくとどうなるかに触れてみます。

まずDBのマイグレートの段階で

sudo rake db:migrate RAILS_ENV="production"
rake aborted!
Could not find RubyGem rack (~> 1.0.1)

とエラーが出ます。このエラー自体はredmineで採用されたRuby on Railsのバージョン変更によって rack が必要になったんで通常遭遇しうるエラーですので、指示に従って rack のインストールをしてください。

但し単純に

sudo gem install rack

とすると最新バージョン(確認時点では1.1.0)がインストールされて結局エラーになるので、

sudo gem install --version '= 1.0.1' rack

とバージョン指定でインストールする必要があります。ここから失敗ケース特有のエラーに遭遇するようになります。今度は uninitialized constant ActionController::AbstractRequest

「redmine “uninitialized constant ActionController::AbstractRequest”」で検索すると、かなり検索件数が少ない(確認時点で15件くらい)上にほとんどの記事が英語。

その中で「プラグインからactionwebserviceをはずせ」的な情報がみつかります。「redmineにはプラグインを入れてないしなぁ……?」と思っても、標準でvendor/pluginsには色々と入ってるので、そのディレクトリを漁れば私と同じ失敗手順を踏めば見つかるはずです。

actionwebserviceを消すとマイグレーションが通っちゃうので、新版のredmineは立ち上がります。が、今度はいくつかのページでInternal Server Errorが発生するようになります。redmineのログを漁ると

Processing IssuesController#show (for ***.***.***.*** at 2010-02-12 00:52:48) [GET]
Parameters: {"action"=>"show", "id"=>"1089", "controller"=>"issues"}
Rendering template within layouts/base
Rendering issues/show.rhtml

ActionView::TemplateError (There is no rule called 'default' in the en rules.) on line #9 of app/views/issues/show.rhtml:
6:         <%= avatar(@issue.author, :size => "50") %>
7:         <h3><%=h @issue.subject %></h3>
8:         <p class="author">
9:         <%= authoring @issue.created_on, @issue.author %>.
10:         <% if @issue.created_on != @issue.updated_on %>
11:         <%= l(:label_updated_time, time_tag(@issue.updated_on)) %>.
12:         <% end %>

    app/helpers/application_helper.rb:273:in `time_tag'
    app/helpers/application_helper.rb:269:in `authoring'
    app/views/issues/show.rhtml:9:in `_run_rhtml_app47views47issues47show46rhtml'
    app/controllers/issues_controller.rb:117
    app/controllers/issues_controller.rb:116:in `show'
    passenger (2.2.9) lib/phusion_passenger/rack/request_handler.rb:92:in `process_request'
    passenger (2.2.9) lib/phusion_passenger/abstract_request_handler.rb:207:in `main_loop'
    passenger (2.2.9) lib/phusion_passenger/railz/application_spawner.rb:400:in `start_request_handler'
    passenger (2.2.9) lib/phusion_passenger/railz/application_spawner.rb:351:in `handle_spawn_application'
    passenger (2.2.9) lib/phusion_passenger/utils.rb:184:in `safe_fork'
    passenger (2.2.9) lib/phusion_passenger/railz/application_spawner.rb:349:in `handle_spawn_application'
    passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:352:in `__send__'
    passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:352:in `main_loop'
    passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously'
    passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:163:in `start'
    passenger (2.2.9) lib/phusion_passenger/railz/application_spawner.rb:209:in `start'
    passenger (2.2.9) lib/phusion_passenger/spawn_manager.rb:262:in `spawn_rails_application'
    passenger (2.2.9) lib/phusion_passenger/abstract_server_collection.rb:126:in `lookup_or_add'
    passenger (2.2.9) lib/phusion_passenger/spawn_manager.rb:256:in `spawn_rails_application'
    passenger (2.2.9) lib/phusion_passenger/abstract_server_collection.rb:80:in `synchronize'
    passenger (2.2.9) lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize'
    passenger (2.2.9) lib/phusion_passenger/spawn_manager.rb:255:in `spawn_rails_application'
    passenger (2.2.9) lib/phusion_passenger/spawn_manager.rb:154:in `spawn_application'
    passenger (2.2.9) lib/phusion_passenger/spawn_manager.rb:287:in `handle_spawn_application'
    passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:352:in `__send__'
    passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:352:in `main_loop'
    passenger (2.2.9) lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously'

Rendering /Users/Shared/redmine/public/500.html (500 Internal Server Error)

と残ります。私はこの段階で諦めて、もう一度アップグレード作業手順を振り返って「あ、そか。前バージョンのredmineに新バージョンのファイルをコピーしてたか!!」と気づいて、アップグレードをやり直したら今度はちゃんとアップグレードできたんですが、んー、DBのマイグレーションで失敗してエラー内容を確認した際にuninitialized constant ActionController::AbstractRequestなる記述を見かけたら作業手順を振り返ったり見直してみた方が良いです。

ちなみに前のバージョンでwikiへの書き込みに失敗する原因なんですが、どうもRuby自体に問題があるっぽいです。なので、そもそものwikiへの書込み失敗の問題はredmine0.9.2にアップグレードしても発生したのですが、これはrubyを一旦1.8.7-p174にダウングレードして対処。今のところはこれで順調に動いてるみたいです。なお、チケットにはSegmentation fault in Marshal.load in Rails’ ActiveSupport in 1.8.7-p248 onlyとありますが、1.8.7-p249でも発生するようですどうもrubyの調子が良くないので一旦アンインストールして、入れ直してみたら、1.8.7-p249でも発生するってことはないような感じです。 やっぱり発生します。redmine0.9へのアップグレード失敗の対処法でちょっと触れてます。

そのほか、redmine0.8から0.9へのアップグレードで起こりがちなトラブルの対処法もredmine0.9へのアップグレード失敗の対処法でまとめてみました。