Files
brunoandClaude e135a6396f feat: 实现完整的 CICD 流程
- 添加 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]>
2025-11-13 11:56:09 +08:00

232 lines
5.8 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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