212 lines
5.4 KiB
Bash
212 lines
5.4 KiB
Bash
|
#!/bin/bash
|
|||
|
# 企业级Jenkins一键部署脚本
|
|||
|
|
|||
|
set -e
|
|||
|
|
|||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||
|
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|||
|
|
|||
|
echo "🚀 开始部署企业级Jenkins CI/CD平台..."
|
|||
|
|
|||
|
# 检查Docker环境
|
|||
|
check_docker() {
|
|||
|
if ! command -v docker &> /dev/null; then
|
|||
|
echo "❌ Docker未安装,请先安装Docker"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
|
|||
|
if ! command -v docker-compose &> /dev/null; then
|
|||
|
echo "❌ Docker Compose未安装,请先安装Docker Compose"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
|
|||
|
if ! docker info &> /dev/null; then
|
|||
|
echo "❌ Docker服务未运行,请启动Docker"
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
# 创建必要目录
|
|||
|
create_directories() {
|
|||
|
echo "📁 创建项目目录结构..."
|
|||
|
|
|||
|
mkdir -p "${SCRIPT_DIR}/jenkins_data"
|
|||
|
mkdir -p "${SCRIPT_DIR}/jenkins_data/workspace"
|
|||
|
mkdir -p "${SCRIPT_DIR}/jenkins_data/jobs"
|
|||
|
mkdir -p "${SCRIPT_DIR}/jenkins_data/plugins"
|
|||
|
mkdir -p "${SCRIPT_DIR}/sonarqube_data"
|
|||
|
|
|||
|
# 设置权限
|
|||
|
sudo chown -R 1000:1000 "${SCRIPT_DIR}/jenkins_data" || true
|
|||
|
sudo chown -R 999:999 "${SCRIPT_DIR}/sonarqube_data" || true
|
|||
|
}
|
|||
|
|
|||
|
# 构建和启动服务
|
|||
|
deploy_services() {
|
|||
|
echo "🐳 构建并启动Jenkins服务..."
|
|||
|
|
|||
|
cd "$SCRIPT_DIR"
|
|||
|
|
|||
|
# 构建自定义Jenkins镜像
|
|||
|
docker-compose build jenkins
|
|||
|
|
|||
|
# 启动所有服务
|
|||
|
docker-compose up -d
|
|||
|
|
|||
|
echo "⏳ 等待服务启动..."
|
|||
|
sleep 60
|
|||
|
}
|
|||
|
|
|||
|
# 检查服务状态
|
|||
|
check_services() {
|
|||
|
echo "📊 检查服务状态..."
|
|||
|
|
|||
|
# 检查Jenkins
|
|||
|
if curl -s -f http://localhost:15008 > /dev/null; then
|
|||
|
echo "✅ Jenkins服务正常运行"
|
|||
|
else
|
|||
|
echo "❌ Jenkins服务启动失败"
|
|||
|
docker logs jenkins-custom --tail 50
|
|||
|
exit 1
|
|||
|
fi
|
|||
|
|
|||
|
# 检查SonarQube
|
|||
|
if curl -s -f http://localhost:15010 > /dev/null; then
|
|||
|
echo "✅ SonarQube服务正常运行"
|
|||
|
else
|
|||
|
echo "⚠️ SonarQube服务可能还在启动中..."
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
# 获取初始密码
|
|||
|
get_initial_password() {
|
|||
|
echo "🔑 获取Jenkins初始密码..."
|
|||
|
|
|||
|
local password_file="${SCRIPT_DIR}/jenkins_data/secrets/initialAdminPassword"
|
|||
|
local max_attempts=30
|
|||
|
local attempt=1
|
|||
|
|
|||
|
while [ $attempt -le $max_attempts ]; do
|
|||
|
if [ -f "$password_file" ]; then
|
|||
|
echo "Jenkins初始密码:"
|
|||
|
cat "$password_file"
|
|||
|
break
|
|||
|
elif docker exec jenkins-custom test -f /var/jenkins_home/secrets/initialAdminPassword 2>/dev/null; then
|
|||
|
echo "Jenkins初始密码:"
|
|||
|
docker exec jenkins-custom cat /var/jenkins_home/secrets/initialAdminPassword
|
|||
|
break
|
|||
|
else
|
|||
|
echo "等待Jenkins生成初始密码... (尝试 $attempt/$max_attempts)"
|
|||
|
sleep 10
|
|||
|
((attempt++))
|
|||
|
fi
|
|||
|
done
|
|||
|
|
|||
|
if [ $attempt -gt $max_attempts ]; then
|
|||
|
echo "⚠️ 无法获取初始密码,请手动查看容器日志"
|
|||
|
docker logs jenkins-custom --tail 20
|
|||
|
fi
|
|||
|
}
|
|||
|
|
|||
|
# 显示访问信息
|
|||
|
show_access_info() {
|
|||
|
echo ""
|
|||
|
echo "🎉 Jenkins CI/CD平台部署完成!"
|
|||
|
echo ""
|
|||
|
echo "📋 访问信息:"
|
|||
|
echo " 🌐 Jenkins: http://localhost:15008"
|
|||
|
echo " 🌐 SonarQube: http://localhost:15010"
|
|||
|
echo ""
|
|||
|
echo "🔧 默认账号:"
|
|||
|
echo " Jenkins: admin / (使用上面显示的初始密码)"
|
|||
|
echo " SonarQube: admin / admin"
|
|||
|
echo ""
|
|||
|
echo "📁 数据目录:"
|
|||
|
echo " Jenkins: ${SCRIPT_DIR}/jenkins_data"
|
|||
|
echo " SonarQube: ${SCRIPT_DIR}/sonarqube_data"
|
|||
|
echo ""
|
|||
|
echo "🚀 快速开始:"
|
|||
|
echo "1. 访问Jenkins并完成初始设置"
|
|||
|
echo "2. 安装推荐插件(已预装核心插件)"
|
|||
|
echo "3. 创建管理员用户"
|
|||
|
echo "4. 导入示例项目: ${PROJECT_ROOT}"
|
|||
|
echo "5. 使用 .ci-config.yml 配置项目构建"
|
|||
|
echo ""
|
|||
|
echo "📖 文档:"
|
|||
|
echo " 配置指南: ${PROJECT_ROOT}/JENKINS_SETUP.md"
|
|||
|
echo " 故障排查: ${PROJECT_ROOT}/JENKINS_TROUBLESHOOTING.md"
|
|||
|
}
|
|||
|
|
|||
|
# 创建管理脚本
|
|||
|
create_management_scripts() {
|
|||
|
echo "📝 创建管理脚本..."
|
|||
|
|
|||
|
# 启动脚本
|
|||
|
cat > "${SCRIPT_DIR}/start.sh" << 'EOF'
|
|||
|
#!/bin/bash
|
|||
|
cd "$(dirname "$0")"
|
|||
|
docker-compose start
|
|||
|
echo "✅ Jenkins服务已启动"
|
|||
|
echo "🌐 访问地址: http://localhost:15008"
|
|||
|
EOF
|
|||
|
|
|||
|
# 停止脚本
|
|||
|
cat > "${SCRIPT_DIR}/stop.sh" << 'EOF'
|
|||
|
#!/bin/bash
|
|||
|
cd "$(dirname "$0")"
|
|||
|
docker-compose stop
|
|||
|
echo "✅ Jenkins服务已停止"
|
|||
|
EOF
|
|||
|
|
|||
|
# 重启脚本
|
|||
|
cat > "${SCRIPT_DIR}/restart.sh" << 'EOF'
|
|||
|
#!/bin/bash
|
|||
|
cd "$(dirname "$0")"
|
|||
|
docker-compose restart
|
|||
|
echo "✅ Jenkins服务已重启"
|
|||
|
echo "🌐 访问地址: http://localhost:15008"
|
|||
|
EOF
|
|||
|
|
|||
|
# 查看日志脚本
|
|||
|
cat > "${SCRIPT_DIR}/logs.sh" << 'EOF'
|
|||
|
#!/bin/bash
|
|||
|
cd "$(dirname "$0")"
|
|||
|
if [ "$1" = "sonar" ]; then
|
|||
|
docker-compose logs -f sonarqube
|
|||
|
else
|
|||
|
docker-compose logs -f jenkins
|
|||
|
fi
|
|||
|
EOF
|
|||
|
|
|||
|
# 备份脚本
|
|||
|
cat > "${SCRIPT_DIR}/backup.sh" << 'EOF'
|
|||
|
#!/bin/bash
|
|||
|
cd "$(dirname "$0")"
|
|||
|
BACKUP_DIR="backup-$(date +%Y%m%d-%H%M%S)"
|
|||
|
mkdir -p "$BACKUP_DIR"
|
|||
|
cp -r jenkins_data "$BACKUP_DIR/"
|
|||
|
cp -r sonarqube_data "$BACKUP_DIR/"
|
|||
|
echo "✅ 备份完成: $BACKUP_DIR"
|
|||
|
EOF
|
|||
|
|
|||
|
# 设置执行权限
|
|||
|
chmod +x "${SCRIPT_DIR}"/*.sh
|
|||
|
}
|
|||
|
|
|||
|
# 主函数
|
|||
|
main() {
|
|||
|
echo "企业级Jenkins CI/CD平台部署程序"
|
|||
|
echo "================================="
|
|||
|
|
|||
|
check_docker
|
|||
|
create_directories
|
|||
|
deploy_services
|
|||
|
check_services
|
|||
|
get_initial_password
|
|||
|
create_management_scripts
|
|||
|
show_access_info
|
|||
|
}
|
|||
|
|
|||
|
# 执行主函数
|
|||
|
main "$@"
|