- 添加 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]>
12 KiB
12 KiB
🚀 Claude Stock CICD - 快速启动指南
5 分钟快速启动
第 1 步:验证环境
cd /Users/brunogao/work/codes/stock/claude-stock
bash verify-cicd.sh
第 2 步:启动 Gitea Runners
cd ~/work/codes/tools/macos/gitea
# 启动 Gitea(如果还没启动)
docker-compose up -d gitea
# 启动两个 Runners
docker-compose up -d runner-docker runner-k8s
# 验证 Runners 运行
docker-compose ps
第 3 步:部署到 Kubernetes
cd /Users/brunogao/work/codes/stock/claude-stock
# 设置 Harbor 密码
export HARBOR_PASSWORD="Harbor12345"
# 运行部署脚本
bash deploy-to-k8s.sh
第 4 步:提交代码触发 CICD
# 在 claude-stock 仓库中
git add .
git commit -m "feat: 完整 CICD 部署"
git push origin main
📊 完整 CICD 流程
┌─────────────────────────────────────────────┐
│ 1. 代码推送到 Gitea │
│ git push origin main │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 2. Gitea Actions 触发工作流 │
│ .gitea/workflows/cicd.yml │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 3. Runners 执行任务 │
│ - runner-docker: 构建镜像 │
│ - runner-k8s: 部署到 Kubernetes │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 4. 构建和测试 │
│ - 编译 Docker 镜像 │
│ - 运行单元测试 │
│ - 安全扫描(Trivy) │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 5. 推送到 Harbor │
│ localhost:8443/claude-stock/backend │
│ localhost:8443/claude-stock/frontend │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 6. 部署到 Kubernetes │
│ - 更新 Deployment │
│ - 滚动更新(Rolling Update) │
│ - 健康检查 │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 7. 部署后验证 │
│ - Smoke 测试 │
│ - Ollama 连接验证 │
│ - API 可用性验证 │
└─────────────────────────────────────────────┘
↓
✅ 部署完成
📁 文件结构说明
claude-stock/
├── .gitea/
│ └── workflows/
│ ├── cicd.yml # 完整 CICD 工作流
│ └── test.yml # 快速测试工作流
├── k8s/
│ ├── namespace.yaml # K8s Namespace
│ ├── configmap.yaml # 配置和环境变量
│ ├── deployment.yaml # 部署清单(核心)
│ ├── service.yaml # 服务定义和 RBAC
│ ├── ollama-bridge.yaml # Ollama 连接配置
│ └── secrets.sh # Secret 创建脚本
├── deploy-to-k8s.sh # K8s 部署脚本
├── verify-cicd.sh # 环境验证脚本
├── CICD_DEPLOYMENT_GUIDE.md # 详细部署指南
└── QUICK_START.md # 本文件
🔧 关键配置说明
1️⃣ Ollama 集成(K8s 与宿主通信)
问题: K8s Pod 无法直接访问 localhost:11434
解决方案: 在 deployment.yaml 中使用 Node IP
env:
- name: NODE_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: OLLAMA_BASE_URL
value: "http://$(NODE_IP):11434"
工作原理:
- Pod 自动获取宿主节点 IP
- 使用 Node IP 连接到 Ollama
- 确保宿主 Ollama 监听
0.0.0.0:11434
2️⃣ Harbor 集成(镜像仓库)
认证流程:
- CICD 工作流使用 Harbor 凭证登录
- 构建镜像:
localhost:8443/claude-stock/backend:latest - 推送镜像到 Harbor
- K8s 使用 Secret 拉取镜像
3️⃣ Gitea Actions(CICD 引擎)
两个 Runner 的分工:
runner-docker:构建、测试、推送镜像runner-k8s:K8s 部署、测试
4️⃣ Kubernetes 部署
部署策略:
- 滚动更新(RollingUpdate)
- 副本数:2(高可用)
- 自动扩展:2-5 个 Pod
- 健康检查:Liveness + Readiness
🔐 Secrets 管理
Gitea Repository Secrets
需要在 Gitea 中配置以下 secrets:
HARBOR_PASSWORD # Harbor 管理员密码
KUBECONFIG # K8s 配置文件(base64 编码)
OPENROUTER_API_KEY # Claude API Key
TUSHARE_TOKEN # TuShare API Token
ALPHA_VANTAGE_API_KEY # Alpha Vantage API Key
配置方法:
- 访问
http://192.168.1.83:33000/<user>/claude-stock/settings/secrets - 点击 "Add Secret"
- 输入名称和值
Kubernetes Secrets
运行 k8s/secrets.sh 自动创建:
harbor-secret:镜像拉取凭证claude-stock-secrets:应用秘钥db-credentials:数据库凭证redis-credentials:Redis 凭证
🚀 常用命令速查
Gitea 和 Runners
# 启动所有服务
cd ~/work/codes/tools/macos/gitea
docker-compose up -d
# 查看 Runners 日志
docker-compose logs -f runner-docker
docker-compose logs -f runner-k8s
# 重启 Runners
docker-compose restart runner-docker runner-k8s
# 查看已注册的 Runners
docker exec gitea3 gitea actions runner list
Kubernetes 部署
# 快速部署
cd /Users/brunogao/work/codes/stock/claude-stock
bash deploy-to-k8s.sh
# 查看部署状态
kubectl get all -n claude-stock
# 查看 Pod 日志
kubectl logs -f deployment/claude-stock-backend -n claude-stock
# 进入 Pod 调试
kubectl exec -it <pod-name> -n claude-stock -- bash
# 查看环境变量
kubectl exec -it <pod-name> -n claude-stock -- env | grep OLLAMA
# 测试 Ollama 连接
kubectl exec -it <pod-name> -n claude-stock -- \
curl http://$NODE_IP:11434/api/tags
端口转发(本地访问)
# 访问 Backend
kubectl port-forward svc/claude-stock-backend 8000:80 -n claude-stock
# 访问 Frontend
kubectl port-forward svc/claude-stock-frontend 8090:8090 -n claude-stock
Gitea Actions 工作流
# 在 Gitea UI 查看工作流
# http://192.168.1.83:33000/<user>/claude-stock/actions
# 查看特定工作流的日志
# 点击工作流 > 选择运行 > 查看日志
🐛 常见问题排查
Q1: Runners 无法连接到 Gitea
症状: Runners 容器不断重启
排查步骤:
# 1. 检查 Gitea 是否运行
docker ps | grep gitea
# 2. 检查 Runner 日志
docker-compose logs runner-docker
# 3. 验证网络连接
docker-compose exec runner-docker ping gitea
# 4. 检查 Runner Token
docker-compose exec runner-docker cat /data/.runner
Q2: Ollama 连接失败
症状: Backend Pod 日志:Failed to connect to Ollama
排查步骤:
# 1. 检查宿主 Ollama
curl http://localhost:11434/api/tags
# 2. 在 Pod 内测试
kubectl exec -it <pod-name> -n claude-stock -- bash
# 在容器内:
echo "NODE_IP=$NODE_IP"
curl http://$NODE_IP:11434/api/tags
# 3. 检查防火墙
# 确保宿主 11434 端口对 K8s 网络开放
# 4. 修改 Ollama 监听地址
export OLLAMA_HOST=0.0.0.0:11434
Q3: 镜像推送到 Harbor 失败
症状: CICD 工作流失败:docker push localhost:8443/...
排查步骤:
# 1. 测试 Harbor 访问
curl -k https://localhost:8443/api/v2.0/health
# 2. 尝试手动登录
docker login localhost:8443
# 3. 检查 Docker daemon.json
# macOS: ~/.docker/daemon.json
cat ~/.docker/daemon.json
# 4. 确保包含 insecure registry
# 重启 Docker Desktop
Q4: K8s 部署超时
症状: kubectl rollout status 超时
排查步骤:
# 1. 检查 Pod 状态
kubectl get pods -n claude-stock
# 2. 描述 Pod 查看事件
kubectl describe pod <pod-name> -n claude-stock
# 3. 检查镜像拉取
kubectl get events -n claude-stock
# 4. 增加超时时间
kubectl rollout status deployment/claude-stock-backend \
-n claude-stock --timeout=10m
📊 监控和日志
查看实时日志
# Backend
kubectl logs -f -l app=claude-stock-backend -n claude-stock
# Frontend
kubectl logs -f -l app=claude-stock-frontend -n claude-stock
# 所有 Pods
kubectl logs -f --all-containers=true -n claude-stock
查看 Pod 资源使用
# 单次查看
kubectl top pods -n claude-stock
# 实时监控
watch -n 1 kubectl top pods -n claude-stock
健康检查
# 检查 Backend 健康
kubectl exec -it <backend-pod> -n claude-stock -- \
curl -v http://localhost:8000/health
# 检查 API 可用性
curl http://$(kubectl get svc claude-stock-backend -n claude-stock -o jsonpath='{.status.loadBalancer.ingress[0].ip}'):80/api/health
🎯 下一步
-
验证环境
bash verify-cicd.sh -
启动 Runners
cd ~/work/codes/tools/macos/gitea docker-compose up -d runner-docker runner-k8s -
部署应用
cd /Users/brunogao/work/codes/stock/claude-stock bash deploy-to-k8s.sh -
测试 CICD
# 推送代码 git add . git commit -m "test: CICD workflow" git push origin main # 在 Gitea UI 查看工作流执行 -
访问应用
# 端口转发 kubectl port-forward svc/claude-stock-backend 8000:80 -n claude-stock # 访问 API curl http://localhost:8000/health
📚 详细文档
完整的部署指南和故障排除请参考:
- CICD_DEPLOYMENT_GUIDE.md - 详细部署指南
- .gitea/workflows/cicd.yml - 工作流定义
- k8s/ - Kubernetes 配置
🔗 相关链接
- Gitea: http://192.168.1.83:33000
- Harbor: https://localhost:8443
- Kubernetes Dashboard:
kubectl proxy后访问localhost:8001 - Ollama: http://localhost:11434
💡 关键概念回顾
Gitea Actions vs GitHub Actions
- 语法相似,但 Actions 文件位置不同
- Gitea:
.gitea/workflows/ - GitHub:
.github/workflows/
K8s 与宿主 Ollama 通信
- Pod 无法直接访问
localhost:11434 - 使用
status.hostIP获取宿主 IP - 宿主 Ollama 需监听
0.0.0.0:11434
镜像仓库 (Harbor)
- 使用 insecure registry(因为是 localhost)
- 需要 Docker 凭证 Secret
- 镜像标签格式:
localhost:8443/project/image:tag
现在你已经拥有完整的 CICD 系统!🎉
有问题?查看 CICD_DEPLOYMENT_GUIDE.md 的故障排除部分。