サーバ

JIRA 6.0 のインストール/アップデート(バージョン 5.2 から) #JIRA #atlassian

JIRA はAtlassian社のJava ベースの人気バグトラッキングシステムで、TwitterJBossApacheCodehausTwitterでも使われています。
とっつきやすさと高機能をうまく両立しており、また見た目が洗練されている素晴らしい製品です。
オープンソースプロジェクトへは無償ライセンスを提供してくれるので私のプロジェクトでも使っています

今回は5.2からリリースされたばかりの6.0へアップグレードをしました、新規インストールの手順もほとんど同じ。

1. 現行 JIRA のバックアップ、新規インスタンスでインポート
既存 JIRA インスタンスより、
ADMINISTRATION > Import & Export > Backup System
File name: jirabackup130522 > "Backup"

無事成功すると Data exported to: /Users/yusukey/jirahome/export/jirabackup130522.zip
と表示されます。(JIRA4.4からはzipで圧縮されるようになった)
ここで現行インススタンスはシャットダウンします。

2. Atlassian より最新版をダウンロード
http://www.atlassian.com/software/jira/downloadより atlassian-jira-6.0.tar.gz をダウンロードします。

3. データベースの作成
ウチではMySQLを使っているので以下の様な感じ。

./mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 5.X.XXMySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database jira600 character set utf8;
Query OK, 1 row affected (0.00 sec)

以前データベースへのコネクションプールの設定は conf/server.xml 内にしていましたがこれはJIRAの管理画面から設定するように変更になりました。

4. JIRA Configuration Toolによるデータソース、JIRA_HOMEの設定
以前はatlassian-jira/WEB-INF/classes/entityengine.xmlを手動してデータベース接続先を指定していましたが、JIRA4.4以降ではJIRA Configuration Toolという簡単なGUIで設定をできるようになりました。Configuration Toolはbin/config.shまたはconfig.batで起動できます。
または初回起動後にWebUIで設定することもできるそうです。

Configuration Toolの画面

JIRAは以前のようにMySQLのJDBCドライバを同梱しなくなったので以下のように古いJIRAインスタンスから手動でlibディレクトリに配置する必要があります。Configuration Tool起動後でも大丈夫。

cp ../jira-5.2/lib/mysql-connector-java-5.1.10.jar lib

データベース接続の設定内容は $JIRA_HOME/dbconfig.xml に、またJIRA HOMEはatlassian-jira/WEB-INF/classes/jira-application.propertiesに保存され、手動で変更することも可能です。

ちなみにdbconfig.xmlの内容はこんな感じ。

<?xml version=”1.0″ encoding=”UTF-8″?>

<jira-database-config>
<name>defaultDS</name>
<delegator-name>default</delegator-name>
<database-type>mysql</database-type>
<jdbc-datasource>
<url>jdbc:mysql://localhost:3306/jira600?useUnicode=true&amp;characterEncoding=UTF8</url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<username>mysqluser</username>
<password>********</password>
<pool-size>15</pool-size>
<validation-query>select 1</validation-query>
</jdbc-datasource>
</jira-database-config>

以前はMySQLで文字化け対策としてJDBCURLに useUnicode=true&characterEncoding=UTF8 と指定していましたが、Configuration Toolは自動的にこれらを追加してくれるみたいです。

5. server.xmlの設定
ウチのサーバではApacheをフロントに立ててAJPで接続しているのでAJPコネクタをセットアップします。また使わないHTTPコネクタは無効に設定。


<Server port="9005" shutdown="SHUTDOWN">
.
.
.
<!--
<Connector port="8080"
.
.
.

</Engine>
<Connector port="9009"
maxHttpHeaderSize="8192" maxThreads="20" minSpareThreads="20" maxSpareThreads="20" useBodyEncodingForURI="true"
protocol="AJP/1.3" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="600000" disableUploadTimeout="true" />
</Service>
</Server>

6. JIRA の起動
startup.sh より起動。start-jira.sh というスクリプトもあるけど何が違うのかは不明。
"No jira.home is configured."と出て起動できなかった

7. データのインポート
JIRA にアクセスし、インポート。
最近のバージョンではエクスポートしたファイルは JIRA_HOMEのimportディレクトリに配置しておく必要があります。

$ mv ~/jirahome/export/jirabackup130522.zip ~/jirahome/import/

Import Existing Data
File name: jirabackup121114.zip

便利!

インポート中の状況表示

8. インポート失敗!
以上でバージョンアップが完了・・・・のはずがAO4AEACD_WEBHOOK_DAOというテーブルが重複しているとかでインポートに失敗してしまい今日は断念。

エラーメッセージ全文:

There was a problem restoring ActiveObjects data for the plugin JIRA WebHooks Plugin(com.atlassian.jira.plugins.webhooks.jira-webhooks-plugin) #1.0.10 plugin. Importing table AO_4AEACD_WEBHOOK_DAO failed. Please check the log for details.

例外スタックトレース全文:

2013-05-22 02:07:14,706 JiraImportTaskExecutionThread-1 ERROR anonymous 127x21x1 18sbkw7 118.243.84.51 /secure/SetupImport.jspa [jira.bc.dataimport.DefaultDataImportService] Error during ActiveObjects restore
com.atlassian.activeobjects.spi.ActiveObjectsImportExportException: There was an error during import/export with plugin JIRA WebHooks Plugin(com.atlassian.jira.plugins.webhooks.jira-webhooks-plugin) #1.0.10 (table AO_4AEACD_WEBHOOK_DAO):Error executing update for SQL statement 'CREATE TABLE AO_4AEACD_WEBHOOK_DAO (
ENABLED BOOLEAN,
ENCODED_EVENTS TEXT,
EXCLUDE_ISSUE_DETAILS BOOLEAN,
FILTER TEXT,
ID INTEGER AUTO_INCREMENT,
LAST_UPDATED DATETIME,
LAST_UPDATED_USER VARCHAR(255),
NAME TEXT,
REGISTRATION_METHOD VARCHAR(255),
URL TEXT,
PRIMARY KEY(ID)
) ENGINE=InnoDB'
at com.atlassian.activeobjects.backup.ImportExportErrorServiceImpl.newImportExportSqlException(ImportExportErrorServiceImpl.java:30)
at com.atlassian.activeobjects.backup.SqlUtils.onSqlException(SqlUtils.java:53)
at com.atlassian.activeobjects.backup.SqlUtils.executeUpdate(SqlUtils.java:42)
at com.atlassian.activeobjects.backup.ActiveObjectsTableCreator.create(ActiveObjectsTableCreator.java:84)
at com.atlassian.activeobjects.backup.ActiveObjectsTableCreator.create(ActiveObjectsTableCreator.java:62)
at com.atlassian.dbexporter.importer.TableDefinitionImporter.doImportNode(TableDefinitionImporter.java:50)
at com.atlassian.dbexporter.importer.AbstractImporter.importNode(AbstractImporter.java:49)
at com.atlassian.dbexporter.DbImporter.importData(DbImporter.java:73)
at com.atlassian.activeobjects.backup.ActiveObjectsBackup.restore(ActiveObjectsBackup.java:158)
at com.atlassian.jira.bc.dataimport.DefaultDataImportService.restoreActiveObjects(DefaultDataImportService.java:467)
at com.atlassian.jira.bc.dataimport.DefaultDataImportService.performImport(DefaultDataImportService.java:673)
at com.atlassian.jira.bc.dataimport.DefaultDataImportService.doImport(DefaultDataImportService.java:273)
at com.atlassian.jira.web.action.setup.DataImportAsyncCommand.call(DataImportAsyncCommand.java:66)
at com.atlassian.jira.web.action.setup.DataImportAsyncCommand.call(DataImportAsyncCommand.java:29)
at com.atlassian.jira.task.ImportTaskManagerImpl$TaskCallableDecorator.call(ImportTaskManagerImpl.java:146)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:680)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'ao_4aeacd_webhook_dao' already exists
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2642)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1647)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1566)
at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
at org.apache.commons.dbcp.DelegatingStatement.executeUpdate(DelegatingStatement.java:228)
at com.atlassian.activeobjects.backup.SqlUtils.executeUpdate(SqlUtils.java:37)
... 20 more

9. なるほどよくわからん
インポートに失敗するので推奨される方法ではないけどJIRA5.2のデータベースをまるまるコピーしてみることに。
するとやはりao_4aeacd_webhook_daoというテーブルの重複が。あれ?

$ mysqldump jira520 | mysql jira600
ERROR 1050 (42S01) at line 23: Table 'ao_4aeacd_webhook_dao' already exists
mysqldump: Got errno 32 on write

データベースの破損を疑ったけれども壊れている様子はない。

$ mysqlcheck jira520
jira520.ao_4aeacd_webhook_dao OK
jira520.ao_563aee_activity_entity OK
jira520.ao_563aee_actor_entity OK
jira520.ao_563aee_media_link_entity OK
...

関連記事:
JIRA 5.2 のインストール/アップデート(バージョン 5.0.4 から) #JIRA #atlassian – #侍ズム
JIRA 5.0.4 のインストール/アップデート(バージョン 4.4.3 から) #JIRA #atlassian – 侍ズム #samuraism
JIRA 4.4.3 のインストール/アップデート(バージョン 4.4 から) #JIRA #atlassian – 侍ズム #samuraism
JIRA 4.4 のインストール/アップデート(バージョン 4.3.4 から) #JIRA #atlassian – 侍ズム
JIRA 4.3.4 のインストール/アップデート(バージョン 4.3 から) – 侍ズム
JIRA 4.3 のインストール/アップデート(バージョン 4.2.2 から) – 侍ズム
JIRA 4.2.2 のインストール/アップデート(バージョン 4.2.0 から) – 侍ズム
JIRA Git Plugin のインストール – 侍ズム
JIRA 4.2 のインストール/アップグレード(バージョン 4.1 から) – 侍ズム
JIRA 4.1 のインストール/アップグレード(バージョン 4.0.2 から) – 侍ズム
JIRA 4.0.0 から JIRA 4.0.2 へのアップグレード – 侍ズム
アトラシアン(Atlassian)製品の価格と購入方法
Atlassian が JIRA4 をリリース – 指名ユーザライセンス制を導入 – 侍ズム
JIRA 3.13.1 へ FishEye プラグイン 2.3 をインストール
JIRA をバージョン 3.13.1 へアップデート – 侍ズム
FishEye 1.6.3 のインストール
JIRA をバージョン 3.12.3 へアップデート