2
6

More than 5 years have passed since last update.

OpenGrok+Dockerで、使い捨てソース検索エンジンをつくる

Last updated at Posted at 2017-02-01

まえおき

Androidソースコード検索とかで使われているOpenGrok、大規模なソースを対象に検索をしたいときは便利ですよね。

ただ、
「Rspecのsubjectってどんな実装してるのかなー」とか
「Rocket.Chatのファイルアップロードってどこでどんな仕組みで動いてるのかなー」とか
ぱっと探したいものがあるときに、

  • Gitリポジトリを追加する
  • インデックスを追加する

ってやるわけですが、
その際に、既存で持ってたAndroid関連のリポジトリまでインデックス更新がかかったりして、時間もかかるし結構無駄なんですよね・・・。
とはいえ、新規にOpenGrokを建てるのも意外と手間です。

ということで、Dockerで使い捨てできるようにしよう、とおもい、それっぽいものを作ってみました。
Dockerさえ入っていれば、3ステップでできます!

Step0: とりあえずDocker pull

docker pull yusukeiwaki/opengrok-repo

これは最初に1回やればOK

Step1: 取得したいソースコードのリポジトリ一覧をつくる

ここがポイントです。 yusukeiwaki/opengrok-repo はソースの同期にrepoを使っているので、

たとえばRspecだったら

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote name="github" fetch="https://github.com/" />
  <default revision="master" remote="github" />

  <project name="rails/rails.git" path="rails" />  
  <project name="rspec/rspec-core.git" path="rspec-core" />  
  <project name="rspec/rspec-expectations.git" path="rspec-expectations" />  
  <project name="rspec/rspec-support.git" path="rspec-support" />  
  <project name="rspec/rspec-mocks.git" path="rspec-mocks" />  

</manifest>

RocketChatだったら

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote name="github" fetch="https://github.com/" />
  <default revision="master" remote="github" />

  <project name="meteor/meteor.git" path="meteor" revision="devel" />
  <project name="RocketChat/Rocket.Chat.git" path="Rocket.Chat" revision="develop" />
  <project name="RocketChat/Rocket.Chat.Android.git" path="Rocket.Chat.Android" revision="develop" />
  <project name="RocketChat/Rocket.Chat.iOS.git" path="Rocket.Chat.iOS" revision="develop" />

</manifest>

みたいな感じで、検索対象にしたいソースのリポジトリ一覧を作ります。
gistで作って、ファイル名は default.xmlにしましょう。

XMLのフォーマット?、なんとなく勘でそれっぽくわかるでしょう。(乱暴w
わからなかったら、私が適当に使ってるやつを見たり、「repo init default.xml」 とかでググってみましょう

Step2: コンテナをつくる

image

GistのhttpsのURLをコピって

docker run -d -it -p 8080:8080 --env REPO_INIT_URL=https://gist.github.com/d7b049db19fb0286d0ace905a608d562.git yusukeiwaki/opengrok-repo

を実行して、仮想マシン(コンテナ)を作ります。
#たぶん数秒でできるはず。

Step3: ソースを同期&インデックス作成

docker exec -it コンテナID /bin/bash

# update_repo

で放置しましょう。
しばらくしたら、 http://<あなたのホスト>:8080/source/ にソース検索ができる状態になったOpenGrokが出来上がっているはずです。

image

おまけ: GNU screenを使いたいときは・・・

update_repo は結構時間がかかります。なので GNU screenあたりを使いたいなーとおもったら、

# apt-get install -y screen
# exec >/dev/tty 2>/dev/tty </dev/tty
# screen update_repo

でやれば、コンテナ抜けて完全放置できます。
※ execなんちゃらは、Dockerでscreen使うのに必要らしい

おまけ2: Androidのソースコード検索もたぶん作れる?

docker run -d -it -p 8080:8080 --env REPO_INIT_URL="https://android.googlesource.com/platform/manifest -b android-7.1.1_r13" yusukeiwaki/opengrok-repo

みたいなコマンドを打てば、Androidのソースコード検索をさらっと作ることもたぶんできる・・・はず・・・(未検証
 

 

まとめ

とりあえず repo をうまくつかって、インフラ as a codeならぬ「検索エンジン as a code」っぽいことをやってみました。
default.xmlを用意して2,3コマンド叩くだけで即席でソース検索エンジンが作れるので、そこそこ便利だと思います。
 

Dockerfile は見る人が見たら相当イケてないと思いますので、Pull Requestなどありましたらお待ちしてます!w

2
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
6