3
0

gitlab sh

2025-11-26
2026-09-07
#!/bin/bash
# 作者:豆包编程助手
# 功能:CentOS 7.9 GitLab + Runner 交互式安装+服务管理一体化工具
# 特性:1. 菜单选择安装模式 2. 菜单化服务管理(启停/重启)3. 全程交互式配置
# 注意:需 root 权限执行,服务器内存建议 ≥ 4GB(GitLab 4GB + Runner 1GB)

# 全局变量
GITLAB_URL=""
GITLAB_PORT=""
TIME_ZONE=""
RUNNER_DESCRIPTION="gitlab-runner-centos7"
RUNNER_TAGS="centos7,shell"
RUNNER_EXECUTOR="shell"
RUNNER_REGISTRATION_TOKEN=""

# ========================== 工具函数 ==========================
# 检查是否为 root 用户
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        echo "❌ 错误:请使用 root 权限执行脚本(sudo -i 切换后再运行)"
        exit 1
    fi
}

# 清理屏幕并显示标题
show_title() {
    clear
    echo "========================================"
    echo "  🚀 GitLab + Runner 全能管理工具(CentOS7.9)"
    echo "========================================"
}

# 显示主菜单
show_main_menu() {
    show_title
    echo "  主菜单:"
    echo "    1. 安装配置(GitLab/Runner)"
    echo "    2. 服务管理(启动/停止/重启)"
    echo "    3. 退出脚本"
    echo "========================================"
    read -p "  请选择操作(1-3):" MAIN_CHOICE

    case $MAIN_CHOICE in
        1) show_install_menu ;;
        2) show_service_menu ;;
        3) echo "👋 退出脚本,感谢使用!"; exit 0 ;;
        *) echo "❌ 无效选择,请输入 1-3!"; sleep 2; show_main_menu ;;
    esac
}

# 显示安装选项菜单
show_install_menu() {
    show_title
    echo "  安装配置菜单:"
    echo "    1. 只安装 GitLab CE"
    echo "    2. 安装 GitLab CE + GitLab Runner"
    echo "    3. 返回主菜单"
    echo "========================================"
    read -p "  请选择安装模式(1-3):" INSTALL_CHOICE

    case $INSTALL_CHOICE in
        1) install_only_gitlab ;;
        2) install_gitlab_and_runner ;;
        3) show_main_menu ;;
        *) echo "❌ 无效选择,请输入 1-3!"; sleep 2; show_install_menu ;;
    esac
}

# 显示服务管理菜单
show_service_menu() {
    show_title
    echo "  服务管理菜单:"
    echo "    1. GitLab 服务管理(启动/停止/重启)"
    echo "    2. Runner 服务管理(启动/停止/重启)"
    echo "    3. 查看所有服务状态"
    echo "    4. 返回主菜单"
    echo "========================================"
    read -p "  请选择操作(1-4):" SERVICE_CHOICE

    case $SERVICE_CHOICE in
        1) manage_gitlab_service ;;
        2) manage_runner_service ;;
        3) check_all_status ;;
        4) show_main_menu ;;
        *) echo "❌ 无效选择,请输入 1-4!"; sleep 2; show_service_menu ;;
    esac
}

# 查看所有服务状态
check_all_status() {
    show_title
    echo "  📊 所有服务状态:"
    echo "========================================"
    
    # 检查 GitLab 状态
    echo -e "\n[GitLab 服务]"
    if command -v gitlab-ctl &> /dev/null; then
        gitlab-ctl status
    else
        echo "⚠️ GitLab 未安装"
    fi

    # 检查 Runner 状态
    echo -e "\n[GitLab Runner 服务]"
    if command -v gitlab-runner &> /dev/null; then
        gitlab-runner status
        echo -e "\nRunner 列表:"
        gitlab-runner list
    else
        echo "⚠️ GitLab Runner 未安装"
    fi

    echo -e "\n========================================"
    read -p "  按回车键返回服务管理菜单..." -n 1 -s
    show_service_menu
}

# GitLab 服务管理子菜单
manage_gitlab_service() {
    show_title
    echo "  GitLab 服务管理:"
    echo "    1. 启动 GitLab"
    echo "    2. 停止 GitLab"
    echo "    3. 重启 GitLab"
    echo "    4. 查看 GitLab 状态"
    echo "    5. 返回服务管理菜单"
    echo "========================================"
    read -p "  请选择操作(1-5):" GITLAB_CHOICE

    case $GITLAB_CHOICE in
        1) 
            if command -v gitlab-ctl &> /dev/null; then
                echo "✅ 正在启动 GitLab..."
                gitlab-ctl start
                echo -e "\n📊 启动后状态:"
                gitlab-ctl status
            else
                echo "❌ GitLab 未安装!"
            fi
            ;;
        2) 
            if command -v gitlab-ctl &> /dev/null; then
                echo "✅ 正在停止 GitLab..."
                gitlab-ctl stop
                echo -e "\n📊 停止后状态:"
                gitlab-ctl status
            else
                echo "❌ GitLab 未安装!"
            fi
            ;;
        3) 
            if command -v gitlab-ctl &> /dev/null; then
                echo "✅ 正在重启 GitLab..."
                gitlab-ctl restart
                echo -e "\n📊 重启后状态:"
                gitlab-ctl status
            else
                echo "❌ GitLab 未安装!"
            fi
            ;;
        4) 
            if command -v gitlab-ctl &> /dev/null; then
                echo "📊 GitLab 当前状态:"
                gitlab-ctl status
            else
                echo "❌ GitLab 未安装!"
            fi
            ;;
        5) show_service_menu; return ;;
        *) echo "❌ 无效选择,请输入 1-5!"; sleep 2; manage_gitlab_service; return ;;
    esac

    echo -e "\n========================================"
    read -p "  按回车键返回 GitLab 服务管理菜单..." -n 1 -s
    manage_gitlab_service
}

# Runner 服务管理子菜单
manage_runner_service() {
    show_title
    echo "  GitLab Runner 服务管理:"
    echo "    1. 启动 Runner"
    echo "    2. 停止 Runner"
    echo "    3. 重启 Runner"
    echo "    4. 查看 Runner 状态"
    echo "    5. 返回服务管理菜单"
    echo "========================================"
    read -p "  请选择操作(1-5):" RUNNER_CHOICE

    case $RUNNER_CHOICE in
        1) 
            if command -v gitlab-runner &> /dev/null; then
                echo "✅ 正在启动 Runner..."
                systemctl start gitlab-runner
                echo -e "\n📊 启动后状态:"
                gitlab-runner status
            else
                echo "❌ GitLab Runner 未安装!"
            fi
            ;;
        2) 
            if command -v gitlab-runner &> /dev/null; then
                echo "✅ 正在停止 Runner..."
                systemctl stop gitlab-runner
                echo -e "\n📊 停止后状态:"
                gitlab-runner status
            else
                echo "❌ GitLab Runner 未安装!"
            fi
            ;;
        3) 
            if command -v gitlab-runner &> /dev/null; then
                echo "✅ 正在重启 Runner..."
                systemctl restart gitlab-runner
                echo -e "\n📊 重启后状态:"
                gitlab-runner status
            else
                echo "❌ GitLab Runner 未安装!"
            fi
            ;;
        4) 
            if command -v gitlab-runner &> /dev/null; then
                echo "📊 Runner 当前状态:"
                gitlab-runner status
                echo -e "\nRunner 列表:"
                gitlab-runner list
            else
                echo "❌ GitLab Runner 未安装!"
            fi
            ;;
        5) show_service_menu; return ;;
        *) echo "❌ 无效选择,请输入 1-5!"; sleep 2; manage_runner_service; return ;;
    esac

    echo -e "\n========================================"
    read -p "  按回车键返回 Runner 服务管理菜单..." -n 1 -s
    manage_runner_service
}

# ========================== 安装函数 ==========================
# 交互式配置 GitLab 核心参数
config_gitlab_params() {
    echo "========================================"
    echo "  🔧 配置 GitLab 核心参数"
    echo "  (直接回车使用默认值)"
    echo "========================================"

    # 1. 访问地址
    read -p "🔹 请输入 GitLab 访问地址(如 http://192.168.1.100):" GITLAB_URL
    if [ -z "$GITLAB_URL" ]; then
        echo "❌ 错误:访问地址不能为空!"; exit 1
    fi

    # 2. 访问端口
    read -p "🔹 请输入访问端口(默认 80,范围 1-65535):" GITLAB_PORT
    if [ -z "$GITLAB_PORT" ]; then
        GITLAB_PORT=80
    else
        if ! [[ "$GITLAB_PORT" =~ ^[0-9]+$ ]] || [ "$GITLAB_PORT" -lt 1 ] || [ "$GITLAB_PORT" -gt 65535 ]; then
            echo "❌ 错误:端口无效,默认使用 80!"; GITLAB_PORT=80
        fi
    fi

    # 3. 时区
    read -p "🔹 请输入时区(默认 Asia/Shanghai):" TIME_ZONE
    [ -z "$TIME_ZONE" ] && TIME_ZONE="Asia/Shanghai"

    # 配置确认
    echo -e "\n========================================"
    echo "  📋 GitLab 配置确认"
    echo "    访问地址:$GITLAB_URL"
    echo "    访问端口:$GITLAB_PORT"
    echo "    时    区:$TIME_ZONE"
    echo "========================================"
    read -p "  配置是否正确?(y/n,默认 y):" CONFIRM
    if [ -n "$CONFIRM" ] && [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then
        echo "❌ 取消安装,返回主菜单!"; sleep 2; show_main_menu; exit 0
    fi
}

# 安装 GitLab CE(单独安装)
install_only_gitlab() {
    show_title
    echo "  📥 开始安装 GitLab CE(仅 GitLab)"
    echo "========================================"

    # 1. 配置参数
    config_gitlab_params

    # 2. 安装依赖
    echo -e "\n📦 安装 GitLab 依赖包..."
    yum install -y curl policycoreutils openssh-server openssh-clients postfix || {
        echo "❌ 依赖安装失败!"; sleep 3; show_install_menu; exit 1
    }

    # 3. 启动 postfix
    systemctl start postfix && systemctl enable postfix
    [ $? -eq 0 ] && echo "✅ postfix 启动成功" || echo "⚠️ postfix 启动警告"

    # 4. 配置国内源
    echo -e "\n📥 配置 GitLab 国内源(清华大学镜像)..."
    cat > /etc/yum.repos.d/gitlab-ce.repo << EOF
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
gpgcheck=0
enabled=1
EOF
    yum clean all && yum makecache || {
        echo "⚠️  国内源失败,切换官方源...";
        curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | bash || {
            echo "❌ 源配置失败!"; sleep 3; show_install_menu; exit 1
        }
    }

    # 5. 安装 GitLab
    echo -e "\n🚀 安装 GitLab CE(耗时较长,请耐心等待)..."
    EXTERNAL_URL="$GITLAB_URL:$GITLAB_PORT" yum install -y gitlab-ce || {
        echo "❌ GitLab 安装失败!"; sleep 3; show_install_menu; exit 1
    }

    # 6. 配置时区并应用
    sed -i "s|# gitlab_rails\['time_zone'\] = 'UTC'|gitlab_rails\['time_zone'\] = '$TIME_ZONE'|g" /etc/gitlab/gitlab.rb
    gitlab-ctl reconfigure || {
        echo "❌ GitLab 配置失败!"; sleep 3; show_install_menu; exit 1
    }

    # 7. 启动并自启
    gitlab-ctl start && systemctl enable gitlab-runsvdir.service || {
        echo "❌ GitLab 启动失败!"; sleep 3; show_install_menu; exit 1
    }

    # 8. 防火墙配置
    if systemctl is-active --quiet firewalld; then
        firewall-cmd --permanent --add-port=$GITLAB_PORT/tcp && firewall-cmd --reload
        echo "✅ 防火墙已开放 $GITLAB_PORT 端口"
    else
        echo "⚠️  firewalld 未启动,跳过防火墙配置"
    fi

    # 9. SELinux 配置
    setenforce 0 && sed -i "s/^SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
    echo "✅ SELinux 已设置为 Permissive 模式"

    # 安装完成
    echo -e "\n========================================"
    echo "  🎉 GitLab CE 安装完成!"
    echo "========================================"
    echo "  🌐 访问地址:$GITLAB_URL:$GITLAB_PORT"
    echo "  👤 初始账号:root"
    echo "  🔑 初始密码:/etc/gitlab/initial_root_password(24小时内有效)"
    echo "  ⚠️  登录后请立即修改初始密码!"
    echo "========================================"
    read -p "  按回车键返回主菜单..." -n 1 -s
    show_main_menu
}

# 交互式配置 Runner 参数
config_runner_params() {
    echo "========================================"
    echo "  🔧 配置 GitLab Runner 参数"
    echo "  (直接回车使用默认值)"
    echo "========================================"

    # 1. Runner 描述
    read -p "🔹 请输入 Runner 描述(默认 gitlab-runner-centos7):" RUNNER_DESCRIPTION
    [ -z "$RUNNER_DESCRIPTION" ] && RUNNER_DESCRIPTION="gitlab-runner-centos7"

    # 2. Runner 标签
    read -p "🔹 请输入 Runner 标签(多个用逗号分隔,默认 centos7,shell):" RUNNER_TAGS
    [ -z "$RUNNER_TAGS" ] && RUNNER_TAGS="centos7,shell"

    # 3. 执行器类型
    read -p "🔹 请输入执行器类型(默认 shell,可选 docker/kubernetes):" RUNNER_EXECUTOR
    if [ -z "$RUNNER_EXECUTOR" ]; then
        RUNNER_EXECUTOR="shell"
    else
        case $RUNNER_EXECUTOR in
            shell|docker|kubernetes) ;;
            *) echo "❌ 无效执行器,默认使用 shell!"; RUNNER_EXECUTOR="shell" ;;
        esac
    fi

    # 4. 注册令牌(必须输入)
    echo -e "\n📌 注册令牌获取路径:"
    echo "   - 实例级(所有项目可用):GitLab 管理员 → Admin → Runners → Registration token"
    echo "   - 项目级(仅单个项目可用):项目 → Settings → CI/CD → Runners → Registration token"
    read -p "🔹 请输入 Runner 注册令牌:" RUNNER_REGISTRATION_TOKEN
    if [ -z "$RUNNER_REGISTRATION_TOKEN" ]; then
        echo "❌ 令牌不能为空!"; sleep 2; config_runner_params
    fi

    # 配置确认
    echo -e "\n========================================"
    echo "  📋 Runner 配置确认"
    echo "    关联 GitLab:$GITLAB_URL:$GITLAB_PORT"
    echo "    描    述:$RUNNER_DESCRIPTION"
    echo "    标    签:$RUNNER_TAGS"
    echo "    执行器:$RUNNER_EXECUTOR"
    echo "    令牌:******(已隐藏)"
    echo "========================================"
    read -p "  配置是否正确?(y/n,默认 y):" CONFIRM
    if [ -n "$CONFIRM" ] && [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then
        echo "❌ 取消配置,重新输入!"; sleep 2; config_runner_params
    fi
}

# 安装 GitLab + Runner(都安装)
install_gitlab_and_runner() {
    show_title
    echo "  📥 开始安装 GitLab CE + GitLab Runner"
    echo "========================================"

    # 第一步:安装 GitLab
    config_gitlab_params

    # 1. 安装 GitLab 依赖
    echo -e "\n📦 安装 GitLab 依赖包..."
    yum install -y curl policycoreutils openssh-server openssh-clients postfix || {
        echo "❌ 依赖安装失败!"; sleep 3; show_install_menu; exit 1
    }

    # 2. 启动 postfix
    systemctl start postfix && systemctl enable postfix
    [ $? -eq 0 ] && echo "✅ postfix 启动成功" || echo "⚠️ postfix 启动警告"

    # 3. 配置 GitLab 国内源
    echo -e "\n📥 配置 GitLab 国内源..."
    cat > /etc/yum.repos.d/gitlab-ce.repo << EOF
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
gpgcheck=0
enabled=1
EOF
    yum clean all && yum makecache || {
        echo "⚠️  国内源失败,切换官方源...";
        curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | bash || {
            echo "❌ 源配置失败!"; sleep 3; show_install_menu; exit 1
        }
    }

    # 4. 安装 GitLab
    echo -e "\n🚀 安装 GitLab CE(耗时较长)..."
    EXTERNAL_URL="$GITLAB_URL:$GITLAB_PORT" yum install -y gitlab-ce || {
        echo "❌ GitLab 安装失败!"; sleep 3; show_install_menu; exit 1
    }

    # 5. 配置 GitLab 并启动
    sed -i "s|# gitlab_rails\['time_zone'\] = 'UTC'|gitlab_rails\['time_zone'\] = '$TIME_ZONE'|g" /etc/gitlab/gitlab.rb
    gitlab-ctl reconfigure && gitlab-ctl start && systemctl enable gitlab-runsvdir.service || {
        echo "❌ GitLab 配置/启动失败!"; sleep 3; show_install_menu; exit 1
    }

    # 6. 防火墙配置
    if systemctl is-active --quiet firewalld; then
        firewall-cmd --permanent --add-port=$GITLAB_PORT/tcp && firewall-cmd --reload
        echo "✅ 防火墙已开放 $GITLAB_PORT 端口"
    fi

    # 7. SELinux 配置
    setenforce 0 && sed -i "s/^SELINUX=enforcing/SELINUX=permissive/" /etc/selinux/config
    echo "✅ SELinux 配置完成"

    # 第二步:安装 Runner
    echo -e "\n========================================"
    echo "  📥 开始安装 GitLab Runner"
    echo "========================================"

    # 1. 配置 Runner 参数
    config_runner_params

    # 2. 安装 Runner 依赖
    echo -e "\n📦 安装 Runner 依赖包..."
    yum install -y curl git || {
        echo "❌ Runner 依赖安装失败!"; sleep 3; show_install_menu; exit 1
    }

    # 3. 配置 Runner 源
    echo -e "\n📥 配置 Runner 官方源..."
    curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | bash || {
        echo "❌ Runner 源配置失败!"; sleep 3; show_install_menu; exit 1
    }

    # 4. 安装 Runner
    yum install -y gitlab-runner || {
        echo "❌ Runner 安装失败!"; sleep 3; show_install_menu; exit 1
    }

    # 5. 注册 Runner 到 GitLab
    echo -e "\n📝 注册 Runner 到 GitLab..."
    gitlab-runner register \
      --non-interactive \
      --url "$GITLAB_URL:$GITLAB_PORT" \
      --registration-token "$RUNNER_REGISTRATION_TOKEN" \
      --description "$RUNNER_DESCRIPTION" \
      --tags "$RUNNER_TAGS" \
      --executor "$RUNNER_EXECUTOR" \
      --shell "bash" || {
        echo "❌ Runner 注册失败!请检查地址/令牌是否正确";
        sleep 3; show_install_menu; exit 1
      }

    # 6. 启动 Runner 并自启
    systemctl start gitlab-runner && systemctl enable gitlab-runner || {
        echo "❌ Runner 启动失败!"; sleep 3; show_install_menu; exit 1
    }

    # 安装完成
    echo -e "\n========================================"
    echo "  🎉 GitLab + Runner 安装完成!"
    echo "========================================"
    echo "  🔹 GitLab 信息:"
    echo "    访问地址:$GITLAB_URL:$GITLAB_PORT"
    echo "    初始账号:root"
    echo "    初始密码:/etc/gitlab/initial_root_password(24小时内有效)"
    echo "  🔹 Runner 信息:"
    echo "    描述:$RUNNER_DESCRIPTION"
    echo "    标签:$RUNNER_TAGS"
    echo "    执行器:$RUNNER_EXECUTOR"
    echo "    状态:$(gitlab-runner status | grep -o "running\|stopped")"
    echo "========================================"
    echo "  ⚠️  重要提示:"
    echo "    1. 登录 GitLab 确认 Runner 已在线(Admin/项目 → Runners)"
    echo "    2. 若执行器为 docker,需手动安装 docker:yum install -y docker && systemctl start docker && systemctl enable docker"
    echo "========================================"
    read -p "  按回车键返回主菜单..." -n 1 -s
    show_main_menu
}

# ========================== 脚本入口 ==========================
check_root
show_main_menu
gitlab sh
/archives/015-gitlab-sh
作者
Administrator
发布于
2025-11-26
许可协议
CC BY-NC-SA 4.0

评论