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