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

## まえおき

[Androidソースコード検索](https://sites.google.com/site/devcollaboration/codesearch)とかで使われている[OpenGrok](https://opengrok.github.io/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のフォーマット？、なんとなく勘でそれっぽくわかるでしょう。（乱暴ｗ
わからなかったら、[私が適当に使ってるやつ](https://gist.github.com/d7b049db19fb0286d0ace905a608d562.git)を見たり、「repo init default.xml」 とかで[ググってみましょう](http://lmgtfy.com/?q=repo+init+default.xml)

## Step2: コンテナをつくる

![image](https://qiita-image-store.s3.amazonaws.com/0/74571/ae7fbfdf-3c4b-1f28-a4e3-3561544a7da0.png)

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](https://cloud.githubusercontent.com/assets/11763113/22462899/a0c3e020-e7f2-11e6-885d-487d66f4609d.png)

### おまけ: 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使うのに必要らしい](http://qiita.com/takiuchi/items/2dc1408224fd85c268c6)

 
### おまけ２： 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を用意して２，３コマンド叩くだけで即席でソース検索エンジンが作れるので、そこそこ便利だと思います。
　

[Dockerfile](https://github.com/YusukeIwaki/docker-opengrok-repo/blob/master/Dockerfile) は見る人が見たら相当イケてないと思いますので、Pull Requestなどありましたらお待ちしてます！ｗ