Redmine 1.0.3 から 1.4.1 への移行アップデート

ちょい躓いたので、メモ。
Windows Server で動いていた Bitnami Redmine 1.0.3 を、
Ubuntu Server に Redmine 1.4.1 として移行アップデートする。
(Ubuntu Server には、既にRedmine 1.4.1 が準備されているものとして話を進める。)


0. とりあえずRedmineにログインしてみる

DBの移行前に、一度もログインしてないと、何故か400 Bad Requestになってしまった。
lighttpd + fastcgi で動かしているので、そっちが原因かも。

1. DBの移行


(windows) mysqldump -u [ユーザ名] -p [DB名] --default-character-set=latin1 > redmine_dump

(ubuntu) vim redmine_dump
:%s/latin1/utf8/g
:wq

(ubuntu) mysql -u [ユーザ名] -p [DB名] < redmine_dump
(ubuntu) cd [redmineディレクトリ]
(ubuntu) rake db:migrate RAILS_ENV="production"
(ubuntu) rake db:migrate:upgrade_plugin_migrations RAILS_ENV="production"
(ubuntu) rake db:migrate_plugins RAILS_ENV="production"

最初、latin1 じゃなくて binary でやってたのだけれど、文字化け。
latin1 そのままでも文字化けだったので、windowsのDBの文字コードを見てみたら、全部 latin1 だった。

2. files とか plugins とかの移動

files以下のファイルと、vendor/plugins以下のファイルを必要に応じて移動。

3. ログインしてみる

500 internal server error になる。
ログを確認。


cd [redmineディレクトリ]
tail -30 log/production.log

Processing AccountController#login (for ***.***.***.***:2674 at 2012-05-07 06:55:03) [POST]
Parameters: {"authenticity_token"=>"****************", "login"=>"ログイン »", "action"=>"login", "controller"=>"account", "username"=>"dolphin", "password"=>"[FILTERED]", "back_url"=>"************"}

ActiveRecord::StatementInvalid (Mysql::Error: Unknown column 'custom_fields.multiple' in 'field list': SELECT `custom_values`.`id` AS t0_r0, `custom_values`.`customized_type` AS t0_r1, `custom_values`.`customized_id` AS t0_r2, `custom_values`.`custom_field_id` AS t0_r3, `custom_values`.`value` AS t0_r4, `custom_fields`.`id` AS t1_r0, `custom_fields`.`type` AS t1_r1, `custom_fields`.`name` AS t1_r2, `custom_fields`.`field_format` AS t1_r3, `custom_fields`.`possible_values` AS t1_r4, `custom_fields`.`regexp` AS t1_r5, `custom_fields`.`min_length` AS t1_r6, `custom_fields`.`max_length` AS t1_r7, `custom_fields`.`is_required` AS t1_r8, `custom_fields`.`is_for_all` AS t1_r9, `custom_fields`.`is_filter` AS t1_r10, `custom_fields`.`position` AS t1_r11, `custom_fields`.`searchable` AS t1_r12, `custom_fields`.`default_value` AS t1_r13, `custom_fields`.`editable` AS t1_r14, `custom_fields`.`visible` AS t1_r15, `custom_fields`.`multiple` AS t1_r16 FROM `custom_values` LEFT OUTER JOIN `custom_fields` ON `custom_fields`.id = `custom_values`.custom_field_id WHERE (`custom_values`.customized_id = 1 AND `custom_values`.customized_type = 'Principal') ORDER BY custom_fields.position):
app/models/user.rb:159:in `try_to_login'
app/controllers/account_controller.rb:143:in `password_authentication'
app/controllers/account_controller.rb:138:in `authenticate_user'
app/controllers/account_controller.rb:30:in `login'
public/dispatch.fcgi:24

Rendering /usr/local/rails/****/public/500.html (500 Internal Server Error)

custom_fields というテーブルに multiple というカラムがないらしい。
確かに、1.4.1 にはそういうカラムがあるので、追加してやる。
この後、同様にいくつかカラムが存在しないというエラーに引っかかったので、それらも追加する。


エラー内容

Processing ProjectsController#show (for ***.***.***.***:2674 at 2012-05-07 06:56:38) [GET]
Parameters: {"action"=>"show", "controller"=>"projects", "id"=>"env-man"}
Rendering template within layouts/base
Rendering projects/show

ActionView::TemplateError (Mysql::Error: Unknown column 'is_default' in 'where clause': SELECT * FROM `repositories` WHERE (`repositories`.project_id = 3 AND (is_default = 1)) LIMIT 1) on line #57 of app/views/layouts/base.html.erb:
54:
55: <% if display_main_menu?(@project) %>
56: <div id="main-menu">
57: <%= render_main_menu(@project) %>
58: </div>
59: <% end %>
60: </div>

lib/redmine.rb:209
lib/redmine/menu_manager.rb:196:in `call'
lib/redmine/menu_manager.rb:196:in `allowed_node?'
lib/redmine/menu_manager.rb:166:in `menu_items_for'
lib/redmine/menu_manager.rb:165:in `each'
lib/redmine/menu_manager.rb:165:in `menu_items_for'
lib/redmine/menu_manager.rb:90:in `render_menu'
lib/redmine/menu_manager.rb:80:in `render_main_menu'
app/views/layouts/base.html.erb:57
app/controllers/projects_controller.rb:168:in `show'
public/dispatch.fcgi:24

Processing IssuesController#index (for ***.***.***.***:2281 at 2012-05-07 07:00:55) [GET]
Parameters: {"action"=>"index", "controller"=>"issues"}
Rendering template within layouts/base
Rendering issues/index

ActionView::TemplateError (undefined method `is_private?' for #<Issue:0xb562c7fc>) on line #28 of app/views/issues/_list.html.erb:
25: </tr>
26: <% previous_group = group %>
27: <% end %>
28: <tr id="issue-<%= issue.id %>" class="hascontextmenu <%= cycle('odd', 'even') %> <%= issue.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>">
29: <td class="checkbox hide-when-print"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
30: <td class="id"><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
31: <% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.css_classes %><% end %>

app/models/issue.rb:689:in `css_classes'
app/views/issues/_list.html.erb:28
app/helpers/issues_helper.rb:29:in `issue_list'
app/helpers/issues_helper.rb:25:in `each'
app/helpers/issues_helper.rb:25:in `issue_list'
app/views/issues/_list.html.erb:16
app/views/issues/_list.html.erb:1
app/views/issues/index.html.erb:59
app/controllers/issues_controller.rb:83:in `index'
app/controllers/issues_controller.rb:82:in `index'
public/dispatch.fcgi:24

alter table custom_fields add multiple tinyint(1) default '0';
alter table repositories add identifier varchar(255) default null;
alter table repositories add is_default tinyint(1) default '0';
4. lighttpd 再起動

何にはまったかというと、is_private。カラムには、追加せずとも存在しているし....
結局、再起動せずに、1時間以上はまってた。再起動したら、何事もなかったかのように直った。


無事に 1.4.1 にアップデートできました。めでたしめでたし。