検索

OpenGrokをインストールしてソースリーディング環境を作る

投稿日:2019年7月26日

職場でもプライベートでも「あのフレームワークのあの処理はどういうコードになってるのか」気になってソースを落としてくることがあるかと思います。

職場や自宅ならIDEにソースを入れてビルドしてソースを追える環境を作れますが、そこに行き着くまでに結構時間が掛かったりしますし、そもそも外出中、通勤中にふと気になってスマホでソースを追いたくなった時はgithubを眺めるくらいしか手がありません。

こんな時、ブラウザ上でもタグジャンプが使えるOpenGrok環境を作っておくと効率的にソースを追うことが出来て非常に便利です。

OpenGrokとは

OpenGrokにソース登録すると静的解析&インデックス化され、ブラウザでクラス名などをクリックすることで簡単にソースを追えるようになります。


OpenGrok is a fast and usable source code search and cross reference engine, written in Java. It helps you search, cross-reference and navigate your source tree. It can understand various program file formats and version control histories of many source code management systems.

OpenGrokはJavaで書かれた速く、使いやすいソースコード検索、クロスリファレンスエンジンです。検索、相互参照、あなたのソースをナビゲートするのを助けます。OpenGrokは様々なプログラムフォーマット、多くのSCMシステムのバージョン履歴をを把握することが出来ます。

https://github.com/oracle/opengrok

インストール前作業

公式手順にもあるように前提としてAPサーバとuniversal-ctagsを入れておく必要があります。

https://github.com/oracle/opengrok/wiki/How-to-setup-OpenGrok

Tomcatとそれを動かす為のJava8以上のJDKを予め入れておきます。

プログラムを解析する為のuniversal-ctags。
yumでは入れられないのでgithubからソースを落としてコンパイル、インストールします。

後、バージョン1.17あたりからインデックスを作る為のコマンドが「opengrok-tools.tar.gz」としてスピンアウトし、Pythonプログラムとして別途提供されるようになりました。

python3前提だったり、入れなくてもjar実行すればインデックス出来るので今回はインストールしません。公式でも任意インストールとなっています。

インストール手順

前述の前提作業が整ったらOpenGrok本体をインストールしていきます。

OpenGrokをダウンロード

公式リリースバイナリの最新版を調べ、wgetなりでダウンロードしてきます。

https://github.com/oracle/opengrok/releases

今回は2019/07/19にリリースされたばかりの1.2.24を使用。

[root@spock tmp]# wget https://github.com/oracle/opengrok/releases/download/1.2.24/opengrok-1.2.24.tar.gz
--2019-07-20 23:23:11--  https://github.com/oracle/opengrok/releases/download/1.2.24/opengrok-1.2.24.tar.gz
github.com (github.com) をDNSに問いあわせています... 52.192.72.89
github.com (github.com)|52.192.72.89|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: https://github-production-release-asset-2e65be.s3.amazonaws.com/7481569/3fae0780-aa31-11e9-8e2b-fcbf19143c85?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190720%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190720T142311Z&X-Amz-Expires=300&X-Amz-Signature=4e3244de454c3dba1e186282d8c69ee3991da3f566dc99cc5f5be37cfd8889a8&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dopengrok-1.2.24.tar.gz&response-content-type=application%2Foctet-stream [続く]
--2019-07-20 23:23:11--  https://github-production-release-asset-2e65be.s3.amazonaws.com/7481569/3fae0780-aa31-11e9-8e2b-fcbf19143c85?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20190720%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20190720T142311Z&X-Amz-Expires=300&X-Amz-Signature=4e3244de454c3dba1e186282d8c69ee3991da3f566dc99cc5f5be37cfd8889a8&X-Amz-SignedHeaders=host&actor_id=0&response-content-disposition=attachment%3B%20filename%3Dopengrok-1.2.24.tar.gz&response-content-type=application%2Foctet-stream
github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com) をDNSに問いあわせています... 52.216.114.147
github-production-release-asset-2e65be.s3.amazonaws.com (github-production-release-asset-2e65be.s3.amazonaws.com)|52.216.114.147|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 45840066 (44M) [application/octet-stream]
`opengrok-1.2.24.tar.gz' に保存中

100%[==================================================================================================>] 45,840,066  7.63MB/s 時間 19s

2019-07-20 23:23:31 (2.27 MB/s) - `opengrok-1.2.24.tar.gz' へ保存完了 [45840066/45840066]

OpenGrokのデータディレクトリを作成

TomcatにデプロイされたOpenGrokがアクセスするOpenGrokディレクトリを作っておきます。このディレクトリには検索する為のソースを置いたり、自動生成される設定ファイルXMLがOpenGrokに置かれます。

OpenGrokはTomcat上で動いており、Tomcatプロセス起動ユーザ権限でアクセスしてきます。この為ディレクトリ作成後に所有者をtomcatユーザに しておきます。

mkdir -p /var/opengrok/{src,data,etc}
chown -R tomcat:tomcat /var/opengrok/

解凍し、source.warをTomcatにデプロイ

公式手順通り/opengrokに解凍。内容物のsource.warをTomcatにデプロイ。

[root@spock tmp]# mkdir -p /opengrok/dist &&  tar -C /opengrok/dist --strip-components=1 -xzf opengrok-1.2.24.tar.gz
[root@spock tmp]# cp /opengrok/dist/lib/source.war /opt/apache-tomcat-9.0.22/webapps/

この時点ではOpenGrokの設定ファイルが/var/opengrok/etcに生成されていない為、ブラウザで

http://OpenGrokを入れたPCのIP:8080/source

にアクセスしてもエラーが発生します。

インデックス化するソースを用意

/var/opengrok/srcにソースを入れておきます。
取りあえず題材としてspring-frameworkをgithubからgit clone。

[root@spock src]# git clone https://github.com/spring-projects/spring-framework.git
Cloning into 'spring-framework'...
remote: Enumerating objects: 176, done.
remote: Counting objects: 100% (176/176), done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 527891 (delta 42), reused 135 (delta 27), pack-reused 527715
Receiving objects: 100% (527891/527891), 133.76 MiB | 21.28 MiB/s, done.
Resolving deltas: 100% (264347/264347), done.

インデックス作成

opengrok.jarを実行することで/var/opengrok/src内のソースをインデックス化。このタイミングで/var/opengrok/etcに設定ファイルが自動生成されます。

前提でインストールしたuniversal-ctagsへのパスは-cで指定。

java -Djava.util.logging.config.file=/var/opengrok/logging.properties \
     -jar /opengrok/dist/lib/opengrok.jar \
     -c /usr/local/bin/ctags \
     -s /var/opengrok/src -d /var/opengrok/data -H -P -S -G \
     -W /var/opengrok/etc/configuration.xml -U http://localhost:8080/source 

後はこの内容を/usr/local/bin/opengrok-reindexer.shとでもし、chmoe 755 して実行出来るようにしておけば、いつでもソース追加して再インデックス出来るようになります。

動作確認

http://OpenGrokを入れたPCのIP:8080/source

にブラウザからアクセスして以下の画面が出れば完了です。

インデックス化するソースを増やす時はspring-frameworkをgit cloneした時と同じ操作をすればOKです。普段使っているOSSのソースを登録してインデックスしておきましょう。

後はこのアドレスをApacheやNginxのリバースプロキシ機能でインターネットに出せば満員電車の中でもスマホでソースを追うことが出来ますね!

・・・満員電車、本当になくなってくれませんかね。

-検索
-,

執筆者:

関連記事

universal-ctagsをソースからコンパイルしてCentOS7にインストール

ctagsはプログラムソースを読みこませてクラス名、メソッド名、変数名他各種識別子をインデックスしたtagsファイルを作成するプログラムツールです。 tagsファイルをvimやemacsなどの外部プロ …

無料で自由に使える日本全国の企業データベースをPostgreSQLで作る

開発するシステムよっては一覧から企業を選択する機能があるかも知れません。「企業データベース」でググると沢山の商用企業データベースが出てきます。 「でも・・・お高いんでしょう?」 はい。下手をすると家が …

テキストファイル内の改行コード差異を見つけるワンライナー

ファイル内容は同じなのにdiffで違いが出るWeb上でソースレビューする時に同じ内容の行なのに差分が出て紛らわしい これらの原因はWindows、Mac、Linuxが入り混じった開発環境にあるかも知れ …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯現役技術者を目指しています。健康第一。