しばたテックブログ

PowerShellを中心に気分で書いている技術ブログです。

Redmineをアップグレードしてみた

結構前にやった作業記録なんですが、個人的な備忘録としてブログに残しておきます。

blog.shibata.tech

で構築したRedmineですが新しいバージョンがリリースされていたのでアップグレードしてみました。
3.4.2 → 3.4.3へのアップグレードをしています。

1. 公式な手順

Redmineのアップグレードについて、公式な手順はこちらにあります。

アップグレード - Redmine Guide 日本語訳

日本語訳がしっかり用意されているのは私みたいな利用者からすると非常にありがたいです。

環境によって細かい手順は変わりますが、基本的には、

  • 新バージョンのRedmineの展開
  • データベースのバックアップと(必要があれば)移行
  • 添付ファイルのバックアップと移行
  • Redmineのアップグレード
  • データベースのアップグレード
  • クリーンアップ

という手順を踏むことになります。

1. 新バージョンのRedmineの展開

最初に新しいバージョンのRedmineを展開します。

現時点ではC:\redmine-3.4.2にRedmineをインストールしていますので、C:\redmine-3.4.3に新しいバージョンのRedmineを展開してアップグレードすることにします。

手順としてはもう少し後でも構わないのですが、最初に現行のRedmineのサービスを止めておきます。

# サービス停止
$REDMINE_SERVICE_NAME = "Redmine"
$REDMINE_INSTALL_PORT = 3000
Stop-Service $REDMINE_SERVICE_NAME

サービスを止めたら新しいRedmineを展開します。
この手順についてはバージョンが違うだけで前にインストールしたときと同様になります。

# 新しいRedmineの展開
$REDMINE_VER = '3.4.3'
$REDMINE_INSTALL_ROOT = 'C:\'
$REDMINE_INSTALL_PATH = Join-Path $REDMINE_INSTALL_ROOT "redmine-$REDMINE_VER"
# Zipのダウンロード
Invoke-WebRequest -Uri "http://www.redmine.org/releases/redmine-$REDMINE_VER.zip" -OutFile "$(Get-Location -PSProvider Filesystem)\redmine-$REDMINE_VER.zip"
# PowerShell 4.0だとZipを扱えないのでRubyで頑張って解凍する
# ※いったんカレントディレクトリに解凍してから移動している
gem install rubyzip --no-rdoc --no-ri
ruby -e "require 'zip'; Zip::File.open('.\redmine-$REDMINE_VER.zip') do |zip| zip.each do |entry| puts \""entry #{entry.name}\""; zip.extract(entry, entry.name) { true } end; end"
Move-Item ".\redmine-$REDMINE_VER" $REDMINE_INSTALL_ROOT -Force

2. データベースのバックアップ(とコピー)

今回の環境ではデータベースにSQLiteを使用しています。
Redmine 3.4.2のデータベースファイルを、先ほど展開したディレクトリにコピーして移行し、コピー元のファイルをバックアップとすることにします。

これは単純にファイル(config\database.ymldb\redmine.sqlite3")をコピーするだけです。

# データベースのコピー : SQLite
$OLD_REDMINE_PATH = "C:\redmine-3.4.2"
Copy-Item -LiteralPath (Join-Path $OLD_REDMINE_PATH "config\database.yml") -Destination (Join-Path $REDMINE_INSTALL_PATH "config\database.yml")
Copy-Item -LiteralPath (Join-Path $OLD_REDMINE_PATH "db\redmine.sqlite3") -Destination (Join-Path $REDMINE_INSTALL_PATH "db\redmine.sqlite3")

3. 添付ファイルのバックアップ(とコピー)

データベースと同様に添付ファイル(filesフォルダ)もコピーすることで新しいバージョンへの移行とバックアップを行います。

# filesフォルダの移行
Copy-Item -LiteralPath (Join-Path $OLD_REDMINE_PATH "files") -Destination (Join-Path $REDMINE_INSTALL_PATH "files") -Recurse

4. Redmineのアップグレード

ここからRedmineのアップグレードをしていきます。
公式な手順ではconfig/configuration.ymlを移行すると記載されていますが、今回の環境では設定していないため何もしません。
ただし、ThinをインストールするためにGemfile.localファイルを追加しているので、このファイルをコピーして移行しておきます。

# config/configuration.yml は今回の例では設定していないのでスキップ
# ただし、他にカスタマイズしている設定があればコピーしておくこと

# 今回は Gemfile.local(Thin Service用)をコピー
Copy-Item -LiteralPath (Join-Path $OLD_REDMINE_PATH "Gemfile.local") -Destination (Join-Path $REDMINE_INSTALL_PATH "Gemfile.local")

ここからは前にインストールした時と同様にbundle installを行い新しいバージョンのRedmine環境を構築します。

# DevKitへのPATHが通ってない場合は通しておく
$RUBY_DEVKIT_INSTALL_PATH = 'C:\MinGW'
$env:PATH = "$(Join-Path $RUBY_DEVKIT_INSTALL_PATH "bin");$(Join-Path $RUBY_DEVKIT_INSTALL_PATH "mingw\bin");" + $env:PATH

# bundle install
cd $REDMINE_INSTALL_PATH
bundle install --without development test rmagick --path vendor/bundle
# セッション改ざん防止用秘密鍵の作成
bundle exec rake generate_secret_token

5. データベースのアップグレード

# データベースのマイグレーション
bundle exec rake db:migrate RAILS_ENV="production"

6. クリーンアップ

# キャッシュとセッションファイルのクリア
bundle exec rake tmp:cache:clear tmp:sessions:clear RAILS_ENV="production"

7. サービス設定の変更

ここまでの手順で新しいバージョンのRedmine環境の構築が完了しているので、Thinで起動するRedmineを新しいバージョンのものに変更することで環境の切り替えを行います。

# Thinの再登録
thin_service remove -N $REDMINE_SERVICE_NAME
thin_service install -N $REDMINE_SERVICE_NAME -c "$REDMINE_INSTALL_PATH" -p $REDMINE_INSTALL_PORT -e production
# サービス起動
Start-Service Redmine

動作確認

以上でアップグレードは完了です。
ブラウザからRedmineにログインしてバージョンが新しくなっている事、正しくデータ移行できていることが確認できればOKです。

f:id:stknohg:20171209222019p:plain