- 添加 Gitea Actions 工作流 (.gitea/workflows/) - cicd.yml: 完整 CICD 流程(构建、测试、推送、部署) - test.yml: 快速测试工作流 - 配置 Kubernetes 部署清单 (k8s/) - namespace.yaml: 创建 claude-stock namespace - configmap.yaml: 应用配置和 Ollama 连接配置 - deployment.yaml: 后端和前端部署(支持 Node IP 连接 Ollama) - service.yaml: 服务定义、RBAC 和网络策略 - ollama-bridge.yaml: 四种 K8s 与宿主 Ollama 通信方案 - secrets.sh: 自动创建 K8s Secrets - 部署脚本和工具 - deploy-to-k8s.sh: 一键 K8s 部署脚本 - verify-cicd.sh: CICD 环境验证脚本 - 文档 - CICD_DEPLOYMENT_GUIDE.md: 完整部署指南(中文) - QUICK_START.md: 5 分钟快速启动指南(中文) 关键功能: ✅ Gitea Runners(Docker + K8s) ✅ Harbor 镜像仓库集成 ✅ 自动化测试和安全扫描 ✅ K8s 滚动更新和健康检查 ✅ Ollama 集成(使用 Node IP 解决通信问题) ✅ 完整的部署后验证 🤖 Generated with Claude Code Co-Authored-By: Claude <[email protected]>
232 lines
5.8 KiB
Bash
Executable File
232 lines
5.8 KiB
Bash
Executable File
#!/bin/bash
|
||
# CICD 环境验证脚本
|
||
# 检查所有必要的组件是否正确配置
|
||
|
||
set -e
|
||
|
||
echo "🔍 Claude Stock CICD 环境验证"
|
||
echo "=============================="
|
||
echo ""
|
||
|
||
ERRORS=0
|
||
WARNINGS=0
|
||
|
||
# 颜色输出
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
check_passed() {
|
||
echo -e "${GREEN}✅ $1${NC}"
|
||
}
|
||
|
||
check_failed() {
|
||
echo -e "${RED}❌ $1${NC}"
|
||
((ERRORS++))
|
||
}
|
||
|
||
check_warning() {
|
||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||
((WARNINGS++))
|
||
}
|
||
|
||
# ==================== 检查 Gitea ====================
|
||
echo "1️⃣ 检查 Gitea..."
|
||
if docker ps | grep -q "gitea3"; then
|
||
check_passed "Gitea 容器运行中"
|
||
else
|
||
check_failed "Gitea 容器未运行"
|
||
fi
|
||
|
||
if curl -s http://192.168.1.83:33000/api/healthz > /dev/null; then
|
||
check_passed "Gitea 服务正常"
|
||
else
|
||
check_failed "Gitea 服务无法访问"
|
||
fi
|
||
echo ""
|
||
|
||
# ==================== 检查 Runners ====================
|
||
echo "2️⃣ 检查 Gitea Runners..."
|
||
cd ~/work/codes/tools/macos/gitea
|
||
|
||
if docker ps | grep -q "runner-docker"; then
|
||
check_passed "Runner-docker 运行中"
|
||
else
|
||
check_failed "Runner-docker 未运行"
|
||
fi
|
||
|
||
if docker ps | grep -q "runner-k8s"; then
|
||
check_passed "Runner-k8s 运行中"
|
||
else
|
||
check_failed "Runner-k8s 未运行"
|
||
fi
|
||
|
||
# 检查 Runner 注册
|
||
if docker exec gitea3 gitea actions runner list 2>/dev/null | grep -q "runner"; then
|
||
check_passed "Runners 已注册"
|
||
else
|
||
check_warning "Runners 未注册(需要手动配置)"
|
||
fi
|
||
cd - > /dev/null
|
||
echo ""
|
||
|
||
# ==================== 检查 Harbor ====================
|
||
echo "3️⃣ 检查 Harbor..."
|
||
if curl -s -k https://localhost:8443/api/v2.0/health > /dev/null; then
|
||
check_passed "Harbor 服务正常"
|
||
else
|
||
check_warning "Harbor 服务无法访问(https://localhost:8443)"
|
||
fi
|
||
|
||
# 检查能否登录 Harbor
|
||
if docker login localhost:8443 -u admin -p "${HARBOR_PASSWORD:-Harbor12345}" > /dev/null 2>&1; then
|
||
check_passed "Harbor 登录成功"
|
||
else
|
||
check_failed "Harbor 登录失败"
|
||
fi
|
||
echo ""
|
||
|
||
# ==================== 检查 Kubernetes ====================
|
||
echo "4️⃣ 检查 Kubernetes..."
|
||
if kubectl cluster-info > /dev/null 2>&1; then
|
||
check_passed "Kubernetes 集群可用"
|
||
else
|
||
check_failed "Kubernetes 集群不可用"
|
||
fi
|
||
|
||
if kubectl get namespace claude-stock > /dev/null 2>&1; then
|
||
check_passed "Namespace 'claude-stock' 存在"
|
||
else
|
||
check_warning "Namespace 'claude-stock' 不存在"
|
||
fi
|
||
|
||
# 检查 API 连接
|
||
if kubectl get apiresources > /dev/null 2>&1; then
|
||
check_passed "K8s API 连接正常"
|
||
else
|
||
check_failed "K8s API 连接失败"
|
||
fi
|
||
echo ""
|
||
|
||
# ==================== 检查 Ollama ====================
|
||
echo "5️⃣ 检查 Ollama..."
|
||
if curl -s http://localhost:11434/api/tags > /dev/null 2>&1; then
|
||
check_passed "Ollama 服务正常"
|
||
|
||
# 检查 qwen3-coder 模型
|
||
if curl -s http://localhost:11434/api/tags | grep -q "qwen3-coder"; then
|
||
check_passed "qwen3-coder 模型已加载"
|
||
else
|
||
check_warning "qwen3-coder 模型未加载(可能需要拉取)"
|
||
fi
|
||
else
|
||
check_failed "Ollama 服务无法访问 (http://localhost:11434)"
|
||
fi
|
||
echo ""
|
||
|
||
# ==================== 检查 Docker ====================
|
||
echo "6️⃣ 检查 Docker..."
|
||
if docker ps > /dev/null 2>&1; then
|
||
check_passed "Docker 可用"
|
||
else
|
||
check_failed "Docker 无法访问"
|
||
fi
|
||
|
||
# 检查镜像存在
|
||
if docker image ls | grep -q "act_runner"; then
|
||
check_passed "act_runner 镜像可用"
|
||
else
|
||
check_warning "act_runner 镜像不存在(会自动拉取)"
|
||
fi
|
||
echo ""
|
||
|
||
# ==================== 检查 Gitea Secrets ====================
|
||
echo "7️⃣ 检查 Gitea Repository Secrets..."
|
||
cd /Users/brunogao/work/codes/stock/claude-stock
|
||
|
||
# 获取仓库 ID(如果仓库在 Gitea 中)
|
||
REPO_OWNER="root"
|
||
REPO_NAME="stock"
|
||
GITEA_URL="http://192.168.1.83:33000"
|
||
GITEA_TOKEN="${GITEA_TOKEN:-}"
|
||
|
||
if [ -n "$GITEA_TOKEN" ]; then
|
||
SECRETS=$(curl -s -H "Authorization: token $GITEA_TOKEN" \
|
||
"$GITEA_URL/api/v1/repos/$REPO_OWNER/$REPO_NAME/secrets" 2>/dev/null || echo "{}")
|
||
|
||
if echo "$SECRETS" | grep -q "HARBOR_PASSWORD"; then
|
||
check_passed "HARBOR_PASSWORD secret 已设置"
|
||
else
|
||
check_warning "HARBOR_PASSWORD secret 未设置"
|
||
fi
|
||
else
|
||
check_warning "GITEA_TOKEN 未设置(无法检查 secrets)"
|
||
fi
|
||
echo ""
|
||
|
||
# ==================== 检查文件结构 ====================
|
||
echo "8️⃣ 检查文件结构..."
|
||
FILES=(
|
||
".gitea/workflows/cicd.yml"
|
||
".gitea/workflows/test.yml"
|
||
"k8s/namespace.yaml"
|
||
"k8s/configmap.yaml"
|
||
"k8s/deployment.yaml"
|
||
"k8s/service.yaml"
|
||
"k8s/ollama-bridge.yaml"
|
||
"k8s/secrets.sh"
|
||
"deploy-to-k8s.sh"
|
||
"CICD_DEPLOYMENT_GUIDE.md"
|
||
)
|
||
|
||
for file in "${FILES[@]}"; do
|
||
if [ -f "$file" ]; then
|
||
check_passed "文件 $file 存在"
|
||
else
|
||
check_failed "文件 $file 不存在"
|
||
fi
|
||
done
|
||
echo ""
|
||
|
||
# ==================== 检查网络连接 ====================
|
||
echo "9️⃣ 检查网络连接..."
|
||
if ping -c 1 192.168.1.83 > /dev/null 2>&1; then
|
||
check_passed "可以连接到 192.168.1.83"
|
||
else
|
||
check_warning "无法连接到 192.168.1.83"
|
||
fi
|
||
|
||
if nc -zv localhost 8443 > /dev/null 2>&1; then
|
||
check_passed "Harbor 端口 8443 可访问"
|
||
else
|
||
check_warning "Harbor 端口 8443 无法访问"
|
||
fi
|
||
|
||
if nc -zv localhost 11434 > /dev/null 2>&1; then
|
||
check_passed "Ollama 端口 11434 可访问"
|
||
else
|
||
check_failed "Ollama 端口 11434 无法访问"
|
||
fi
|
||
echo ""
|
||
|
||
# ==================== 总结 ====================
|
||
echo "📊 验证总结"
|
||
echo "==========="
|
||
echo ""
|
||
|
||
if [ $ERRORS -eq 0 ] && [ $WARNINGS -eq 0 ]; then
|
||
echo -e "${GREEN}✅ 所有检查通过!CICD 环境已就绪${NC}"
|
||
exit 0
|
||
elif [ $ERRORS -eq 0 ]; then
|
||
echo -e "${YELLOW}⚠️ 有 $WARNINGS 个警告,但没有错误${NC}"
|
||
echo "系统应该可以工作,但某些功能可能不完整"
|
||
exit 0
|
||
else
|
||
echo -e "${RED}❌ 有 $ERRORS 个错误需要解决${NC}"
|
||
if [ $WARNINGS -gt 0 ]; then
|
||
echo -e "同时有 $WARNINGS 个警告"
|
||
fi
|
||
exit 1
|
||
fi
|