Skip to content

CI/CD流程

**本文引用的文件** - [[[[[bi-analysis/Dockerfile]]]]](../file/bi-analysis/dockerfile) - [[[[[bi-api-jushuitan/Dockerfile]]]]](../file/bi-api-jushuitan/dockerfile) - [[[[[bi-api-leke/Dockerfile]]]]](../file/bi-api-leke/dockerfile) - [[[[[bi-basic/Dockerfile]]]]](../file/bi-basic/dockerfile) - [[[[[bi-chat/Dockerfile]]]]](../file/bi-chat/dockerfile) - [[[[[bi-analysis/k8s/deployment.yaml]]]]](../file/bi-analysis/k8s/deployment.yaml) - [[[[[bi-api-jushuitan/k8s/deployment.yaml]]]]](../file/bi-api-jushuitan/k8s/deployment.yaml) - [[[[[bi-basic/k8s/deployment.yaml]]]]](../file/bi-basic/k8s/deployment.yaml) - [[[[[bi-chat/k8s/deployment.yaml]]]]](../file/bi-chat/k8s/deployment.yaml) - [[[[[bi-analysis/Makefile]]]]](../file/bi-analysis/makefile) - [[[[[bi-api-jushuitan/Makefile]]]]](../file/bi-api-jushuitan/makefile) - [[[[[scripts/deploy.sh]]]]](../file/scripts/deploy.sh) - [[[[[scripts/port-forward.sh]]]]](../file/scripts/port-forward.sh) - [[[[[bi-cron/k8s/cronjob.yaml]]]]](../file/bi-cron/k8s/cronjob.yaml) - [[[[[bi-intra/charts/apisix/templates/apisix-config-cm.yml]]]]](../file/bi-intra/charts/apisix/templates/apisix-config-cm.yml) - [[[[[bi-common/registry/nacos/client.go]]]]](../file/bi-common/registry/nacos/client.go) - [[[[[bi-common/observability/logger/log.go]]]]](../file/bi-common/observability/logger/log.go) - [[[[[bi-common/database/gormx/db.go]]]]](../file/bi-common/database/gormx/db.go) - [[[[[bi-common/mq/kafkax/consumer.go]]]]](../file/bi-common/mq/kafkax/consumer.go) - [[[[[bi-common/mq/kafkax/producer.go]]]]](../file/bi-common/mq/kafkax/producer.go) - [[[[[bi-common/utils/envutil/env.go]]]]](../file/bi-common/utils/envutil/env.go) - [[[[[bi-common/auth/jwt.go]]]]](../file/bi-common/auth/jwt.go) - [[[[[bi-common/cache/redisx/client.go]]]]](../file/bi-common/cache/redisx/client.go) - [[[[[bi-common/grpcx/client.go]]]]](../file/bi-common/grpcx/client.go) - [[[[[bi-common/fx/fx.go]]]]](../file/bi-common/fx/fx.go) - [[[[[bi-common/utils/validation/validator.go]]]]](../file/bi-common/utils/validation/validator.go) - [[[[[bi-common/utils/converter/converter.go]]]]](../file/bi-common/utils/converter/converter.go) - [[[[[bi-common/utils/fileutil/fileutil.go]]]]](../file/bi-common/utils/fileutil/fileutil.go) - [[[[[bi-common/utils/netutil/netutil.go]]]]](../file/bi-common/utils/netutil/netutil.go) - [[[[[bi-common/utils/snowflake/snowflake.go]]]]](../file/bi-common/utils/snowflake/snowflake.go) - [[[[[bi-common/utils/strutil/strutil.go]]]]](../file/bi-common/utils/strutil/strutil.go) - [[[[[bi-common/utils/querybuilder/querybuilder.go]]]]](../file/bi-common/utils/querybuilder/querybuilder.go) - [[[[[bi-common/utils/envutil/env.go]]]]](../file/bi-common/utils/envutil/env.go) - [[[[[bi-common/database/starrocks/streamload/client.go]]]]](../file/bi-common/database/starrocks/streamload/client.go) - [[[[[bi-common/database/gormx/db.go]]]]](../file/bi-common/database/gormx/db.go) - [[[[[bi-common/registry/nacos/client.go]]]]](../file/bi-common/registry/nacos/client.go) - [[[[[bi-common/observability/logger/log.go]]]]](../file/bi-common/observability/logger/log.go) - [[[[[bi-common/mq/kafkax/consumer.go]]]]](../file/bi-common/mq/kafkax/consumer.go) - [[[[[bi-common/mq/kafkax/producer.go]]]]](../file/bi-common/mq/kafkax/producer.go) - [[[[[bi-common/utils/envutil/env.go]]]]](../file/bi-common/utils/envutil/env.go) - [[[[[bi-common/auth/jwt.go]]]]](../file/bi-common/auth/jwt.go) - [[[[[bi-common/cache/redisx/client.go]]]]](../file/bi-common/cache/redisx/client.go) - [[[[[bi-common/grpcx/client.go]]]]](../file/bi-common/grpcx/client.go) - [[[[[bi-common/fx/fx.go]]]]](../file/bi-common/fx/fx.go) - [[[[[bi-common/utils/validation/validator.go]]]]](../file/bi-common/utils/validation/validator.go) - [[[[[bi-common/utils/converter/converter.go]]]]](../file/bi-common/utils/converter/converter.go) - [[[[[bi-common/utils/fileutil/fileutil.go]]]]](../file/bi-common/utils/fileutil/fileutil.go) - [[[[[bi-common/utils/netutil/netutil.go]]]]](../file/bi-common/utils/netutil/netutil.go) - [[[[[bi-common/utils/snowflake/snowflake.go]]]]](../file/bi-common/utils/snowflake/snowflake.go) - [[[[[bi-common/utils/strutil/strutil.go]]]]](../file/bi-common/utils/strutil/strutil.go) - [[[[[bi-common/utils/querybuilder/querybuilder.go]]]]](../file/bi-common/utils/querybuilder/querybuilder.go)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本指南面向BI分析平台的CI/CD与持续交付,覆盖Git工作流与分支管理策略、代码质量与安全扫描、多模块并行构建、容器化与镜像发布、Kubernetes部署与滚动更新、环境与配置管理、发布回滚与应急处理、监控告警与部署后验证,以及跨模块依赖管理与自动化可靠性保障。文档以仓库中现有配置与脚本为基础,结合通用最佳实践,形成可落地的实施蓝图。

项目结构

平台采用多模块(monorepo)组织方式,包含多个Go微服务、Python服务、前端应用与公共库,配合Kubernetes与Nacos等基础设施进行统一编排与配置管理。关键目录与职责概览:

  • bi-analysis、bi-api-jushuitan、bi-api-leke、bi-basic、bi-chat 等:各微服务模块,含Dockerfile、Makefile、K8s部署清单
  • bi-common:公共库,提供认证、缓存、数据库、消息队列、注册中心、可观测性等通用能力
  • bi-intra:内部基础设施与运维工具(如网关、监控图表等)
  • scripts:部署与联调辅助脚本
  • bi-cron:定时任务(CronJob)

章节来源

  • file://bi-analysis/Dockerfile#L1-L53
  • file://bi-api-jushuitan/Dockerfile#L1-L53
  • file://bi-api-leke/Dockerfile#L1-L53
  • file://bi-basic/Dockerfile#L1-L53
  • file://bi-chat/Dockerfile#L1-L38
  • file://bi-analysis/k8s/deployment.yaml#L1-L54
  • file://bi-api-jushuitan/k8s/deployment.yaml#L1-L56
  • file://bi-basic/k8s/deployment.yaml#L1-L51
  • file://bi-chat/k8s/deployment.yaml#L1-L55

核心组件

  • 构建与打包
    • Go服务通过Makefile统一生成协议、文档、构建二进制;Dockerfile使用多阶段构建,私有仓库代理与凭证注入仅存在于构建阶段,最终镜像不含敏感信息
    • Python服务通过requirements.txt安装依赖,镜像内设置时区与运行参数
  • 容器镜像与发布
    • Dockerfile均基于统一的官方基础镜像,暴露端口与命令行参数由部署清单注入
  • Kubernetes部署
    • 各服务提供Deployment模板,使用ConfigMap与Secret注入环境变量与认证信息,设置资源请求与限制
  • 公共能力
    • 认证(JWT)、缓存(Redis)、数据库(GORM/StarRocks StreamLoad)、消息队列(Kafka)、注册中心(Nacos)、可观测性(日志/指标)等
  • 基础设施
    • CronJob用于定时任务;APISIX作为网关与路由入口

章节来源

  • file://bi-analysis/Makefile#L95-L114
  • file://bi-api-jushuitan/Makefile#L91-L109
  • file://bi-analysis/Dockerfile#L1-L53
  • file://bi-api-jushuitan/Dockerfile#L1-L53
  • file://bi-basic/Dockerfile#L1-L53
  • file://bi-chat/Dockerfile#L1-L38
  • file://bi-analysis/k8s/deployment.yaml#L17-L54
  • file://bi-api-jushuitan/k8s/deployment.yaml#L17-L56
  • file://bi-basic/k8s/deployment.yaml#L17-L51
  • file://bi-chat/k8s/deployment.yaml#L18-L55

架构总览

下图展示CI/CD在平台中的位置与交互:开发者提交代码触发流水线,流水线执行代码检查、测试、构建与打包,产出镜像并推送至镜像仓库,随后通过Kubernetes部署到目标环境,并进行健康检查与监控告警。

[本图为概念性总览,无需“图示来源”]

详细组件分析

Git工作流与分支管理策略

  • 主分支保护
    • master/main分支需通过CI校验方可合并,禁止直接推送,强制PR审查与状态检查
    • 关键分支:master(生产)、release/(预发布)、feature/(功能)、hotfix/*(紧急修复)
  • 功能分支合并流程
    • feature/*从master分叉,完成本地测试后发起PR,要求至少一名reviewer批准
    • PR合并前必须通过CI全量检查(代码检查、单元测试、集成测试)
    • 合并后自动触发对应模块的构建与部署(按环境策略)
  • 版本与标签
    • 使用语义化版本与Git Tag标记发布基线,Makefile中通过git描述符生成版本号

章节来源

  • file://bi-analysis/Makefile#L3-L3
  • file://bi-api-jushuitan/Makefile#L3-L3

代码检查与静态分析

  • Go服务
    • 使用Makefile统一生成协议与文档,便于静态分析与OpenAPI校验
    • 建议在CI中增加golangci-lint、ineffassign、unused等检查项
  • Python服务
    • 建议在CI中增加flake8/pylint、bandit(安全)、安全依赖扫描
  • 前端应用
    • 建议在CI中增加ESLint、TypeScript类型检查、依赖漏洞扫描

章节来源

  • file://bi-analysis/Makefile#L35-L94
  • file://bi-api-jushuitan/Makefile#L34-L89

单元测试与集成测试

  • Go服务
    • Makefile提供统一构建入口,建议在CI中执行go test ./... 并生成覆盖率报告
  • Python服务
    • 建议在CI中执行pytest并输出覆盖率
  • 集成测试
    • 可通过Kubernetes Job或外部测试框架对服务间调用进行端到端验证

章节来源

  • file://bi-analysis/Makefile#L95-L98
  • file://bi-api-jushuitan/Makefile#L91-L94

构建与打包(Docker)

  • 多阶段构建
    • 构建阶段安装依赖、下载模块、生成wire代码并编译二进制;最终镜像仅包含运行时所需文件
    • 私有仓库访问通过构建参数注入凭证,最终镜像不携带凭证,降低泄露风险
  • 端口与命令
    • 不同服务暴露不同端口,启动参数通过环境变量注入
  • 依赖与代理
    • 使用国内镜像源与代理,提升构建稳定性

图示来源

章节来源

  • file://bi-analysis/Dockerfile#L9-L28
  • file://bi-api-jushuitan/Dockerfile#L9-L28
  • file://bi-basic/Dockerfile#L9-L28
  • file://bi-chat/Dockerfile#L7-L14

镜像构建与发布流程

  • 触发条件
    • 推送Tag或合并到受保护分支
  • 步骤
    • 读取版本信息(Tag/Commit),构建多阶段镜像
    • 打标签(latest/版本号/提交哈希),推送到企业镜像仓库
    • 记录制品元数据(镜像名、Digest、构建时间、提交信息)
  • 安全
    • 构建阶段注入凭证,最终镜像不含凭证;启用镜像扫描

章节来源

  • file://bi-analysis/Makefile#L3-L3
  • file://bi-api-jushuitan/Makefile#L3-L3
  • file://bi-analysis/Dockerfile#L14-L18
  • file://bi-api-jushuitan/Dockerfile#L14-L18

Kubernetes部署与滚动更新

  • 部署清单
    • 使用ConfigMap注入部署环境,使用Secret注入认证信息
    • 设置资源请求与限制,保证节点调度与QoS
  • 滚动更新策略
    • 建议使用RollingUpdate(maxUnavailable=0或1,maxSurge=100%),确保零停机
    • 结合Readiness/Liveness探针,确保流量切换时机正确
  • 网关与路由
    • APISIX作为统一入口,结合Service暴露端口,支持灰度与蓝绿

图示来源

章节来源

  • file://bi-analysis/k8s/deployment.yaml#L17-L54
  • file://bi-api-jushuitan/k8s/deployment.yaml#L17-L56
  • file://bi-basic/k8s/deployment.yaml#L17-L51
  • file://bi-chat/k8s/deployment.yaml#L18-L55

环境管理与配置管理

  • 环境划分
    • 开发(dev)、测试(test)、预发布(uat)、生产(prod),每个环境独立命名空间与资源配额
  • 配置注入
    • 通过ConfigMap注入部署环境与通用配置,通过Secret注入敏感信息(如Nacos认证、第三方密钥)
  • 配置中心
    • Nacos作为配置中心,服务启动时拉取配置并热更新

章节来源

  • file://bi-analysis/k8s/deployment.yaml#L22-L36
  • file://bi-api-jushuitan/k8s/deployment.yaml#L22-L36
  • file://bi-basic/k8s/deployment.yaml#L22-L36
  • file://bi-chat/k8s/deployment.yaml#L27-L46
  • file://bi-common/registry/nacos/client.go#L1-L200

发布回滚与应急处理

  • 回滚策略
    • 通过kubectl rollout undo或指定历史镜像版本回退;建议保留最近3个版本
  • 应急处理
    • 快速降级:临时关闭高风险功能开关;限流与熔断:利用网关与服务侧熔断
    • 一键恢复:准备回滚脚本与配置快照

章节来源

  • file://scripts/deploy.sh#L1-L200
  • file://scripts/port-forward.sh#L1-L200

监控告警与部署后验证

  • 健康检查
    • 就绪探针与存活探针,确保流量仅在服务可用时接入
  • 指标与日志
    • Prometheus抓取指标,Grafana可视化;集中式日志收集与检索
  • 验证步骤
    • 部署完成后执行一次端到端验证(API网关可达、关键接口返回正常、探针就绪)

章节来源

  • file://bi-analysis/k8s/deployment.yaml#L47-L54
  • file://bi-api-jushuitan/k8s/deployment.yaml#L47-L56
  • file://bi-basic/k8s/deployment.yaml#L45-L51
  • file://bi-chat/k8s/deployment.yaml#L47-L55
  • file://bi-common/observability/logger/log.go#L1-L200

安全扫描与合规检查

  • 镜像安全
    • 构建后扫描基础镜像与依赖漏洞,阻断高危漏洞进入生产
  • 代码安全
    • 依赖扫描(ScaManga/OWASP Dependency-Check)、Secret检测(避免硬编码)
  • 合规
    • 供应链安全(SBOM)、许可证合规、最小权限原则

章节来源

  • file://bi-analysis/Dockerfile#L14-L18
  • file://bi-api-jushuitan/Dockerfile#L14-L18

多模块并行构建与依赖管理

  • 并行策略
    • CI中按模块并行构建,减少总耗时;模块间无强耦合时优先并行
  • 依赖管理
    • Go使用go.mod/go.sum;Python使用requirements.txt;前端使用package-lock.json/pnpm-lock.yaml
    • 统一代理与缓存,提升依赖解析速度

章节来源

  • file://bi-analysis/Makefile#L100-L104
  • file://bi-api-jushuitan/Makefile#L96-L100

依赖关系分析

公共库与各服务之间的依赖关系如下:

图示来源

章节来源

  • file://bi-analysis/Dockerfile#L1-L53
  • file://bi-api-jushuitan/Dockerfile#L1-L53
  • file://bi-api-leke/Dockerfile#L1-L53
  • file://bi-basic/Dockerfile#L1-L53
  • file://bi-chat/Dockerfile#L1-L38
  • file://bi-common/registry/nacos/client.go#L1-L200
  • file://bi-common/cache/redisx/client.go#L1-L200
  • file://bi-common/database/gormx/db.go#L1-L200
  • file://bi-common/database/starrocks/streamload/client.go#L1-L200
  • file://bi-common/mq/kafkax/consumer.go#L1-L200
  • file://bi-common/mq/kafkax/producer.go#L1-L200
  • file://bi-common/observability/logger/log.go#L1-L200

性能考虑

  • 构建性能
    • 使用多阶段构建与缓存层,减少重复下载依赖
    • 在CI中复用依赖缓存(Go Mod Cache、pip cache、node_modules缓存)
  • 运行性能
    • 合理设置CPU/Memory请求与限制,避免资源争抢
    • 使用连接池与异步处理,降低延迟
  • 网络与存储
    • StarRocks StreamLoad与Kafka分区数匹配并发,避免瓶颈

[本节为通用指导,无需“章节来源”]

故障排查指南

  • 镜像构建失败
    • 检查私有仓库凭证是否正确注入,确认代理与镜像源可用
  • Pod无法就绪
    • 查看就绪探针日志与返回值,确认端口与健康检查路径
  • 配置异常
    • 检查ConfigMap/Secret是否正确挂载,Key是否存在
  • 数据库/缓存连通性
    • 使用端口转发脚本进行快速验证
  • 定时任务
    • 检查CronJob调度与日志,确认依赖服务可用

章节来源

  • file://scripts/deploy.sh#L1-L200
  • file://scripts/port-forward.sh#L1-L200
  • file://bi-cron/k8s/cronjob.yaml#L1-L200
  • file://bi-common/database/gormx/db.go#L1-L200
  • file://bi-common/cache/redisx/client.go#L1-L200
  • file://bi-common/mq/kafkax/consumer.go#L1-L200
  • file://bi-common/mq/kafkax/producer.go#L1-L200

结论

通过标准化的Git工作流、严格的代码与安全检查、多模块并行构建、容器化与Kubernetes编排、完善的配置与监控体系,BI分析平台可以实现高效、可靠、可追溯的持续交付。建议在现有基础上补充CI流水线规范、镜像扫描、依赖审计与合规检查,进一步提升交付质量与安全性。

附录

  • 常用工具与配置参考
    • 网关配置(APISIX ConfigMap)用于统一路由与限流
    • Nacos客户端用于动态配置加载
    • 日志与指标组件用于可观测性
  • 脚本与辅助
    • 部署脚本与端口转发脚本用于联调与排障

章节来源

  • file://bi-intra/charts/apisix/templates/apisix-config-cm.yml#L1-L200
  • file://bi-common/registry/nacos/client.go#L1-L200
  • file://bi-common/observability/logger/log.go#L1-L200
  • file://scripts/deploy.sh#L1-L200
  • file://scripts/port-forward.sh#L1-L200