Files
gerrit/install_gerrit.sh
2025-12-22 17:12:39 +08:00

249 lines
7.0 KiB
Bash
Executable File

#!/bin/bash
# Gerrit 一键安装脚本
# 支持 Ubuntu/Debian 和 CentOS/Rocky Linux
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 配置变量
GERRIT_VERSION="${GERRIT_VERSION:-3.5.0.1}"
GERRIT_HOME="/opt/gerrit"
GERRIT_USER="${USER}"
GERRIT_PORT="${GERRIT_PORT:-8080}"
GERRIT_SSH_PORT="${GERRIT_SSH_PORT:-29418}"
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}Gerrit 自动化安装脚本${NC}"
echo -e "${GREEN}版本: ${GERRIT_VERSION}${NC}"
echo -e "${GREEN}========================================${NC}"
# 检测系统类型
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
OS_VERSION=$VERSION_ID
elif [ -f /etc/redhat-release ]; then
OS="rhel"
OS_VERSION=$(cat /etc/redhat-release | sed 's/.*release \([0-9]\+\).*/\1/')
else
echo -e "${RED}无法检测操作系统类型${NC}"
exit 1
fi
echo -e "${YELLOW}检测到系统: ${OS} ${OS_VERSION}${NC}"
}
# 安装依赖
install_dependencies() {
echo -e "${GREEN}开始安装依赖...${NC}"
if [[ "$OS" == "ubuntu" ]] || [[ "$OS" == "debian" ]]; then
sudo apt update
sudo apt install -y git wget openjdk-17-jdk
elif [[ "$OS" == "centos" ]] || [[ "$OS" == "rhel" ]] || [[ "$OS" == "rocky" ]]; then
if command -v dnf &> /dev/null; then
sudo dnf install -y git wget java-17-openjdk java-17-openjdk-devel
else
sudo yum install -y git wget java-17-openjdk java-17-openjdk-devel
fi
else
echo -e "${RED}不支持的操作系统: ${OS}${NC}"
exit 1
fi
# 验证 Java 安装
if ! java -version 2>&1 | grep -q "version"; then
echo -e "${RED}Java 安装失败${NC}"
exit 1
fi
echo -e "${GREEN}依赖安装完成${NC}"
}
# 创建工作目录
create_directories() {
echo -e "${GREEN}创建工作目录...${NC}"
sudo mkdir -p ${GERRIT_HOME}
sudo chown ${GERRIT_USER}:${GERRIT_USER} ${GERRIT_HOME}
cd ${GERRIT_HOME}
}
# 下载 Gerrit
download_gerrit() {
echo -e "${GREEN}下载 Gerrit ${GERRIT_VERSION}...${NC}"
cd ${GERRIT_HOME}
if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then
wget https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war
else
echo -e "${YELLOW}Gerrit war 文件已存在,跳过下载${NC}"
fi
}
# 初始化 Gerrit
init_gerrit() {
echo -e "${GREEN}初始化 Gerrit...${NC}"
cd ${GERRIT_HOME}
if [ -d "review_site" ]; then
echo -e "${YELLOW}Gerrit 已初始化,跳过初始化步骤${NC}"
return
fi
# 获取服务器 IP
SERVER_IP=$(hostname -I | awk '{print $1}')
if [ -z "$SERVER_IP" ]; then
SERVER_IP="localhost"
fi
# 非交互式初始化
java -jar gerrit-${GERRIT_VERSION}.war init \
-d review_site \
--batch \
--no-auto-start \
-D gerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \
--install-plugin=download-commands \
--install-plugin=replication \
--install-plugin=reviewnotes || true
# 配置认证方式为开发模式(方便个人使用)
cat > review_site/etc/gerrit.config << EOCONFIG
[gerrit]
basePath = git
canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/
serverId = $(uuidgen 2>/dev/null || echo $(date +%s))
[database]
type = h2
database = db/ReviewDB
[auth]
type = DEVELOPMENT_BECOME_ANY_ACCOUNT
[sshd]
listenAddress = *:${GERRIT_SSH_PORT}
[httpd]
listenUrl = http://*:${GERRIT_PORT}/
[cache]
directory = cache
[index]
type = LUCENE
[receive]
enableSignedPush = false
EOCONFIG
echo -e "${GREEN}Gerrit 初始化完成${NC}"
}
# 启动 Gerrit
start_gerrit() {
echo -e "${GREEN}启动 Gerrit 服务...${NC}"
cd ${GERRIT_HOME}/review_site
# 启动服务
bin/gerrit.sh start
# 等待服务启动
sleep 5
# 检查状态
if bin/gerrit.sh status | grep -q "Running"; then
echo -e "${GREEN}Gerrit 服务启动成功!${NC}"
else
echo -e "${RED}Gerrit 服务启动失败,请检查日志${NC}"
echo -e "${YELLOW}查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log${NC}"
exit 1
fi
}
# 创建 systemd 服务(可选)
create_systemd_service() {
echo -e "${GREEN}创建 systemd 服务...${NC}"
sudo tee /etc/systemd/system/gerrit.service > /dev/null << EOSERVICE
[Unit]
Description=Gerrit Code Review
After=network.target
[Service]
Type=forking
User=${GERRIT_USER}
Group=${GERRIT_USER}
ExecStart=${GERRIT_HOME}/review_site/bin/gerrit.sh start
ExecStop=${GERRIT_HOME}/review_site/bin/gerrit.sh stop
ExecReload=${GERRIT_HOME}/review_site/bin/gerrit.sh restart
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOSERVICE
sudo systemctl daemon-reload
sudo systemctl enable gerrit
echo -e "${GREEN}systemd 服务创建完成${NC}"
echo -e "${YELLOW}使用以下命令管理服务:${NC}"
echo -e " 启动: sudo systemctl start gerrit"
echo -e " 停止: sudo systemctl stop gerrit"
echo -e " 重启: sudo systemctl restart gerrit"
echo -e " 状态: sudo systemctl status gerrit"
}
# 输出访问信息
print_info() {
SERVER_IP=$(hostname -I | awk '{print $1}')
if [ -z "$SERVER_IP" ]; then
SERVER_IP="localhost"
fi
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}安装完成!${NC}"
echo -e "${GREEN}========================================${NC}"
echo -e "${YELLOW}访问地址:${NC}"
echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}"
echo -e " SSH 端口: ${GERRIT_SSH_PORT}"
echo -e ""
echo -e "${YELLOW}常用命令:${NC}"
echo -e " 启动服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh start"
echo -e " 停止服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh stop"
echo -e " 重启服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh restart"
echo -e " 查看状态: ${GERRIT_HOME}/review_site/bin/gerrit.sh status"
echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log"
echo -e ""
echo -e "${YELLOW}配置文件位置:${NC}"
echo -e " ${GERRIT_HOME}/review_site/etc/gerrit.config"
echo -e ""
echo -e "${YELLOW}首次访问:${NC}"
echo -e " 1. 打开浏览器访问 http://${SERVER_IP}:${GERRIT_PORT}"
echo -e " 2. 使用任意用户名登录(开发模式)"
echo -e " 3. 第一个登录的用户将自动成为管理员"
echo -e "${GREEN}========================================${NC}"
}
# 主函数
main() {
detect_os
install_dependencies
create_directories
download_gerrit
init_gerrit
start_gerrit
# 询问是否创建 systemd 服务
read -p "是否创建 systemd 服务以便开机自启? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
create_systemd_service
fi
print_info
}
# 执行主函数
main