OpenGrok 테스트
Web에서 소스 코드를 브라우징할 수 있는 OpenGrok을 설치 및 테스트해 보았다.
Android AOSP 소스의 경우 매우 방대한데, 로컬 환경에서 에디터로 소스 브라우징을 하는 방법 이외에, Web 상에서 소스 코드를 브라우징할 수 있는 방법이 필요해서 찾아보니 OpenGrok 이라는 툴이 있어서 설치한 후에 AOSP 소스와 몇몇 프로젝트의 소스로 테스트해 보았다.
참고로 AOSP 소스의 경우에는 Android Code Search 웹 페이지에서 소스 코드를 검색하고 볼 수 있는 기능은 지원하지만 (outline 기능도 지원), 심볼 브라우징 등의 기능은 지원하지 않고 있다.
OpenGrok 소개
OpenGrok은 Web 상에서 소스 코드를 검색 및 브라우징할 수 있는 툴로, Java로 구현되었다.
특히 C/C++, Java, JavaScript, Python 등 다양한 언어를 지원하고 신택스 하이라이팅도 지원한다.
💡 OpenGrok 자체는 Java servlet 웹 애플리케이션으로, Apache Tomcat과 같은 Java servlet container 환경에서 실행된다. (참고로 Apache Tomcat은 Java servlet container 역할을 하면서 HTTP 서버 역할도 함)
Tomcat 설치
Java servlet 컨테이너가 설치되어 있지 않으면 설치해야 하는데, 여기서는 예로 Apache Tomcat을 아래와 같이 ~/tomcat/ 경로에 설치하였다.
$ wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.34/bin/apache-tomcat-10.1.34.tar.gz
$ tar xfz apache-tomcat-10.1.34.tar.gz
$ mv apache-tomcat-10.1.34/ ~/tomcat
Tomcat 실행
아래와 같이 Tomcat을 실행시킬 수 있다.
$ ~/tomcat/bin/startup.sh
참고로 아래와 같이 실행 중인 Tomcat의 버전 정보를 확인할 수 있다.
$ ~/tomcat/bin/version.sh
Tomcat은 디폴트로 8080 포트를 사용한다. 아래 예와 같이 Tomcat이 사용하는 포트가 정상적으로 열려 있는지 확인할 수 있다.
$ netstat -ano | grep 8080
$ ss -ltn | grep 8080
Tomcat이 정상적으로 실행되었으면, 웹브라우저에서 http://localhost:8080 주소로 접속할 수 있다.
사용하려는 포트를 다른 값으로 변경하고 싶으면 ~/tomcat/conf/server.xml 파일에서 아래 “8080” 값을 원하는 포트로 수정하면 된다.
<Connector port="8080" protocol="HTTP/1.1"
Tomcat은 WAR
(Web Application Archive) 파일 형식으로 패키징된 Java 웹 애플리케이션을 배포할 수 있는 WAS(Web Application Server) 역할을 한다. Tomcat의 webapps 디렉터리에 실행하려는 웹 애플리케이션의 WAR 파일을 복사해 놓으면 자동으로 해당 애플리케이션을 로드하고 실행한다.
이제 OpenGrok 웹 애플리케이션을 설치해 보자.
OpenGrok 설치
아래 예와 같이 OpenGrok을 설치한다.
$ wget https://github.com/oracle/opengrok/releases/download/1.13.25/opengrok-1.13.25.tar.gz
$ mkdir -p ~/opengrok/{src,data,dist,etc,log}
$ tar -C ~/opengrok/dist/ --strip-components=1 -xfz opengrok-1.13.25.tar.gz
$ cp ~/opengrok/dist/doc/logging.properties ~/opengrok/etc/
아래와 같이 OpenGrok 관리 툴을 설치한다. (파이썬 툴임)
$ cd ~/opengrok/dist/tools/
$ python3 -m venv env
$ source ./env/bin/activate
(env) $ python3 -m pip install opengrok-tools.tar.gz
이제 아래와 같이 Tomcat에 OpenGrok을 배포시킬 수 있다.
(env) $ opengrok-deploy -c ~/opengrok/etc/configuration.xml ~/opengrok/dist/lib/source.war ~/tomcat/webapps/
인덱싱할 소스 구성
~/opengrok/src/ 경로에 indexing 할 소스의 심볼릭 링크나 소스를 추가한다.
이후 아래 예와 같이 실행하면 indexing이 구성된다. (아래는 포트를 디폴트 8080으로 사용한 경우임)
$ java \
-Djava.util.logging.config.file=~/opengrok/etc/logging.properties \
-jar ~/opengrok/dist/lib/opengrok.jar \
-s ~/opengrok/src/ -d ~/opengrok/data/ -H -P -S -G \
-W ~/opengrok/etc/configuration.xml \
-U http://localhost:8080/source
만약에 인덱싱할 소스가 변경되거나, 새로운 프로젝트가 추가되면 다시 위 내용을 동일하게 실행하면 된다.
나는 편의상 위 내용으로 스크립트를 만들어 둔 후, 이 스크립트를 실행시키고 있다.
그런데 AOSP 소스와 같이 방대한 소스 코드는 OpenGrok에서 제대로 검색이나 브라우징이 되지 않았다. 이런 경우에는 프로젝트 소스에서 꼭 필요한 경로들만 ~/opengrok/src/ 경로에 복사해서 구성하면 된다.
참고로 indexing 데이터는 ~/opengrok/data/ 경로에 있다. 필요 없어진 프로젝트의 소스는 수동으로 삭제할 수 있다.
OpenGrok 페이지 접속
Indexing 작업이 완료되었으면 이제 웹브라우저에서 http://localhost:8080/source 주소에 접속하면 (물론 디폴트 포트를 다른 값으로 변경하였으면 변경한 포트 번호를 사용해야 함), 아래 캡쳐 예와 같이 OpenGrok 페이지가 표시된다.
먼저 Project(s) 탭에서 원하는 프로젝트를 선택하면 해당 프로젝트의 파일 및 함수를 검색할 수 있다.
이후 파일이나 함수 이름 등으로 소스 코드를 찾아서 열 수 있고, 소스 코드에서도 심볼로 브라우징이나 네비게이션이 잘 되고, Git history 등과 같은 부가 기능도 사용할 수 있다.
🛠️ 그런데 소스 코드 렌더링시 monospace 폰트가 사용되어서 보기가 좋지 않은 편인데, OpenGrok 자체적으로는 폰트를 설정할 수 있는 기능을 제공하지 않고 있다.
대안 방법으로 브라우저에서 Force Custom Fonts 등과 같은 확장 프로그램을 사용하여 해당 사이트에서만 원하는 폰트로 출력하도록 설정하면 된다.
또, H/W tab은 space 8개로 렌더링 되었는데, 역시 OpenGrok에서는 이것 관련한 설정을 찾지 못하였다. 따라서 S/W tab만 사용한 소스에서는 algin이 맞게 표시되지만, H/W tab을 space 8이 아닌 값으로 사용한 소스에서는 align이 맞지 않게 표시되는 문제가 있다.
대안 방법으로 브라우저에서 TabSize tab-width extension 등과 같은 확장 프로그램을 사용하여 tab 너비를 원하는 값으로 지정하면 된다.
Tomcat 중지
Tomcat을 중지시키려면 아래와 같이 실행시키면 된다.
$ ~/tomcat/bin/shutdown.sh