FessでJIRA/Confluenceを高速に横断検索する

この記事では、[全文検索サーバー Fess](https://github.com/codelibs/fess/)を利用してJIRAの課題(issue)やConfluenceのwikiコンテンツ等を横断検索する方法を紹介します。

これはFess上で実際にissueの検索を行っている画面のスクリーンショットです。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/1c37d886-a389-05b0-b7f7-d7513d8f43ab.png)

# JIRA/Confluenceとは？

JIRAはAtlassian社が開発したソフトウェアで、課題管理、進捗管理、スケジュール管理など、プロジェクト全般を広く管理することができます。
Confluenceは同じくAtlassian社のソフトウェアで、JIRAと連携して、wikiで情報共有を行うことができます。

# 導入手順

FessでJIRA/Confluenceを横断検索するための手順を説明します。

導入の流れは次のようになります。

1. プラグイン追加
1. Fessの起動
1. 認証設定
1. クローラの設定・実行

## 1. プラグイン追加

Fessの現バージョン(12.2.0)には、デフォルトでは含まれていない機能であるため、自分で追加する必要があります。

[ここ](http://central.maven.org/maven2/org/codelibs/fess/fess-ds-atlassian/12.2.0/)からfess-ds-atlassian-12.2.0.jarをダウンロードします。
ダウンロードしたjarファイルは`[Fessのパス]/app/WEB-INF/lib/`に配置します。

## 2. Fessの起動

[このページ](https://fess.codelibs.org/ja/12.2/install/run.html)を参考にFessを起動します。

JIRAのサーバー版を利用している場合、デフォルトでは`http://localhost:8080/`で起動します。
Fessもデフォルトでは`http://localhost:8080/`で起動するため、そのままでは衝突してしまいます。
衝突を避けるには、例えばFessを起動する際、

```
$ ./bin/fess -Dfess.port=8081
```

というような感じで、ポート番号を指定すればよいです。

## 3. 認証設定

データを取得するために認証情報をパラメータとして与える必要があり、そのための設定を行います。
認証方法としてはBasic認証またはOAuthを利用します。

### 3A. Basic認証の場合

利用しているAtlassian製品のアカウントのユーザー名とパスワードをパラメータとして与えます。
ここでは、特にJIRA/Confluence側で設定することはありません。

### 3B. OAuthの場合

Atlassian製品のOAuthについては[このページ](https://developer.atlassian.com/server/jira/platform/oauth/)通りに行います。
認証情報として必要になるのは、`config.properties`内の「secret」「jira_home」「consumer_key」「private_key」「access_token」です。
このチュートリアルにはJIRAのOAuthについて掲載されていますが、Confluenceでも同様の方法で認証することが出来ます。

以下、やる事だけを簡単にまとめました。

#### 3B-1. RSA鍵生成

```
openssl genrsa -out jira_privatekey.pem 1024
openssl req -newkey rsa:1024 -x509 -key jira_privatekey.pem -out jira_publickey.cer -days 365
openssl pkcs8 -topk8 -nocrypt -in jira_privatekey.pem -out jira_privatekey.pcks8
openssl x509 -pubkey -noout -in jira_publickey.cer  > jira_publickey.pem
```

#### 3B-2. OAuthTutorialClientの設定

```
hg clone https://bitbucket.org/atlassian_tutorial/atlassian-oauth-examples
cd atlassian-oauth-examples/java
mvn clean compile assembly:single
cd target
java -jar OAuthTutorialClient-1.0.jar requestToken
```

最後のコマンドではエラーが出ますが、`config.properties`を生成しているだけなので気にしなくて大丈夫です。
生成された`target`内の`config.properties`は次の様に設定します。

```
jira_home=http\://localhost\:8080
consumer_key=OauthKey
private_key=MIICdw...AQE\=
```

`jira_home`はJIRAのURL、
`consumer_key`はそのまま`OauthKey`、
`private_key`は`jira_privatekey.pcks8`の中身から改行を削除したもの
に設定します。
若干エスケープが必要な文字があるので注意してください。

#### 3B-3. JIRA/Confluence側の設定

アプリケーションリンクの設定(`/plugins/servlet/applinks/listApplicationLinks`)を開きます。
「リンクするアプリ〜」に適当なURL(例: `http://example.com/`)を入力して、新しいリンクを作成します。「入力したURLから応答がありません。」と言われますが続行します。

Link applicationsダイアログで必要事項を適当に入力して続行します。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/7f01821a-d506-2285-0ca5-0f42aed41da4.png)

必要事項を入力して続行します。
コンシューマーキーは`config.properties`と同じ`OauthKey`にします。
公開鍵は`jira_publickey.pem`の中身を貼り付けます。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/5ab2e827-62fe-923c-c7cf-ec0db55a197d.png)

#### 3B-4. OAuth Dance

```
java -jar OAuthTutorialClient-1.0.jar requestToken
```

これを実行すると次のように出力されます。

```
Token:			xe8yADzgduOc1GwbLcKUQbyAbKlPhVTv
Token secret:	lGk0heoiVWKgyEVM1R5ANTJVfKMkKuiS
Retrieve request token. Go to http://localhost:8080/plugins/servlet/oauth/authorize?oauth_token=xe8yADzgduOc1GwbLcKUQbyAbKlPhVTv to authorize it.
```

指定されたURLを開き、「許可」すると、確認コードが表示されます。
確認コードを利用してアクセストークンを取得します。

```
java -jar OAuthTutorialClient-1.0.jar accessToken cEzTBX
```

これでJIRA/Confluence側のOAuthの設定が完了します。

## 4. クローラの設定・実行

JIRA/Confluenceをクロールするための設定をします。
公式ドキュメントの[このページ](https://fess.codelibs.org/ja/12.2/admin/dataconfig-guide.html)も参考にしてください。

### 4-1. クローラの設定

Fessの管理画面を開き、`クローラ > データストア`と移動し、新規作成をします。
新規作成画面では、

* 名前
* ハンドラ
* パラメータ
* スクリプト

の4項目を設定して、作成を完了します。

「名前」には好きな文字列を入力してください。
「ハンドラ」はJiraDataStore(ConfluenceDataStore)を選択してください。
「パラメータ」は次のようなフォーマットで入力してください。

```
home=http://localhost:8080
oauth.consumer_key=OauthKey
oauth.private_key=MIICdw...QE=
oauth.secret=cEzTBX
oauth.access_token=W1jjOV...ye
```

キーと値の説明は次のようになります。

| キー | 値 |
|---|---|
| home | JIRA/ConfluenceのURL |
| oauth.consumer\_key | コンシューマーキー (OAuth) |
| oauth.private\_key | 秘密鍵 (OAuth) |
| oauth.secret | 認証キー (OAuth) |
| oauth.access\_token | アクセストークン (OAuth) |
| basicauth.username | ユーザ名 (Basic認証) |
| basicauth.password | パスワード (Basic認証) |
| issue.jql | [JQL](https://confluence.atlassian.com/jirasoftwarecloud/advanced-searching-764478330.html) (JIRAのみ) (任意) |

`oauth.*`については、`config.properties`の中身と対応しています。
また、この例ではOAuthを利用していますが、Basic認証またはOAuthのどちらかの認証情報が必要です。

「スクリプト」はJIRAとConfluenceで異なります。

#### JIRA

```
url=issue.view_url
title=issue.summary
content=issue.description + issue.comments
last_modified=issue.last_modified
```

取得出来る値のキーと値の説明は次のようになります。

| キー | 値 |
|---|---|
| issue.view\_url | issueを閲覧するURL |
| issue.summary | issueの要約 |
| issue.description | issueの説明 |
| issue.comments | issueのコメント |
| issue.last\_modified | issueの最終更新日時 |


#### Confluence

```
url=contentview_url
title=content.title
content=content.body + content.comments
last_modified=content.last_modified
```

| キー | 値 |
|---|---|
| content.view\_url | ページを閲覧するURL |
| content.title | ページのタイトル |
| content.body | ページの中身 |
| content.comments | ページのコメント |
| content.last\_modified | ページの最終更新日時 |


設定画面はこんな感じになります。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/e1081517-9481-0804-b567-5d7719032adf.png)


### 4-2. ジョブスケジューラの作成

4-1で作成したクロールをクリックすると、クロール設定が開き、そこから「新しいジョブの作成」をします。

後からでも変更はできるので、とりあえず試す場合はそのままの設定で大丈夫です。
詳しいジョブスケジューラの設定については、[このページ](https://fess.codelibs.org/ja/12.2/admin/scheduler-guide.html)を参考にしてください。

### 4-3. クローラの実行

`システム > スケジューラ`と移動し、4-2で作成したジョブを開きます。
その画面から、「今すぐ開始」をします。

状態が「実行中」から「有効」になるまで待ちます。

### 4-4. 検索のテスト

左上の検索フォームから適当に検索してみます。
![](https://qiita-image-store.s3.amazonaws.com/0/281037/2f6c2091-63a5-0e7e-63e6-d6baa75ef2f1.png)

これでFessでJIRA/Confluenceを横断検索することが出来るようになりました。