✨ 新功能: - 一键自动化部署脚本 (build-infra.sh) - 统一端口配置 (3开头端口,避免冲突) - 多平台Docker构建支持 (AMD64 + ARM64) - Jenkins Configuration as Code (零手动配置) - 完整的服务验证和健康检查 🏗️ 核心组件: - Jenkins LTS + JDK21 (端口38080) - Gitea 1.21 (端口33000, SSH: 32222) - Docker Registry + UI (端口35001/35002) - 统一cicd-network网络 📋 管理工具: - 自动化部署和验证脚本 - 健康检查和日志管理工具 - 完整的文档和故障排查指南 🎯 已验证功能: - 所有服务正常启动和运行 - API和Web界面完全可访问 - 多平台构建环境就绪 - 完整的CI/CD流水线支持 适用环境: Mac Studio M2 + Docker Desktop
293 lines
7.4 KiB
Bash
Executable File
293 lines
7.4 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# CI/CD 集成管理脚本
|
|
# 管理 Gitea、Jenkins 和 Docker Registry 的集成
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
|
|
# 服务配置
|
|
GITEA_URL="http://192.168.1.83:3000"
|
|
REGISTRY_URL="localhost:5001"
|
|
REGISTRY_UI_URL="http://192.168.1.83:5002"
|
|
JENKINS_URL="http://localhost:8081/jenkins"
|
|
|
|
# 颜色输出
|
|
G='\033[0;32m'; Y='\033[1;33m'; R='\033[0;31m'; B='\033[0;34m'; NC='\033[0m'
|
|
log() { echo -e "${G}[INFO]${NC} $1"; }
|
|
warn() { echo -e "${Y}[WARN]${NC} $1"; }
|
|
error() { echo -e "${R}[ERROR]${NC} $1"; }
|
|
info() { echo -e "${B}[INFO]${NC} $1"; }
|
|
|
|
# 检查依赖
|
|
check_dependencies() {
|
|
log "检查系统依赖..."
|
|
|
|
if ! command -v docker >/dev/null; then
|
|
error "❌ Docker 未安装"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v docker-compose >/dev/null; then
|
|
error "❌ Docker Compose 未安装"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v curl >/dev/null; then
|
|
error "❌ curl 未安装"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v jq >/dev/null; then
|
|
warn "⚠️ jq 未安装,某些功能可能受限"
|
|
fi
|
|
|
|
log "✅ 依赖检查完成"
|
|
}
|
|
|
|
# 启动所有服务
|
|
start_all_services() {
|
|
log "启动所有 CI/CD 服务..."
|
|
|
|
# 创建网络
|
|
docker network create cicd-network 2>/dev/null || true
|
|
|
|
# 启动 Gitea
|
|
log "启动 Gitea..."
|
|
cd "${PROJECT_ROOT}/docker/compose"
|
|
docker-compose -f gitea-compose.yml up -d
|
|
|
|
# 启动 Registry
|
|
log "启动 Docker Registry..."
|
|
docker-compose -f registry-compose.yml up -d
|
|
|
|
# 等待服务启动
|
|
log "等待服务启动..."
|
|
sleep 15
|
|
|
|
# 检查服务状态
|
|
check_services
|
|
}
|
|
|
|
# 停止所有服务
|
|
stop_all_services() {
|
|
log "停止所有 CI/CD 服务..."
|
|
|
|
cd "${PROJECT_ROOT}/docker/compose"
|
|
docker-compose -f gitea-compose.yml down || true
|
|
docker-compose -f registry-compose.yml down || true
|
|
|
|
log "✅ 所有服务已停止"
|
|
}
|
|
|
|
# 检查服务状态
|
|
check_services() {
|
|
log "检查服务状态..."
|
|
echo ""
|
|
|
|
# 检查 Gitea
|
|
if curl -s "${GITEA_URL}/api/healthz" >/dev/null; then
|
|
log "✅ Gitea 运行正常"
|
|
info "🌐 Gitea: ${GITEA_URL}"
|
|
else
|
|
error "❌ Gitea 无法访问"
|
|
fi
|
|
|
|
# 检查 Registry
|
|
if curl -s "http://${REGISTRY_URL}/v2/_catalog" >/dev/null; then
|
|
log "✅ Registry 运行正常"
|
|
info "🐳 Registry: http://${REGISTRY_URL}"
|
|
info "🎨 Registry UI: ${REGISTRY_UI_URL}"
|
|
else
|
|
error "❌ Registry 无法访问"
|
|
fi
|
|
|
|
# 显示容器状态
|
|
echo ""
|
|
log "容器状态:"
|
|
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "(gitea|registry)"
|
|
}
|
|
|
|
# 测试集成功能
|
|
test_integration() {
|
|
log "测试 CI/CD 集成功能..."
|
|
|
|
# 测试 Registry 推送
|
|
log "测试 Registry 镜像推送..."
|
|
|
|
# 创建测试镜像
|
|
local test_image="${REGISTRY_URL}/test/integration:$(date +%s)"
|
|
docker pull alpine:latest
|
|
docker tag alpine:latest "$test_image"
|
|
|
|
# 推送测试镜像
|
|
if docker push "$test_image"; then
|
|
log "✅ Registry 推送测试成功"
|
|
|
|
# 验证镜像存在
|
|
if curl -s "http://${REGISTRY_URL}/v2/_catalog" | grep -q "test/integration"; then
|
|
log "✅ 镜像在 Registry 中验证成功"
|
|
fi
|
|
else
|
|
error "❌ Registry 推送测试失败"
|
|
fi
|
|
|
|
# 清理测试镜像
|
|
docker rmi "$test_image" alpine:latest || true
|
|
|
|
echo ""
|
|
log "集成测试完成"
|
|
}
|
|
|
|
# 显示 Webhook 配置指南
|
|
show_webhook_guide() {
|
|
log "Gitea Webhook 配置指南:"
|
|
echo ""
|
|
echo "1. 登录 Gitea: ${GITEA_URL}"
|
|
echo "2. 进入项目 -> 设置 -> Webhooks"
|
|
echo "3. 添加 Webhook:"
|
|
echo " - 目标 URL: ${JENKINS_URL}/gitea-webhook/"
|
|
echo " - HTTP 方法: POST"
|
|
echo " - 内容类型: application/json"
|
|
echo " - 触发条件: Push events"
|
|
echo ""
|
|
echo "4. Jenkins Pipeline 示例:"
|
|
cat << 'EOF'
|
|
pipeline {
|
|
agent any
|
|
|
|
environment {
|
|
DOCKER_REGISTRY = 'localhost:5001'
|
|
APP_NAME = 'my-app'
|
|
IMAGE_TAG = "${BUILD_NUMBER}"
|
|
}
|
|
|
|
stages {
|
|
stage('构建镜像') {
|
|
steps {
|
|
script {
|
|
def image = docker.build("${DOCKER_REGISTRY}/${APP_NAME}:${IMAGE_TAG}")
|
|
image.push()
|
|
image.push("latest")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
EOF
|
|
}
|
|
|
|
# 显示服务信息
|
|
show_service_info() {
|
|
log "CI/CD 服务信息:"
|
|
echo ""
|
|
echo "🔧 Gitea (Git 仓库):"
|
|
echo " URL: ${GITEA_URL}"
|
|
echo " 默认管理员: admin"
|
|
echo ""
|
|
echo "🐳 Docker Registry (镜像仓库):"
|
|
echo " URL: http://${REGISTRY_URL}"
|
|
echo " UI: ${REGISTRY_UI_URL}"
|
|
echo " 认证: 已禁用 (开发环境)"
|
|
echo ""
|
|
echo "🔧 推送镜像示例:"
|
|
echo " docker tag my-app:latest ${REGISTRY_URL}/my-app:latest"
|
|
echo " docker push ${REGISTRY_URL}/my-app:latest"
|
|
echo ""
|
|
echo "🔍 查看镜像:"
|
|
echo " curl http://${REGISTRY_URL}/v2/_catalog"
|
|
echo " 访问 ${REGISTRY_UI_URL}"
|
|
}
|
|
|
|
# 备份所有数据
|
|
backup_all() {
|
|
local backup_name="${1:-cicd-backup-$(date +%Y%m%d-%H%M%S)}"
|
|
local backup_dir="${PROJECT_ROOT}/backup/full"
|
|
|
|
log "开始完整备份: $backup_name"
|
|
mkdir -p "$backup_dir"
|
|
|
|
# 备份 Gitea
|
|
log "备份 Gitea 数据..."
|
|
./deployment/scripts/backup-gitea-volume.sh "gitea-$backup_name"
|
|
|
|
# 备份 Registry
|
|
log "备份 Registry 数据..."
|
|
./deployment/scripts/registry-manager.sh backup "registry-$backup_name"
|
|
|
|
# 创建配置备份
|
|
log "备份配置文件..."
|
|
tar -czf "$backup_dir/configs-$backup_name.tar.gz" \
|
|
docker/compose/ \
|
|
docker/registry/ \
|
|
deployment/scripts/
|
|
|
|
log "✅ 完整备份完成"
|
|
log "📁 备份位置: $backup_dir"
|
|
}
|
|
|
|
# 显示使用帮助
|
|
show_help() {
|
|
echo "CI/CD 集成管理脚本"
|
|
echo ""
|
|
echo "使用方法:"
|
|
echo " $0 start # 启动所有服务"
|
|
echo " $0 stop # 停止所有服务"
|
|
echo " $0 restart # 重启所有服务"
|
|
echo " $0 status # 查看服务状态"
|
|
echo " $0 test # 测试集成功能"
|
|
echo " $0 info # 显示服务信息"
|
|
echo " $0 webhook-guide # 显示 Webhook 配置指南"
|
|
echo " $0 backup [name] # 备份所有数据"
|
|
echo ""
|
|
echo "服务地址:"
|
|
echo " Gitea: ${GITEA_URL}"
|
|
echo " Registry: http://${REGISTRY_URL}"
|
|
echo " Registry UI: ${REGISTRY_UI_URL}"
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
check_dependencies
|
|
|
|
case "${1:-help}" in
|
|
start)
|
|
start_all_services
|
|
;;
|
|
stop)
|
|
stop_all_services
|
|
;;
|
|
restart)
|
|
stop_all_services
|
|
sleep 3
|
|
start_all_services
|
|
;;
|
|
status)
|
|
check_services
|
|
;;
|
|
test)
|
|
test_integration
|
|
;;
|
|
info)
|
|
show_service_info
|
|
;;
|
|
webhook-guide)
|
|
show_webhook_guide
|
|
;;
|
|
backup)
|
|
backup_all "$2"
|
|
;;
|
|
help|--help|-h)
|
|
show_help
|
|
;;
|
|
*)
|
|
error "未知命令: $1"
|
|
show_help
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
main "$@" |