java_demo/jenkins-docker/deploy-enterprise.sh

212 lines
5.4 KiB
Bash
Raw Normal View History

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