#!/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