🔎

これでソースコード リーディングが捗る! OpenGrok の構築方法

2024/11/03に公開

Opengrok とは

OpenGrok は主にソースコードの検索ツールとして使用されています。OpenGrok はソースコード検索および相互参照エンジンで Java で書かれているオープンソースのプロジェクトです。

どんな感じか見てみたい方はこちらのページにあるアクセス可能な OpenGrok サイトがありますので、検索を試してみてください!

構築する前に...

今回は Docker を使用します!
下記はすでにインストールされているものとして進めていきます。

  • Docker
  • Docker Compose

構築方法(Docker)

基本的には公式の Github に記載がある内容をなぞって構築を行っていきます。
Docker image

早速立ててみましょう!

1. 準備

まずは docker-compose.yml を作成するので、mkdir opengrok などで今回の作業ディレクトリを作成してください。
作成した opengrok ディレクトリ配下に etc, src, data のディレクトリも作成しておきます。

docker-compose.yml を下記で作成します。

docker-compose.yml
version: "3"

# More info at https://github.com/oracle/opengrok/docker/
services:
  opengrok:                                ### サービス名
    container_name: opengrok               ### コンテナ名
    image: opengrok/docker:latest          ### Docker image の指定
    ports:
      - "8080:8080/tcp"                    ### 使用するポートと protocol の指定
    environment:
      SYNC_PERIOD_MINUTES: '60'            ### 定期的に同期を行う分数の指定
    # Volumes store your data between container upgrades
    ### コンテナとローカル環境のディレクトリの対応付け
    volumes:
       - '~/opengrok/src/:/opengrok/src/'    # source code 配置場所
       - '~/opengrok/etc/:/opengrok/etc/'    # configuration.xml の配置場所
       - '~/opengrok/data/:/opengrok/data/'  # index data

※ ~/opengrok/src/ は home ディレクトリ配下の opengrok/src を指定していますが、こちらはご使用されている環境にあわせて変更をしてください。

設定できる環境変数はこちらをご参照ください。

2. コンテナの立ち上げ

docker-compose.yml があるディレクトリで下記のコマンドを実行し、立ち上がったら http://localhost:8080/ にアクセスしましょう!

$ docker compose up -d
+] Running 23/1
 ✔ opengrok 22 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                                              93.7s 
[+] Running 1/2
 - Network opengrok_default  Created                                                                                                                                
   6.5s 
 ✔ Container opengrok        Started                                                                                                                                
   6.4s 

立ち上がっているかはコマンドでも確認できます。

$ docker compose ps
NAME       IMAGE                    COMMAND               SERVICE    CREATED          STATUS          PORTS
opengrok   opengrok/docker:latest   "/scripts/start.py"   opengrok   10 minutes ago   Up 10 minutes   0.0.0.0:8080->8080/tcp

下記の画面になれば起動は成功です。
OpenGrok

3. コンテナの停止/削除

コンテナをすべて削除し、volume も削除する場合には下記を実行してください。

 docker compose down --rmi all -v

ソースコードを配置する

立ち上げだけを確認しましたが、実際にこれでは検索がどんなものかはわからないですね。
今度はコードを事前に src ディレクトリに配置して検索できるようになるか確認してみましょう!

今回は OpenGrok 自体のコードを取ってきましょう。
Note: 動くかの確認であれば、検索できるコードとかならなんでもいいので適当なプログラムのディレクトリを設置するでも問題はないです。

releases のページにアクセスしてどれかのリリースの Assets からコードをダウンロードします。
今回は .zip ファイルをクリックし、ダウンロードしました。
ダウンロードしたファイルは作成済みの opengrok/src ディレクトリ配下に配置し、展開します。

Index

展開後に docker compose コマンドで OpenGrok を立ち上げて、しばらく待つと index data が作成されてソースコードにアクセスできるようになります。(時間が結構かかる場合もあるので起動したら coffee break でもしてください。)

数分待って opengrok/data ディレクトリ配下に index などのファイルができていれば処理は進んでいると思います。

下記のように表示されていれば、OK です。
Sync
Note: 警告マークは Sync 中になりますが、検索はできます。

では、Full Search 項目で OpenGrok と検索をしてみましょう!
検索結果がいっぱい出てこれば、OK です。
Full Search

これで動作していることがわかったので後は思うままにコードを配置/検索/閲覧を繰り返すだけです!
良いコードリーディング ライフを!!!

ちなみに検索の help は help ボタンをクリックすることで確認できますので、ご確認ください。

help
Examples:

To find where setResourceMonitors is defined:

    defs:setResourceMonitors

To find files that use sprintf in usr/src/cmd/cmd-inet/usr.sbin/:
refs:sprintf path:usr/src/cmd/cmd-inet/usr.sbin

To find assignments to variable foo:
"foo ="

    To find Makefiles where the pstack binary is being built:
pstack path:Makefile

to search for phrase "Bill Joy":
"Bill Joy"

To find perl files that do not use /usr/bin/perl but something else:
-"/usr/bin/perl" +"/bin/perl"

To find all strings beginning with foo use the wildcard:
foo*

To find all files which have . c in their name (dot is a token!):
". c"

To find all files which start with "ma" and then have only alphabet characters do:

    path:/ma[a-zA-Z]*/

To find all main methods in all files analyzed by C analyzer (so .c, .h, ...) do:
main type:c

おわりに

OpenGrok の構築はいかがでしたでしょうか。
Docker を利用すれば、簡単に構築ができたと思います。別途 OpenGrok を構築する用のリソースがあり、たくさんのコードを配置したい場合には source code から build して OpenGrok を構築してみましょう!

Code Path Tracker

OpenGrok でコードリーディングをする際にはタブがたくさん開いてしまうことやどこの関数をさっきまで追っていたのかがわからなくなったりすることがあります。
そんなときに履歴が確認できれば、もっとコードを読む作業が効率化できると思い、Google Chrome の拡張機能を作成してみました!
下記の記事で紹介しているのでぜひ、使ってみてください。

https://zenn.dev/apo_space81/articles/e1a9202bc2f93a

Discussion