torutkのブログ

ソフトウェア・エンジニアのブログ

Redmine 2.3.0から2.3.1へのアップデート手順メモ(CentOS 6.4 x64)

GW連休直前に職場のRedmineを2.2.2→2.3.0にアップデートしておきました。そしたら2.3.1がリリースされましたので、GW連休明けの運用前に2.3.0→2.3.1にするのに備えて自宅環境で確認をしておきます。

動作環境

  • OS: CentOS 6.4 x64
  • RACKサーバー: Unicorn
    • serviceコマンドで起動・終了制御可
  • RDBMS: MySQL 5.1
  • 現バージョンのRedmineインストール場所:/var/lib/redmine-2.3.0

およびシンボリックリンクファイル/var/lib/redmine

アップデート手順

~$ cd /var/lib
lib$ sudo tar xzf ~/redmine-2.3.1.tar.gz
lib$ 
  • 設定ファイル(database.yml、configuration.yml、unicorn.rb)をコピー
lib$ sudo cp redmine-2.3.0/config/{database,configuration}.yml redmine-2.3.1/config/
lib$ sudo cp redmine-2.3.0/config/unicorn.rb redmine-2.3.1/config/
lib$
  • Gemfile.local(unicornが指定されている)をコピー
lib$ sudo cp redmine-2.3.0/Gemfile.local redmine-2.3.1/
lib$
  • gemパッケージ群のインストール
lib$ cd redmine-2.3.1
redmine-2.3.1$ sudo bundle install --path vendor/bundler --without development test
Fetching gem metadata from https://rubygems.org/.........
    :(中略)
>= 1.9.2 : nothing to do! Yay!
redmine-2.3.1$
redmine-2.3.1$ sudo bundle exec rake generate_secret_token
redmine-2.3.1$ 
redmine-2.3.1$ sudo service unicorn stop
/var/lib/redmine: Stopping
redmine-2.3.1$ 
  • MySQL DBのバックアップ(バージョンアップでトラブル時に元のバージョンで運用継続するため)
redmine-2.3.1$ pushd ~
~ /var/lib/redmine-2.3.1
~$ mysqldump -uroot -pxxxx redmine > mysql_redmine-`date +%Y%m%d`.dump
~$
~$ popd
/var/lib/redmine-2.3.1
redmine-2.3.1$ sudo cp -pr ../redmine-2.3.0/plugins/* plugins/
redmine-2.3.1$
  • 添付ファイルディレクトリ以下を移動(容量が大きいため)
redmine-2.3.1$ sudo rm -r files
redmine-2.3.1$ sudo mv ../redmine-2.3.0/files .
  • 追加テーマをコピー
redmine-2.3.1$ sudo rsync -av --exclude alternate --exclude classic \
../redmine-2.3.0/public/themes/ public/themes/
sending incremental file list
./
README
farend_fancy/
  :(中略)
sent 52956 bytes  received 696 bytes  107304.00 bytes/sec
total size is 50549  speedup is 0.94
redmine-2.3.1$ 
  • もう一回gemファイル群の更新(プラグインをコピーした兼ね合い)
redmine-2.3.1$ sudo bundle update
Fetching gem metadata from https://rubygems.org/.........
  :(中略)
Your bundle is updated! Use `bundle show [gemname]` to see where a bundled gem is installed.
redmine-2.3.1$
redmine-2.3.1$ sudo bundle exec rake db:migrate RAILS_ENV=production
redmine-2.3.1$ 
redmine-2.3.1$ sudo bundle exec rake redmine:plugins:migrate RAILS_ENV=production
  :(中略)
redmine-2.3.1$ 
redmine-2.3.1$ sudo chown -R redmine.redmine .
redmine-2.3.1$
redmine-2.3.1$ cd ..
lib$ sudo rm redmine
lib$ sudo ln -s redmine-2.3.1 redmine
lib$
lib$ sudo service unicorn start
/var/lib/redmine: Starting
lib$

バージョンアップの補足

プラグインをコピーしている理由

こつというか、過去エラーになった状況を回避することですが、プラグインは可能なかぎりそのままコピーします。プラグインのバージョンを変えるとかもう使わないので削除するという場合も、いったんコピーしてRedmine全体のバージョンアップをしてから、個別にバージョンアップまたはアンインストール操作をします。

もし、Redmineのバージョンアップを妨げるようなプラグインが存在した場合は、前のバージョンでそのプラグインをアンインストール操作をしてからRedmineをバージョンアップするとよいでしょう。

以前、あるプラグインRedmine標準のデータベーステーブルに列を追加しており、それがNOT NULL制約付きであり、そのプラグインをバージョンアップ時にコピーしなかったら以後そのテーブルに書き込みが発生するとInternal Errorとなる事態になってしまったことがありました。
そもそも、Redmine標準のテーブルスキーマを変えてしまうプラグインは設計としてどうなの? と思ったのですが、アンインストール操作をしない形だったので使う側の責なのでしょう・・・。

filesディレクトリをコピーではなく移動している理由

運用で使っているRedmineには、結構添付ファイルがたまっているので(数十GB以上)、コピーしていると容量がそれなりにバカにならないサイズになるためです。
数TBのHDD環境であれば気にしないのですが、仮想環境で運用しているので気にしてしまいます。
気にしない環境であればコピーでよいかもしれません。

仮想環境ならスナップショットとればMySQLバックアップいらないかも

いまさら気づいたのですが、仮想環境で動かしているのであれば、問題あれば戻ってやり直せるスナップショットを取っておけば、MySQLバックアップいらないですね。

保守のための運用停止期間のアナウンス

いままで、保守のために運用止めるときの効果的なアナウンス方法がなく困っていましたが(情報共有のためのWiki/掲示板にいろいろ情報を載せて都度URLを公開しているので、利用者が特定できない)、バナープラグインを知って重宝しました。(Redmine 2.3.0でのプラグイン動作メモ - torutkの日記参照)

予行演習

マイナーバージョンアップ以外は、事前に模擬環境を作ってそこでバージョンアップ作業をして問題を確認し、支障がないと判断したら本番環境のバージョンアップ作業をしています。
本番環境のMySQLバックアップとfiles、プラグイン一式から同じRedmineバージョンの模擬環境を作って、そこから新しいRedmineバージョンへのアップデートを行い確認します。

模擬環境として別マシン(別仮想マシン)が用意できないというときは、MySQLに別データベース名でコピーを作り、そこを使う設定で模擬環境を(同一マシン上に)作りました。そのときはPassengerでしたが、Passengerは複数立てるのが難しそうだったのでWEBrickで動作・確認しました。