torutkのブログ

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

Redmineのバージョンアップに追従しやすくする

はじめに

昨年11月に開催された Redmine.Tokyo勉強会(第11回)で、ファーエンドテクノロジーの前田さんが「Redmineのバージョンアップに追従していくための一工夫」というセッションがありました。(セッションスライドのURLは次です)
http://www.slideshare.net/g_maeda/redmine-69542739

これによると、バージョンアップ作業を楽にするために、次の工夫をするとよいとありました。

そこで、現在Redmine 3.3.0を動かしているサーバーを3.3.2にアップデートする際にRedmineのコードをリポジトリからチェックアウトして使用することとします。

Redmineソースコードのチェックアウト

Redmineの公式リポジトリは次のURLになります。
http://svn.redmine.org/redmine/

本日時点でのRedmineの最新バージョンは3.3.2で、ブランチ名は3.3-stable、タグ名は3.3.2となります。

バージョンアップに追従するためには、リリースブランチをチェックアウトすることになります。そこで、本日時点の最新バージョンのリリースブランチである次をチェックアウトします。
http://svn.redmine.org/redmine/branches/3.3-stable/

~$ cd /var/lib
lib$ sudo mkdir redmine-3.3-stable
lib$ sudo chown redmine:redmine redmine-3.3-stable
lib$ su redmine
パスワード:********
lib$ svn co http://svn.redmine.org/redmine/branches/3.3-stable/ redmine-3.3-stable/
  :
リビジョン 16197 をチェックアウトしました。
lib$ ls redmine-3.3-stable/
CONTRIBUTING.md  Rakefile      bin        db     files  plugins  test
Gemfile          app           config     doc    lib    public   tmp
README.rdoc      appveyor.yml  config.ru  extra  log    script   vendor
lib$

設定ファイル、プラグイン、テーマの移行

設定ファイルを、現在稼働しているredmine-3.3.0からコピーしてきます。

lib$ cd redmine-3.3-stable
redmine-3.3-stable$ cp -p ../redmine-3.3.0/config/configuration.yml config/
redmine-3.3-stable$ cp -p ../redmine-3.3.0/config/database.yml config/
redmine-3.3-stable$ cp -p ../redmine-3.3.0/config/unicorn.rb config/
redmine-3.3-stable$ cp -p ../redmine-3.3.0/Gemfile.local .

プラグインディレクトリ下にインストールしたプラグインをコピーしてきます。

redmine-3.3-stable$ rsync -av ../redmine-3.3.0/plugins/ plugins/

テーマディレクトリ下にインストールしたテーマをコピーしてきます。

redmine-3.3-stable$ rsync -av --exclude alternate --exclude classic ../redmine-3.3.0/public/themes/ public/themes/

プラグインおよびテーマを最新に更新します。
プラグインディレクトリへ移動し、リモートリポジトリから更新します。

redmine-3.3-stable$ cd plugins/clipboard_image_paste/
clipboard_image_paste$ git pull
Already up-to-date.
clipboard_image_paste$ cd ../redmine_banner/
redmine_banner$ git pull
remote: Counting objects: 64, done.
  :
redmine_banner$ cd ../redmine_embedded_flash/
redmine_embedded_flash$ git pull
Already up-to-date.
redmine_embedded_flash$ cd ../redmine_github_hook/
redmine_github_hook$ git pull
Already up-to-date.
redmine_github_hook$ cd ../redmine_glossary/
redmine_glossary$ git pull
remote: Counting objects: 6, done.
  :
redmine_glossary$ cd ../redmine_issue_templates/
redmine_issue_templates$ hg pull
  :
added 1 changesets with 1 changes to 1 files
(run 'hg update' to get a working copy)
redmine_issue_templates$ hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
redmine_issue_templates$ cd ../redmine_startpage/
redmine_startpage$ git pull
Already up-to-date.
redmine_startpage$ cd ../redmine_wiki_extensions/
redmine_wiki_extensions$ hg pull
  :
no changes found
redmine_wiki_extensions$ cd ../sidebar_hide/
sidebar_hide$ git pull
remote: Counting objects: 33, done.
  :
sidebar_hide$ cd ../view_customize/
view_customize$ git pull
Already up-to-date.
view_customize$

テーマについても同様更新します。

plugins$ cd ../public/themes/
themes$ cd farend_fancy/
farend_fancy$ git pull
Already up-to-date.
farend_fancy$ cd ../fedmine/
fedmine$ git pull
Already up-to-date.
fedmine$ cd ../gitmike/
gitmike$ git pull
remote: Counting objects: 87, done.
  :
gitmike$ cd ../redmine-theme-whitepaper/
redmine-theme-whitepaper$ git pull
Already up-to-date.
redmine-theme-whitepaper$

gemファイル群のインストール

redmine-3.3-stable$ bundle install --path vendor/bundler --without development test
Warning: this Gemfile contains multiple primary sources. Using `source` more than once without a block is a security risk, and may result in installing unexpected gems. To resolve this warning, use a block to indicate which gems should come from the secondary source. To upgrade this warning to an error, run `bundle config disable_multisource true`.
Your Gemfile lists the gem simplecov-rcov (>= 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 version metadata from https://rubygems.org/
Fetching dependency metadata from https://rubygems.org/
Resolving dependencies....................................
Installing rake 12.0.0
Installing i18n 0.7.0
Installing json 1.8.6 with native extensions
Installing minitest 5.10.1
Installing thread_safe 0.3.5
Installing builder 3.2.3
Installing erubis 2.7.0
Installing mini_portile2 2.1.0
Installing rack 1.6.5
Installing mime-types-data 3.2016.0521
Installing arel 6.0.4
Installing public_suffix 2.0.5
Using bundler 1.12.5
Installing coderay 1.1.1
Installing concurrent-ruby 1.0.4
Installing htmlentities 4.3.1
Installing thor 0.19.4
Installing kgio 2.11.0 with native extensions
Installing mimemagic 0.3.2
Installing mysql2 0.3.21 with native extensions
Installing net-ldap 0.12.1
Installing ruby-openid 2.3.0
Installing raindrops 0.17.0 with native extensions
Installing rbpdf-font 1.19.0
Installing redcarpet 3.3.4 with native extensions
Using redmine_github_hook 2.2.0 from source at `/var/lib/redmine-3.3-stable/plugins/redmine_github_hook`
Installing request_store 1.0.5
Installing rmagick 2.16.0 with native extensions
Installing tzinfo 1.2.2
Installing nokogiri 1.6.8.1 with native extensions
Installing rack-test 0.6.3
Installing mime-types 3.1
Installing addressable 2.5.0
Installing sprockets 3.7.1
Installing rack-openid 1.4.2
Installing unicorn 5.2.0 with native extensions
Installing rbpdf 1.19.0
Installing activesupport 4.2.7.1
Installing loofah 2.0.3
Installing mail 2.6.4
Installing css_parser 1.4.7
Installing rails-deprecated_sanitizer 1.0.3
Installing globalid 0.3.7
Installing activemodel 4.2.7.1
Installing rails-html-sanitizer 1.0.3
Installing roadie 3.2.1
Installing rails-dom-testing 1.0.8
Installing activejob 4.2.7.1
Installing activerecord 4.2.7.1
Installing protected_attributes 1.1.3
Installing actionview 4.2.7.1
Installing actionpack 4.2.7.1
Installing actionmailer 4.2.7.1
Installing actionpack-action_caching 1.1.1
Installing actionpack-xml_parser 1.0.2
Installing railties 4.2.7.1
Installing sprockets-rails 3.2.0
Installing jquery-rails 3.1.4
Installing roadie-rails 1.1.1
Installing rails 4.2.7.1
Bundle complete! 38 Gemfile dependencies, 60 gems now installed.
Gems in the groups development and test were not installed.
Bundled gems are installed into ./vendor/bundler.
redmine-3.3-stable$

セッション鍵の生成

redmine-3.3-stable$ bundle exec rake generate_secret_token
/var/lib/redmine-3.3-stable/vendor/bundler/ruby/2.3.0/gems/htmlentities-4.3.1/lib/htmlentities/mappings/expanded.rb:465: warning: key "inodot" is duplicated and overwritten on line 466
redmine-3.3-stable$

データベースの移行

unicornを停止、念のためMySQLのダンプをしてから、データベース移行をします。

unicornの停止

~$ sudo service unicorn stop

MySQLのダンプ(バックアップ)

~$ mysqldump -uredminer -p db_redmine > redmine-mysql-$(date +%Y%m%dT%H%M%S).dump

データベース移行

redmine-3.3-stable$ bundle exec rake db:migrate RAILS_ENV=production
  :
redmine-3.3-stable$ bundle exec rake redmine:plugins:migrate RAILS_ENV=production
  :
redmine-3.3-stable$ bundle exec rake tmp:cache:clear tmp:sessions:clear
  :

添付ファイル置き場を移動し忘れていたので移動

redmine-3.3-stable$ mv files files.orig
redmine-3.3-stable$ mv ../redmine-3.3.0/files/ .

シンボリックリンク(/var/lib/redmine)を/var/lib/redmine-3.3-stableに差し替え

~$ cd /var/lib
lib$ sudo ln -nfs /var/lib/redmine-3.3-stable redmine

unicornの開始

~$ sudo service unicorn start

次回の更新でやる操作

これで、リポジトリから更新できるようになったので、次回からRedmineのバージョンアップで実施する操作は次のようになります。

Redmine 3.3.xへの更新
redmine-3.3-stable$ svn up
redmine-3.3-stable$ bundle update
redmine-3.3-stable$ bundle exec rake db:migrate RAILS_ENV=production
redmine-3.3-stable$ bundle exec rake tmp:clear RAILS_ENV=production
Redmine 3.4系への更新
redmine-3.3-stable$ svn sw ^/branches/3.4-stable
redmine-3.3-stable$ bundle update
redmine-3.3-stable$ bundle exec rake db:migrate RAILS_ENV=production
redmine-3.3-stable$ bundle exec rake tmp:clear RAILS_ENV=production