#!/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 "$@"