在Ubuntu 16.04/18.04/20.04 LTS上安装OpenGrok-1.3.11/1.3.16/1.5.12/1.7.25浏览Android源码

更加推荐通过 Podman/Docker 方式进行部署,参考链接 Ubuntu 22.04使用Podman部署OpenGrok的详细教程

OpenGrok 是一个快速,便于使用的源码搜索引擎与对照引擎,它能够帮助我们快速的搜索、定位、对照代码树。接下来就具体讲解 `Ubuntu 16.04/18.04/20.04 LTS` 环境下 `OpenGrok` 的安装及使用。

`OpenGrok 1.3.11/1.3.16` 依赖 `Java 1.8` , `Tomcat 8`

`OpenGrok 1.5.12` 依赖 `Java 11` , `Tomcat 9` 。

从 `OpenGrok 1.6.0`开始依赖 `Java 11` , `Tomcat 10` 。

1.依旧参照 UBUNTU 13.10 APACHE 2.2 通过 AJP 整合 TOMCAT 7 中讲述的方法,进行 `Tomcat 8/9`,  `Apache 2.4`的配置安装,只不过路径中的 `Tomcat7` 目录替换成 `Tomcat8` (ubuntu 20.04 默认 `Tomcat9`)。

2.安装 `Tomcat 8` (ubuntu 18.04)

$ sudo apt-get install tomcat8

# 一般卸载 tomcat7
$ sudo apt-get remove --purge tomcat7*

# 调整内存,默认的128MB 默认配置运行会导致OOM
$ sudo touch /usr/share/tomcat8/bin/setenv.sh

$ echo 'export JAVA_OPTS="-Xms512M -Xmx1024M"' | sudo tee -a /usr/share/tomcat8/bin/setenv.sh

安装 `Tomcat 9` (ubuntu 20.04)

# 一般卸载 tomcat7/8
$ sudo apt-get remove --purge tomcat7*

$ sudo apt-get remove --purge tomcat8*

$ sudo apt-get install tomcat9

# 调整内存,默认的128MB 默认配置运行会导致OOM
# sudo touch /usr/share/tomcat9/bin/setenv.sh

$ echo 'export JAVA_OPTS="-Xms512M -Xmx1024M"' | sudo tee -a /usr/share/tomcat9/bin/setenv.sh

3.安装 `universal-ctags` 用于对 `C\C++` 代码的支持

给代码建立索引时,要使用到universal-ctags工具,但是一般通过apt-get安装的都是exuberant-ctags,所以要先删除原有的ctags版本,然后安装universal-ctags.

$ sudo apt-get purge ctags

$ sudo apt-get install git

$ sudo apt-get install autoconf

$ sudo apt-get install pkg-config

$ cd ~

$ git clone --depth=1 https://github.com/universal-ctags/ctags.git

$ cd ctags

$ ./autogen.sh 

$ ./configure

$ make

$ sudo make install

$ cd ..

$ rm -rf ctags

4.下载并安装OpenGrok

可以到"https://oracle.github.io/opengrok/"手工下载文件,然后上传到服务器,也可以直接用wget命令来下载,一般选择安装在"/opt"目录下面。

$ sudo apt-get install aria2

$ cd /opt

$ sudo aria2c -c "https://github.com/oracle/opengrok/releases/download/1.3.11/opengrok-1.3.11.tar.gz"

# sudo aria2c -c "https://github.com/oracle/opengrok/releases/download/1.3.16/opengrok-1.3.16.tar.gz"

# sudo aria2c -c "https://github.com/oracle/opengrok/releases/download/1.5.12/opengrok-1.5.12.tar.gz"

# sudo aria2c -c "https://github.com/oracle/opengrok/releases/download/1.7.25/opengrok-1.7.25.tar.gz"

解压缩文件到当前目录"/opt"

$ sudo tar xvf opengrok-1.3.11.tar.gz

# sudo tar xvf opengrok-1.3.16.tar.gz

# sudo tar xvf opengrok-1.5.12.tar.gz

# sudo tar xvf opengrok-1.7.25.tar.gz

创建一个软链接,方便后续的修改

$ sudo ln -s opengrok-1.3.11 /opt/opengrok

# sudo ln -s opengrok-1.3.16 /opt/opengrok

# sudo ln -s opengrok-1.5.12 /opt/opengrok

# sudo ln -s opengrok-1.7.25 /opt/opengrok

# 安装工具,必须是Python3 ,Python2 安装会失败
$ sudo apt-get install python3-pip

$ sudo pip3 install --upgrade pip

# 如果报错 ModuleNotFoundError: No module named 'pip._internal'
# 执行如下命令
# sudo python3 -m pip install --upgrade pip

# 解决 AttributeError: module 'setuptools.dist' has no attribute 'check_specifier'
$ sudo pip3 install --upgrade setuptools

$ sudo pip3 install /opt/opengrok/tools/opengrok-tools.tar.gz

链接"`/opt/opengrok/lib/source.war`"到 `Tomcat8` 的工程目录"`/var/lib/tomcat8/webapps/`",比如我们有多个源代码工程,建议进行链接操作。

如下:

$ sudo ln -s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Android_4.2.2.war

$ sudo ln -s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Android_7.0.0_r21.war

$ sudo ln -s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Android_10.0.0_r40.war

$ sudo ln -s /opt/opengrok/lib/source.war /var/lib/tomcat8/webapps/Chromium.war

访问"http://localhost:8080/source/"确认OpenGrok是否已经安装成功,如果安装成功,出现下面的界面:OpenGrok

5.出于安全原因,禁止外网访问Tomcat的8080端口

只允许Tomcat在本地的8080端口监听即可,修改

$ sudo vim /var/lib/tomcat8/conf/server.xml

添加 address="127.0.0.1"

<Connector port="8080" address="127.0.0.1" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />

重启Tomcat8

$ sudo service tomcat8 restart

6.配置Apache2对Tomcat通过AJP进行反向代理

`Apache2` 的配置文件“ `/etc/apache2/sites-enabled/000-default.conf`” (如果开启了HTTPS,则需要同步修改 `/etc/apache2/sites-enabled/000-default-le-ssl.conf` 或者 `/etc/apache2/sites-enabled/default-ssl.conf`) 中,增加如下配置:

<VirtualHost *:80>
	#for Tomcat 8 openGrok Android Source
	ProxyPass /Android_4.2.2/ ajp://127.0.0.1:8009/Android_4.2.2/
	ProxyPassReverse /AndroidXRef_4.2.2/ ajp://127.0.0.1:8009/AndroidXRef_4.2.2/
        
	ProxyPass /Android_7.0.0_r21/ ajp://127.0.0.1:8009/Android_7.0.0_r21/
	ProxyPassReverse /Android_7.0.0_r21/ ajp://127.0.0.1:8009/Android_7.0.0_r21/
	
	ProxyPass /Android_10.0.0_r40/ ajp://127.0.0.1:8009/Android_10.0.0_r40/
	ProxyPassReverse /Android_10.0.0_r40/ ajp://127.0.0.1:8009/Android_10.0.0_r40/		
	
	#for Tomcat 8 OpenGrok Chromium	
	ProxyPass /Chromium/ ajp://127.0.0.1:8009/Chromium/
	ProxyPassReverse /Chromium/ ajp://127.0.0.1:8009/Chromium/	
</VirtualHost>

`Tomcat8` 的配置文件/var/lib/tomcat8/conf/server.xml中增加如下配置<Context path="/Android_4.2.2" docBase="Android_4.2.2/"/>,解决跳转404问题。ProxyPass后面必须携带“/”,否则就会出现404问题。

<Host name="localhost"  appBase="webapps"
	unpackWARs="true" autoDeploy="true">
 
	<Context path="/Android_4.2.2" docBase="Android_4.2.2/"/>
	<Context path="/Android_7.0.0.r21" docBase="Android_7.0.0_r21/"/>
	<Context path="/Android_10.0.0_r40" docBase="Android_10.0.0_r40/"/>
	<Context path="/Chromium" docBase="Chromium/"/>

	<!-- SingleSignOn valve, share authentication between web applications
		 Documentation at: /docs/config/valve.html -->
	<!--
	<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
	-->
 
	<!-- Access log processes all example.
		 Documentation at: /docs/config/valve.html
		 Note: The pattern used is equivalent to using pattern="common" -->
	<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
		   prefix="localhost_access_log." suffix=".txt"
		   pattern="%h %l %u %t &quot;%r&quot; %s %b" />

	<!-- 隐藏版本号 -->
	<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />

</Host>

7.配置OpenGrok对源代码进行解析

设置要建立索引的源代码目录的位置,以存储在"/data/OpenGrok/Android_4.2.2"上的Android代码为例子:

$ export OPENGROK_INSTANCE_BASE=/data/OpenGrok/Android_4.2.2/

$ export OPENGROK_WEBAPP_CONTEXT=Android_4.2.2

注意:

由于我们使用了Apache2的反向代理才需要设置 `OPENGROK_WEBAPP_CONTEXT`,如果没有设置反向代理,请不要设置。

`OPENGROK_WEBAPP_CONTEXT` 内容就是在 `Apache2` 中设置的 `ProxyPassReverse` 指定的参数。

在使用反向代理的时候如果不设置OPENGROK_WEBAPP_CONTEXT会导致在点击具体的变量定义的时候,出现404。

不使用反向代理的时候请只设置OPENGROK_INSTANCE_BASE

这个变量的本质功能就是在建立文件索引的时候,在链接头部增加 OPENGROK_WEBAPP_CONTEXT 指定的路径,比如原来的路径是 https://www.mobibrw.com/a.html ,那么指定路径后,就变成了 https://www.mobibrw.com/ Android_4.2.2/a.html

创建源代码索引

$ cd /data/OpenGrok/Android_4.2.2/src

# 删除源代码下面可能存在的".git",".svn"隐藏目录
$ find . -name .svn -print0 | xargs -0 rm -r -f

$ find . -name .git -print0 | xargs -0 rm -r -f

# 删除无法进行索引的文件
$ find . -name *.apk -print0 | xargs -0 rm -r -f

$ find . -name *.zip -print0 | xargs -0 rm -r -f

$ find . -name *.jar -print0 | xargs -0 rm -r -f

# 编译工具是没有必要的目录
$ rm -rf prebuilts

$ export IDX_ROOT=/data/OpenGrok/Android_4.2.2/

# Android 源代码目录
$ export IDX_SRC=${IDX_ROOT}src/

$ export IDX_DATA=${IDX_ROOT}data/

$ export IDX_CONF=${IDX_ROOT}etc/configuration.xml

# 清理以前生成的索引数据 
# 索引数据目录 
$ cd ${IDX_ROOT} 

$ rm -rf data 

# 日志目录 
$ rm -rf log 

# 配置文件目录 
$ rm -rf etc 

$ rm -rf logging.properties

$ mkdir etc

# 限制索引内存占用,避免建立索引过程中引发OOM,
# 如果依旧出现OOM,则在参数中指定 “-T 1” 限制只能使用一个线程,不允许并发,减少内存开销
# 其实由于磁盘IO是整个索引的性能瓶颈,因此多线程并不能缩短太多的时间,反而占用了太多的内存
# 因此限制只能使用一个线程,在大多数情况下,是没问题的
# 同时使用 "-m 256" 参数增加 Lucene 4.x 使用的缓存的大小,避免出现问题
# Android 10的源代码至少需要2GB内存才能成功索引
$ export JAVA_OPTS="-Xmx2048m"

$ opengrok-indexer -J=-Xmx2g -a /opt/opengrok/lib/opengrok.jar -- -m 256 -s $IDX_SRC -d $IDX_DATA -T 1 -H -P -S -G -W $IDX_CONF

执行时间在40分钟左右,执行完成 。(如果通过SSH远程登录,可能会出现中途连接断开的情况,原因为某项操作比较耗时,导致长时间没有数据通信,网络超时断开。 参考 Linux SSH保持连接(解决Broken pipe))生成的索引文件在源代码的"data"目录下面,重建索引的时候需要执行如下操作,才能再次建立索引

# 切换回到项目根目录
$ cd ${IDX_ROOT}

# 索引数据目录
$ rm -rf data

# 日志目录
$ rm -rf log

# 配置文件目录
$ rm -rf etc

$ rm -rf logging.properties

注意,请务必删除源代码中的"prebuilts"目录,这个目录下面存储的是一系列的编译工具,在浏览代码的时候,完全用不上,但是占据的磁盘空间确是巨大的。

注意,如果服务器上面的内存比较有限,请使用如下命令进行内存限制,否则建立索引的时候,会触发内存不足的情况:

# 早期版本使用如下参数限制内存
$ export JAVA_OPTS="-Xmx1024m"

# 最新版本OpenGrok-1.3.11/1.3.16使用-J=-Xmx2g 进行内存限制,Android 10的源代码至少需要2GB内存才能成功索引

修改OpenGrok配置文件

$ sudo vim /var/lib/tomcat8/webapps/Android_4.2.2/WEB-INF/web.xml

修改其中的

<context-param>
	<param-name>CONFIGURATION</param-name>
	<param-value>/var/opengrok/etc/configuration.xml</param-value>
	<description>Full path to the configuration file where OpenGrok can read it's configuration</description>
</context-param>

为具体的工程目录"/data/OpenGrok/Android_4.2.2",修改后的配置如下:

<context-param>
	<param-name>CONFIGURATION</param-name>
	<param-value>/data/OpenGrok/Android_4.2.2/etc/configuration.xml</param-value>
	<description>Full path to the configuration file where OpenGrok can read it's configuration</description>
</context-param>

刷新浏览器,可以看到Android_4.2.2的源码可以搜索出来了。

参考链接


发布者