[Mac] 安裝 OpenGrok server
最近有個任務是要架設一個 OpenGrok server~
OpenGrok 是一個 web server,
架起來之後可以讓你很方便的瀏覽 source code,很方便做 peer review 或是查 code 用~
專案的目標是要架在一台 Linux 上面,不過我就先拿自己的 Mac 試一下吧~
先用 brew search grok 看看有沒有別人已經寫好的安裝 script….
有找到 grok 和 ngrok,
但其實這兩個都不是 OpenGrok…
真是殘念 =_= 看來只得自己裝了~
1. 下載 OpenGrok binary
我下載的是 Binary distribution opengrok-0.12.1.tar.gz,
抓下來之後,決定一下 OpenGrok 要放在哪裡,
在那個目錄把這個套件解開吧:
tar zxvf opengrok-0.12.1.tar.gz
解開後的目錄下,有個 bin/OpenGrok 檔案,
有點好奇為什麼 binary distribution 不用分平台,
用 file 查了一下,原來是一個 shell script 檔案,
直接執行 ./OpenGrok 就可以看到一些用法~
試著執行一下 ./OpenGrok deploy 的話,可能會看到下面的錯誤訊息,
因為我們有些東西還沒有裝或設定好:
Loading the default instance configuration ... ERROR: Unable to determine Exuberant CTags command name for Darwin 13.3.0 FATAL ERROR: Unable to determine Deployment Directory for Tomcat - Aborting!
2. 安裝 Tomcat web server
要有一個 web server 可以跑 OpenGrok,網頁上是說可以用 Tomcat 或 GlassFish…
瞄了一下 OpenGrok 這個 script 裡面寫的,
似乎偏好是 Tomcat,那就不要找自己麻煩,裝 Tomcat 吧~
用 brew 就可以安裝了~
brew install tomcat
用 brew 裝的 Tomcat 會裝在比較怪的一個地方,
像我的是裝在 /usr/local/Cellar/tomcat/8.0.9/libexec/ …
要怎麼找到這個路徑呢?
用 brew list tomcat 就可以找到線索,有含 webapps 的那個就是囉:
test@localhost ~/opengrok-0.12.1/bin $ brew list tomcat /usr/local/Cellar/tomcat/8.0.9/bin/catalina /usr/local/Cellar/tomcat/8.0.9/libexec/bin/ (15 files) /usr/local/Cellar/tomcat/8.0.9/libexec/conf/ (7 files) /usr/local/Cellar/tomcat/8.0.9/libexec/lib/ (25 files) /usr/local/Cellar/tomcat/8.0.9/libexec/temp/safeToDelete.tmp /usr/local/Cellar/tomcat/8.0.9/libexec/webapps/ (578 files) /usr/local/Cellar/tomcat/8.0.9/RELEASE-NOTES /usr/local/Cellar/tomcat/8.0.9/RUNNING.txt
將這個路徑 (不含 webapps) 設定在環境變數 OPENGROK_TOMCAT_BASE 中,
再跑一次 ./OpenGrok deploy 看看:
test@localhost ~/opengrok-0.12.1/bin $ OPENGROK_TOMCAT_BASE=/usr/local/Cellar/tomcat/8.0.9/libexec ./OpenGrok deploy Loading the default instance configuration ... ERROR: Unable to determine Exuberant CTags command name for Darwin 13.3.0 Installing /Users/jeff_lai/Software/Engineering/opengrok-0.12.1/bin/../lib/source.war to /usr/local/Cellar/tomcat/8.0.9/libexec/webapps ... Start your application server (Tomcat), if it is not already running, or wait until it loads the just installed web application. OpenGrok should be available on <HOST>:<PORT>/source where HOST and PORT are configured in Tomcat.
可以看到它把 source.war 裝到 Tomcat 的 webapps 目錄下去了,
不過還是有 CTags 找不到的訊息,接下來就來裝 CTags~
3. 安裝 Exuberant CTags
也是用 brew 就可以裝起來(我真懶 :P)…
brew install ctags
再試一次 ./OpenGrok deploy 看看會怎麼樣:
test@localhost ~/opengrok-0.12.1/bin $ OPENGROK_TOMCAT_BASE=/usr/local/Cellar/tomcat/8.0.9/libexec ./OpenGrok deploy Loading the default instance configuration ... Installing /Users/jeff_lai/Software/Engineering/opengrok-0.12.1/bin/../lib/source.war to /usr/local/Cellar/tomcat/8.0.9/libexec/webapps ... Start your application server (Tomcat), if it is not already running, or wait until it loads the just installed web application. OpenGrok should be available on <HOST>:<PORT>/source where HOST and PORT are configured in Tomcat.
CTags 的錯誤訊息也消失囉~
只差把 Tomcat web server 叫起來了~
4. 啟動 Tomcat web server
執行 catalina run 試試把 Tomcat 叫起來~
(我對 Tomcat 不熟,不曉得是不是自己手動裝的也會有個 catalina)
不幸地出現 exception 了…
test@localhost ~/opengrok-0.12.1/bin $ catalina run Using CATALINA_BASE: /usr/local/Cellar/tomcat/8.0.9/libexec Using CATALINA_HOME: /usr/local/Cellar/tomcat/8.0.9/libexec Using CATALINA_TMPDIR: /usr/local/Cellar/tomcat/8.0.9/libexec/temp Using JRE_HOME: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home Using CLASSPATH: /usr/local/Cellar/tomcat/8.0.9/libexec/bin/bootstrap.jar:/usr/local/Cellar/tomcat/8.0.9/libexec/bin/tomcat-juli.jar Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/catalina/startup/Bootstrap : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637) at java.lang.ClassLoader.defineClass(ClassLoader.java:621) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
嗯… 對 Java 我也不熟…
上網查了一下,似乎是這 Java 程式是用比較新的 JDK 版本編譯,
而現在在比較舊的 JRE 環境中執行…
執行 java -version 可以看到現在的版本是 1.6.0_65…
到 Oracle 的網頁下載最新的 JDK 吧,
我下載的是 JDK 8u20 for Mac: http://download.oracle.com/otn-pub/java/jdk/8u20-b26/jdk-8u20-macosx-x64.dmg
裝好之後再執行 java -version,可以看到版本已經變成 1.8.0_20 了,
執行 java_home -V 還可以秀出更多相關資訊,
例如下面可以看到我新安裝的 JDK 1.8 和系統原有的 JDK 1.6,目前預設使用的是 1.8 的:
test@localhost~ $ /usr/libexec/java_home -V Matching Java Virtual Machines (3): 1.8.0_20, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home 1.6.0_65-b14-462, x86_64: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home 1.6.0_65-b14-462, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home
既然 Java 已經升級到最新版了,再來啟動一次 Tomcat 試試吧,
這次總算沒有錯誤訊息了 🙂
test@localhost~ $ catalina start Using CATALINA_BASE: /usr/local/Cellar/tomcat/8.0.9/libexec Using CATALINA_HOME: /usr/local/Cellar/tomcat/8.0.9/libexec Using CATALINA_TMPDIR: /usr/local/Cellar/tomcat/8.0.9/libexec/temp Using JRE_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home Using CLASSPATH: /usr/local/Cellar/tomcat/8.0.9/libexec/bin/bootstrap.jar:/usr/local/Cellar/tomcat/8.0.9/libexec/bin/tomcat-juli.jar Tomcat started.
5. 使用瀏覽器前往剛架設好的 Tomcat web server
因為我是在本機執行 Tomcat 的,因此試著瀏覽 http://localhost:8080/source 吧,
可以看到 OpenGrok 的搜尋畫面了(興奮!!^^),
但是直接按下 Search 鈕時出現了下面的錯誤:
這個錯誤訊息是因為我們還沒有讓 OpenGrok 去收集任何原始碼的資訊…
執行 ./OpenGrok index <src folder> 就可以讓 OpenGrok 建立索引囉,
在下面的例子我讓 OpenGrok 去建立 ~/src 目錄下面的原始碼索引~
因為 OpenGrok 預設會將資料儲存到 /var/opengrok/data,
因此要用 sudo 才有足夠的權限執行::
test@localhost ~/opengrok-0.12.1/bin $ sudo OPENGROK_TOMCAT_BASE=/usr/local/Cellar/tomcat/8.0.9/libexec ./OpenGrok index ~/src/ Loading the default instance configuration ... 01:11:23 WARNING: Non-zero exit status 1 from command [/usr/local/bin/p4, dirs, *] in directory /Users/test/src: Perforce password (P4PASSWD) invalid or unset. 01:11:23 WARNING: Non-zero exit status 1 from command [/usr/local/bin/p4, files, *] in directory /Users/test/src: Perforce password (P4PASSWD) invalid or unset.
在上面的訊息中,可以看到有一些 WARNING 警告訊息,
但這好像是因為我們是使用 Perforce (p4),然後 OpenGrok 因為沒辦法執行 p4,
出現了一些錯誤訊息,但這影響的是沒辦法拿到 Perforce 上的 history,
索引還是可以成功的建立…
只是如果目錄檔案很多的話,要建立蠻久的… 耐心等一下吧~
等索引建立好之後,回到剛才的網頁畫面,就可以再輸入搜尋字串了~
像下面是搜尋原始碼中有哪些地方用到了 sys.argv 這個字串,
結果很快就出來囉~
雖然安裝 OpenGrok 一波三折,不過裝好之後真的是蠻方便的,
索引那邊也可以用 cron job 定時重建索引,就可以看到最新的 code 了~^^