アカベコマイリ

HEAR NOTHING SEE NOTHING SAY NOTHING

rbenv と Redmine 2.4.3 更新

2014/2/8 に Redmine 2.4.3 がリリースされたので更新してみる。せっかくなので Ruby のほうも最新の安定版を入れることにした。

対象環境はさくらのVPS 2GB プラン。これまで Ruby は checkinstall で RPM 化したものを利用してきたが今回から rbenv で管理してみる。環境構築についてはシリーズ過去記事を参照のこと。最後の記事は 2012/6 だが Ruby 周りはそのままである。

既存 Ruby 環境をアンインストール

これから入れる Ruby と干渉すると思われるため、さくらのVPS を改めて使いはじめる 9 - Ruby、Redmine、Subversion でインストールした Ruby をアンインストールする。

作業中に Redmine を操作されたら困るので非公開にしておく。私はシンボリック リンク経由で公開しているため、これを消す。メンテナンス用ページがあるならそこへ案内してもよいだろう。

$ sudo rm -rf /var/www/html/projects

Ruby 上で動作する gem を消す。もし gem と他のソフトウェアで連携している設定があれば、それも対象になる。現在は Phusion Passenger を利用して Apache 連携しているため、これも含む。

$ sudo /usr/local/bin/gem uninstall passenger
Remove executables:
    passenger, passenger-install-apache2-module, passenger-install-nginx-module, passenger-config, passenger-status, passenger-memory-stats, passenger-make-enterprisey

in addition to the gem? [Yn]  Y
Removing passenger
Removing passenger-install-apache2-module
Removing passenger-install-nginx-module
Removing passenger-config
Removing passenger-status
Removing passenger-memory-stats
Removing passenger-make-enterprisey
Successfully uninstalled passenger-3.0.12

gem を PATH に通しておくのを忘れてたので sudo から実行はフルパスで指定してる。アンインストール時のメッセージにも表示されているが依存するモジュールも一緒に消してくれている。

つぎに Apache の conf から Passenger 関連を消す。私の環境では passenger.conf というファイルにくくり出しているので、これを削除して Apache を再起動。削除した後に apachectl configtest で設定が壊れていないことを確認してからとしている。

$ sudo rm /etc/httpd/conf.d/passenger.conf
$ sudo apachectl configtest
Syntax OK
$ sudo service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

他の gem は特に連携などをおこなっていないため一挙に消す。以下の記事を参考にコマンドを実行してみる。

$ sudo /usr/local/bin/gem uni $(gem li --no-versions)

Select gem to uninstall:
 1. actionmailer-2.3.14
 2. actionmailer-3.2.3
 3. actionmailer-3.2.5
 4. actionmailer-3.2.8
 5. actionmailer-3.2.9
 6. actionmailer-3.2.13
 7. All versions
> 7

この方法だと gem ごとにアンインストール用メニューが表示されて対話形式で進行してゆく。削除対象のバージョンを聞かれたら All versions の番号、作業の継続を Yn で問い合わせられたら Y を入力。対話なしで一括実行する方法もありそうだけど今回はこれでゆく。

ひととおり消し終わったら改めてコマンド実行してみる。残っているものがあればそれらのアンインストールが実行される。なにもなければ以下のように、その旨を示すエラーが表示される。

$ sudo /usr/local/bin/gem uni $(gem li --no-versions)
ERROR:  While executing gem ... (Gem::CommandLineError)
    Please specify at least one gem name (e.g. gem build GEMNAME)

gem を消したら次は Ruby 本体を消す。私は CheckInstall によって RPM 化したものをインストールしたのでこれが対象となる。

まずは Ruby のパッケージ名を確認。rpm コマンドに -qa オプションを指定することで全パッケージを表示できる。その中から Ruby 関連を絞り込む。

$ rpm -qa | grep ruby
ruby-1.9.3-p194-1.x86_64

パッケージ名を確認したので、それを指定してアンインストール。

$ sudo rpm -e ruby-1.9.3-p194-1.x86_64

改めてパッケージ確認してみると何も表示されない。また ruby コマンドが存在しない状態になるはず。これで既存 Ruby 環境のアンインストールは完了。

rbenv と ruby-build のインストール

rbenv とは、Ruby の環境を管理するためのツールである。Ruby + Environment で rbenv なのだろうか?名が体を表していてわかりやすい。

GitHub の README がリファレンスを兼ねており、ここを読むだけで十分な情報を得られる。日本語で読めるものだと以下の記事がわかりやすい。今回の作業でも参考にさせていただいた。

まず rbenv の利用に必要なパッケージを入れる。過去に Ruby と Redmine が動作する環境を構築していたなら大半はインストール済みだろう。パッケージの数が多いので参考にした uehatsu 氏の記事と同様にコマンドを分割掲載しておく。

$ sudo yum install gcc gcc-c++ make git openssl-devel readline-devel zlib-devel
$ sudo yum install libcurl-devel ImageMagick ImageMagick-devel ipa-gothic-fonts
$ sudo yum install ipa-mincho-fonts ipa-pgothic-fonts.noarch ipa-pmincho-fonts.noarch

次に sudo 経由で rbenv を実行するための設定をおこなう。参考にした「つくば日記(仮)」には背景も含めた説明があるのでこのあたりは割愛。visudo で設定ファイルを新規作成。

$ sudo visudo -f /etc/sudoers.d/00_base

以下を記述して保存。

Defaults !secure_path
Defaults env_keep += "PATH RBENV_ROOT"

設定ファイルに記述した環境変数を追加。

$ export RBENV_ROOT=/usr/local/rbenv
$ export PATH=${RBENV_ROOT}/bin:${PATH}

この環境変数を利用して GitHub のリポジトリから rbenvruby-build を clone。

$ sudo git clone https://github.com/sstephenson/rbenv.git ${RBENV_ROOT}
$ sudo git clone https://github.com/sstephenson/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build

rbenv 初期化。コマンドを実行すると export された環境変数などが表示される。

$ sudo rbenv init -
export PATH="/usr/local/rbenv/shims:${PATH}"
export RBENV_SHELL=sudo
rbenv rehash 2>/dev/null
rbenv() {
  local command
  command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  rehash|shell)
    eval "`rbenv "sh-$command" "$@"`";;
  *)
    command rbenv "$command" "$@";;
  esac
}

現在のユーザーで rbenv を利用するために .bash_profile へ設定を追加する。

$ vi .bash_profile

以下を追記して保存。

export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"

保存された設定を反映するため .bash_profile を読み直す。

$ source ~/.bash_profile

これで PATH が通ったはず。試しに rbenv コマンドをオプション指定なしで実行してみるとバージョンやオプションなどが表示される。

$ rbenv
rbenv 0.4.0-89-g14bc162
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using ruby-build
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/sstephenson/rbenv#readme

rbenv と ruby-build がインストールされると rbenv install で呼び出せるようになる。動作確認のため、インストール可能な Ruby のバージョン一覧を表示してみる。

$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420

... 以下、略

ばっちり。これで Ruby 環境の管理ツールが準備できた。次は Ruby 関連をインストールする。

Ruby 関連のインストール

ここからは Ruby と gem をインストールしてゆく。今回の最終目標は Redmine を動作させることなので、公式のインストール説明ページから動作環境を確認する。

現時点で最新の Redmine 2.4.3 では Ruby 2.0 系までサポートしているようだ。ちなみに Ruby 安定版の最新は 2.1。

リリースノートを読むと深刻な非互換はないそうなので 2.1 系を試して問題がありそうなら 2.0 系へ切り替える。rbenv は複数バージョンの Ruby を柔軟に切り替えられるのだ。この便利さも採用動機である。

というわけで 2.1 系をインストール。rbenv install の後に -l オプションで表示されたバージョン名を指定する。2.1 系はいくつかあるが安定版はサフィックスなしの 2.1.0 になるようだ。インストールにはけっこう時間がかかる。私の環境では 6 分ぐらい待たされた。

$ sudo rbenv install 2.1.0
Downloading ruby-2.1.0.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/9e6386d53f5200a3e7069107405b93f7
Installing ruby-2.1.0...
Installed ruby-2.1.0 to /usr/local/rbenv/versions/2.1.0

Ruby をインストールしたらシステム全体で利用できるようにする。rbenv global の後に利用する Ruby のバージョンを指定することでそれがグローバルになる。rbenv rehash を実行することで変更を反映できる。

$ sudo rbenv global 2.1.0
$ sudo rbenv rehash

試しに sudo なしで Ruby のバージョンを確認してみよう。

$ ruby --version
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]

ばっちり。Ruby を複数インストールしておいて後から簡単に切り替えられるというわけだ。実に便利。

Ruby がインストールできたので今度は gem を追加してみよう。グローバルにした Ruby で利用するなら sudo 経由で gem install を実行することで Ruby 環境全体に追加される。これも Ruby のバージョンごとに住み分けられるようだ。よくできてる。

今回は Redmine 用に BundlerPassenger を入れる。まずは Bundler。

$ sudo gem install bundler --no-rdoc --no-ri
Fetching: bundler-1.5.3.gem (100%)
Successfully installed bundler-1.5.3
1 gem installed

次は Passenger。これを使って Apache や Nginx 上で Rails アプリを動かす。

$ sudo gem install passenger --no-rdoc --no-ri
Fetching: daemon_controller-1.1.8.gem (100%)
Successfully installed daemon_controller-1.1.8
Fetching: rack-1.5.2.gem (100%)
Successfully installed rack-1.5.2
Fetching: passenger-4.0.37.gem (100%)
Building native extensions.  This could take a while...
Successfully installed passenger-4.0.37
3 gems installed

グローバルな Ruby 環境に gem をインストールしたので rbenv をリフレッシュ。

$ sudo rbenv rehash

Passenger の Apache 用モジュールをインストール。

余談。この作業の途中で連携対象となる言語を Ruby や Python などから選択することになるのだけど、この入力は矢印キーを受けつけている。しかも縦に移動するようになっているため CUI なのに GUI 的な操作ができる。コマンドライン ツールの UI といえばせいぜい文字入力で Yn や数値でモード選択ぐらいだと思っていたので感心させられた。

$ sudo passenger-install-apache2-module

...中略

--------------------------------------------
Almost there!

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

   LoadModule passenger_module /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/passenger-4.0.37/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/passenger-4.0.37
     PassengerDefaultRuby /usr/local/rbenv/versions/2.1.0/bin/ruby
   </IfModule>

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!

Press ENTER to continue.

--------------------------------------------

Deploying a web application: an example

Suppose you have a web 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
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </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/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/passenger-4.0.37/doc/Users guide Apache.html
  http://www.modrails.com/documentation/Users%20guide%20Apache.html

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

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

最後の方に Apache 用の設定が表示されるのでメモ必ずしておくこと。この内容は Apache の httpd.conf 本体に書くのではなく専用ファイルを用意する。前に環境構築した時と同様に passenger.conf という名前で作成する。

$ sudo vi /etc/httpd/conf.d/passenger.conf

passenger.conf にさきほどの Apache 用設定を記述してついでに Redmine を公開するときのディレクトリ設定も加えて保存。今回は http://ホスト名/projects に公開するので以下のようになる。パスを見ると gem のバージョンが含まれているため rbenv でバージョンを切り替える場合はここも変更する必要あり。

これらをうまく変数化できるとよいのだけど難しいかな。簡単に対応するとしたらひとつの passenger.conf に複数バージョンの設定を定義しておきカレントではないものをコメントアウトすることになるだろうか。

LoadModule passenger_module /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/passenger-4.0.37/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /usr/local/rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/passenger-4.0.37
     PassengerDefaultRuby /usr/local/rbenv/versions/2.1.0/bin/ruby
   </IfModule>

RailsBaseURI /projects

Apache の設定チェックと再起動をおこない、passenger.conf を読ませる。

$ sudo apachectl configtest
Syntax OK
$ sudo service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]

これで Ruby 関連の動作環境が整った。次は Redmine を更新。

Redmine 更新

Redmine を更新する。新規・更新ともに さくらのVPS を改めて使いはじめる 9 - Ruby、Redmine、Subversion で書いた手順からそれほど変わらないと思うのでそのまま参考にする。

以前だと RubyForge の Redmine から最新版をダウンロードしていたのだが現在は Redmine のサイトで公開しているようだ。ここのリンク URL から wget コマンドでユーザー HOME にダウンロードして展開。その後 /var/lib/redmine-new へ移動。

$ cd
$ wget http://www.redmine.org/releases/redmine-2.4.3.tar.gz
$ tar zxvf redmine-2.4.3.tar.gz
$ sudo mv redmine-2.4.3 /var/lib/redmine-new
$ rm -rf redmine-2.4.3.tar.gz

これで /var/lib 以下に現行の redmine と最新の redmine-new が格納された状態になったので設定を引き継ぐ。プラグインを追加していたなら redmine 直下の plugins もコピーしておく。重複するものが多いので plugins ディレクトリではなく、その中のプラグインを個別でコピーしたほうが古いもので上書きする危険がなくて安全。あとテーマは public/themes になっているので注意する。

$ cd /var/lib
$ cp redmine/config/database.yml redmine-new/config/database.yml
$ cp -r redmine/config/email.yml redmine-new/config/email.yml
$ cp -r redmine/files/ redmine-new/

引き継ぎが完了したらディレクトリ名を以下のように変更。

$ cd /var/lib
$ sudo mv redmine redmine-old
$ sudo mv redmine-new redmine

/var/lib/redmine/public 内に plugin_assets ディレクトリが存在しないと、Redmine の管理画面の情報に表示される「Plugin assetsディレクトリに書き込み可能」がエラーになるので作成しておく。

$ cd /var/lib/redmine/public
$ mkdir plugin_assets

Redmine のインストール ディレクトリに移動して必要な Gem を Bundler で一括インストール。これは rbenv 管轄ではなく Redmine 専用となる。

$ cd /var/lib/redmine
$ bundle install --without development test postgresql sqlite
Your Gemfile lists the gem activerecord-jdbcmysql-adapter (>= 0) more than once.
You should probably keep only one of them.
While it's not a problem now, it could cause errors if you change the version of just one of them later.

Fetching gem metadata from https://rubygems.org/.........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Installing rake (10.1.1)
Installing i18n (0.6.9)
Installing multi_json (1.8.4)
Installing activesupport (3.2.16)
Installing builder (3.0.0)
Installing activemodel (3.2.16)
Installing erubis (2.7.0)
Installing journey (1.0.4)
Installing rack (1.4.5)
Installing rack-cache (1.2)
Installing rack-test (0.6.2)
Installing hike (1.2.3)
Installing tilt (1.4.1)
Installing sprockets (2.2.2)
Installing actionpack (3.2.16)
Installing mime-types (1.25.1)
Installing polyglot (0.3.3)
Installing treetop (1.4.15)
Installing mail (2.5.4)
Installing actionmailer (3.2.16)
Installing arel (3.0.3)
Installing tzinfo (0.3.38)
Installing activerecord (3.2.16)
Installing activeresource (3.2.16)
Using bundler (1.5.3)
Installing coderay (1.1.0)
Installing rack-ssl (1.3.3)
Using json (1.8.1)
Installing rdoc (3.12.2)
Installing thor (0.18.1)
Installing railties (3.2.16)
Installing jquery-rails (2.0.3)
Installing mysql (2.8.1)
Installing mysql2 (0.3.15)
Installing net-ldap (0.3.1)
Installing pg (0.17.1)
Installing ruby-openid (2.3.0)
Installing rack-openid (1.4.2)
Installing rails (3.2.16)
Installing rmagick (2.13.2)
Installing sqlite3 (1.3.8)
Your bundle is complete!
Gems in the groups development, test, postgresql and sqlite were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from rdoc:
Depending on your version of ruby, you may need to install ruby rdoc/ri data:

<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!

セッション管理用の鍵を初期化してからデータベースをマイグレート。

$ cd /var/lib/redmine
$ rake generate_secret_token
$ rake db:migrate RAILS_ENV="production"
$ rake db:migrate:upgrade_plugin_migrations RAILS_ENV=production
$ rake db:migrate_plugins RAILS_ENV=production
$ rake tmp:cache:clear
$ rake tmp:sessions:clear

更新完了。シンボリックリンクを張り直して Redmine を再公開する。

$ sudo ln -s /var/lib/redmine/public /var/www/html/projects

Redmine にログインしてバージョンなどを確認。

Redmine の情報

ばっちり!というわけで作業完了。