主要更新: - 使用SSH私钥认证替代用户名密码认证 - 配置deploy-server-ssh-key凭据ID - 修复Jenkinsfile格式和缩进问题 - 添加SSH配置指南和企业级部署文档 技术改进: - 使用sshagent进行安全的SSH连接 - 移除sshpass依赖,提升安全性 - 统一使用root@116.62.163.84进行部署 - 优化Docker镜像传输和部署流程 新增文档: - SSH_CONFIG_GUIDE.md - SSH私钥配置指南 - ENTERPRISE_JENKINS_GUIDE.md - 企业级Jenkins部署 - jenkins-docker/ - Jenkins Docker化部署方案
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 "$@"
|