まえおき
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: コンテナをつくる
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が出来上がっているはずです。
おまけ: 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