opengrok安装部署教程
opengrok简介
OpenGrok 是一个开源的源代码搜索与交叉引用工具,支持多种编程语言。它能快速索引代码库,提供高效的全文搜索、符号查找、定义跳转和历史变更查看等功能,帮助开发者快速理解和导航大型代码项目。常用于企业或开源项目的代码浏览与分析。
部署环境
Linux服务器:Ubuntu20.04LTS
部署方式: 使用Docker 安装部署
服务器IP地址:192.168.203.111
如果没有安装docker的,可以看 清华大学开源镜像站安装docker-ce
1.配置并启动opengrok
shell
# 1.拉取opengrok 镜像
docker pull opengrok/docker
# 2.创建opengrok数据存放位置
sudo mkdir -p /data/docker-compose/opengrok/{data,src,etc}
# 3.设置权限
sudo chmod 757 -R /data/docker-compose/opengrok
# 4.创建Docker Compose 文件
sudo vim /data/docker-compose/opengrok/docker-compose-opengrok.yaml
#######################################################################
services:
opengrok:
# 使用官方镜像,已经包含了Tomcat和OpenGrok
image: opengrok/docker:latest
container_name: opengrok
restart: always
ports:
- "8088:8080" #将容器的8080端口映射到宿主机的8088
volumes:
- /data/docker-compose/opengrok/src:/opengrok/src # 持久化源代码目录
- /data/docker-compose/opengrok/data:/opengrok/data # 持久化数据目录
- /data/docker-compose/opengrok/etc:/opengrok/etc # 持久化配置索引目录
enviroment:
SYNC_PERIOD_MINUTES: '0' # 关闭更新索引,后续手动更新索引(建议是手动更新索引,不是很建议自动更新)
JAVA_OPTS: "-Xms4g -Xmx6g"
NOMIRROR: 'true'
#######################################################################
保存退出
# 5.启动容器
sudo docker-compose -f docker-compose-opengrok.yaml up -d
# 6.访问,出现页面就算成功。
2.用脚本同步代码并展示
shell
# 1.创建同步代码脚本和创建日志文件
cd /data/docker-compose/opengrok
touch sync-status.log # 创建日志文件
sudo vim repolist.sh # 创建同步代码脚本文件
############################################################################################
#!/bin/bash
# ========================================
# OpenGrok 源码拉取脚本
# 功能:批量克隆或更新 Git 仓库(这里拉取develop 分支)
# 作者:ztf
# ========================================
# 定义颜色变量
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color (重置颜色)
# 初始化计数器
success_count=0
failed_count=0
total_repos=0
# 设置源码根目录
SRC_DIR="/data/docker-compose/opengrok/src/sdk666"
# 创建目录(如果不存在)
mkdir -p "$SRC_DIR"
# 切换到源码目录
cd "$SRC_DIR" || {
echo "无法进入目录 $SRC_DIR"
exit 1
}
# 定义要克隆的仓库列表
# 格式:repo_name repo_url
# 示例:
# arm-trusted-firmware ssh://git@172.24.200.12:222/path/to/arm-trusted-firmware.git develop
# 这里的172.24.200.12 是GITLAB仓库(填写自己内部的仓库地址IP)
declare -a REPOS=(
"arm-trusted-firmware ssh://git@172.24.200.12:222/path/to/arm-trusted-firmware.git develop"
"build ssh://git@172.24.200.12:222/path/to/build.git develop"
)
# --- 计算总数 ---
total_repos=${#REPOS[@]}
echo -e "${YELLOW}=== 开始同步 $total_repos 个仓库 ===${NC}"
echo "源码目录: $SRC_DIR"
echo "----------------------------------------"
# 遍历每个仓库
for REPO in "${REPOS[@]}"; do
# 解析名称和 URL
REPO_NAME=$(echo "$REPO" | awk '{print $1}')
REPO_URL=$(echo "$REPO" | awk '{print $2}')
BRANCH=$(echo "$REPO" | awk '{print $3}')
# 校验是否三个字段都存在
if [[ -z "$REPO_NAME" || -z "$REPO_URL" || -z "$BRANCH" ]]; then
echo -e "${RED}[跳过] 仓库信息不完整: '$REPO'${NC}"
((failed_count++))
continue
fi
echo "########################################################"
echo "处理项目: $REPO_NAME"
echo "URL: $REPO_URL"
echo "处理分支: $BRANCH"
# 检查项目目录是否存在
if [ -d "$REPO_NAME" ]; then
echo "目录已存在,正在进入并拉取最新代码..."
cd "$REPO_NAME" || {
echo "无法进入目录 $REPO_NAME,跳过"
((failed_count++))
continue
}
# 检查是否为 Git 仓库
if [ ! -d ".git" ]; then
echo -e "${RED} $REPO_NAME 不是一个 Git 仓库,跳过更新 ${NC}"
cd ..
((failed_count++))
continue
fi
# 检出分支
git checkout "$BRANCH" || {
echo -e "${RED} 切换到分支 $BRANCH 失败,可能不存在 ${NC}"
((failed_count++))
cd ..
continue
}
# 拉取最新代码
if git pull origin "$BRANCH" >/dev/null 2>&1; then
echo -e "${GREEN} -> 已成功更新 $REPO_NAME${NC}"
((success_count++))
else
echo -e "${RED} -> 拉取失败,请检查网络或权限${NC}"
((failed_count++))
fi
cd ..
else
echo "目录不存在,正在克隆 $REPO_NAME..."
if git clone -b "$BRANCH" --single-branch --depth=1 "$REPO_URL" "$REPO_NAME" >/dev/null 2>&1; then
echo -e "${GREEN} -> $REPO_NAME 克隆完成${NC}"
((success_count++))
else
echo -e "${RED} -> 克隆失败: $REPO_NAME${NC}"
((failed_count++))
fi
fi
echo "─────────────────────────────"
done
echo "所有仓库处理完毕! Time: `date "+%Y年%m月%d日 %H:%M:%S"`"
echo "========================================"
echo "同步完成! Time: $(date '+%Y年%m月%d日 %H:%M:%S')"
echo -e "总计: $total_repos | ${GREEN}成功: $success_count ${NC} | ${RED}失败: $failed_count ${NC}"
if [ $failed_count -gt 0 ]; then
echo -e "${YELLOW}注意:有 $failed_count 个仓库处理失败,请检查日志。${NC}"
fi
echo "开始触发索引........................................."
# 通过这个来手动触发索引。docker exec opengrok curl -X GET http://localhost:5000/reindex
Output=$(docker exec opengrok curl -X GET http://localhost:5000/reindex 2>&1)
if [ $? -ne 0 ]; then
echo -e "${RED} 触发索引执行失败....... ${NC}"
echo "错误日志: $Output"
exit 1
fi
echo "触发索引成功..........................................."
echo "开始执行索引..........................................."
sleep 300
LOGS=$(docker logs --tail 20 --since 20m opengrok)
if echo "$LOGS" | grep -q "Indexer finished with success"; then
echo -e "${GREEN}[消息]检测到:Indexer finished with success ${NC}"
echo -e "${GREEN}[消息]索引执行成功!!!! Time: $(date '+%Y年%m月%d日 %H:%M:%S') ${NC}"
exit 0
else
echo -e "${RED}[消息]索引执行失败! Time: $(date '+%Y年%m月%d日 %H:%M:%S') ${NC} "
exit 1
fi
############################################################################################
保存退出
sudo chmod +x repolist.sh
设置定时任务
crontab -e
0 6,12,18,23 * * * /data/docker-compose/opengrok/repolist.sh > /data/docker-compose/opengrok/sync-status.log
可以tail -f /data/docker-compose/opengrok/sync-status.log 查看同步结果。
脚本代码解释如下
功能目标:
- 批量拉取一组 Git 仓库(develop 分支)。
- 使用 git clone --depth=1 或 git pull 实现轻量级同步。
- 最后通过 docker exec 触发 OpenGrok 的索引重建(reindex)。
- 输出清晰的日志提示,支持颜色输出
- 有成功/失败的计数器
【全部仓库处理完毕后,触发索引重建】
等待并验证索引结果
- 等待 5 分钟(300 秒),让索引任务运行。
- 查看最近 20 条日志中是否有 "Indexer finished with success"。
- 成功则退出 0,失败则退出 1