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

12 KiB
Raw Permalink Blame History

🚀 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 集成(镜像仓库)

认证流程:

  1. CICD 工作流使用 Harbor 凭证登录
  2. 构建镜像:localhost:8443/claude-stock/backend:latest
  3. 推送镜像到 Harbor
  4. 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

配置方法:

  1. 访问 http://192.168.1.83:33000/<user>/claude-stock/settings/secrets
  2. 点击 "Add Secret"
  3. 输入名称和值

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

🎯 下一步

  1. 验证环境

    bash verify-cicd.sh
    
  2. 启动 Runners

    cd ~/work/codes/tools/macos/gitea
    docker-compose up -d runner-docker runner-k8s
    
  3. 部署应用

    cd /Users/brunogao/work/codes/stock/claude-stock
    bash deploy-to-k8s.sh
    
  4. 测试 CICD

    # 推送代码
    git add .
    git commit -m "test: CICD workflow"
    git push origin main
    
    # 在 Gitea UI 查看工作流执行
    
  5. 访问应用

    # 端口转发
    kubectl port-forward svc/claude-stock-backend 8000:80 -n claude-stock
    
    # 访问 API
    curl http://localhost:8000/health
    

📚 详细文档

完整的部署指南和故障排除请参考:


🔗 相关链接


💡 关键概念回顾

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 的故障排除部分。