引子
因为公司的集成及发布流程太LOW,基本就是上个世纪的那一套,无论是部署还是开发集成都要为此花费大量精力。出了设计书,已经实现了完全自动化,无奈推广不利,好东西还是要运营啊,分享下设计书
目的
技术现状及痛点
如上图可见,从程序包分发出去开始,即由项目实施人员对程序包进行安装、部署。其中部署环境包括kafka/nginx/redis/jdk/mysql/grafana/influxdb等等。
产品的正常运行,还依赖各种配置文件的正确设置(如xml文件/properties文件/其它文件/db/等,需配置相应的ip/端口/名称/地址等),一旦有地方配置有误,运行报错,实施人员则需要反复检查相应的配置文件/环境配置是否正确。
若无法检查出问题,则还会需要找相应的开发人员寻找原因。这个过程对于实施人员是反复且痛苦的。
以上流程,若是通过手工执行,痛点有以下几点:
- 产品分发管理不规范:给了多少项目组使用,各项目使用的是什么版本
- 部署包传送麻烦:QQ/FTP
- 部署过程复杂
- 配置文件繁琐
- 配置容易出错
- 出错难定位问题
- 实施人员-开发人员耦合度高
预期目的
对于项目型应用,基于上述的痛点,本方案就是用于解决项目实施人员在部署时的遇到的问题,让实施人员部署应用时更简单,快捷,少配置,少错,易查。并节省开发时间,缩短频繁迭代所带来的调试和部署压力,将整个交付过程进度可视化,将人工干预成都降到最低。减轻部署压力,缩短部署时间,使应用可发布到任何流行的Linux机器或Windows 机器上。
自动监测源代码变更并通过构建、测试、打包和相关操作运行它们以生成可部署的版本并部署。
流程图
- 提交代码到代码仓库,根据tag区分代码版本
- 通过Webhook 触发自动构建
- Jenkins 触发构建构建任务,根据 Pipeline 脚本定义分步骤构建
- 先进行代码静态分析,单元测试
- 然后进行 Maven 构建(Java 项目)
- 根据构建结果构建 Docker 镜像,根据git tag生成镜像tag
- 推送 Docker 镜像到 Harbor 仓库,根据tag区分版本
- 触发更新服务阶段,使用 Helm 安装/更新 Release
- 查看服务是否更新成功。
软件系统技术方案设计
本项目是一个基于 Spring Boot、Spring cloud、React 和 python 构建的应用。
服务器方案设计
网络方案设计
设计原则
不改变/占用目标环境的网络环境
设计要点
- 容器的 IP 地址分配
- 容器之间的相互通信
方案设计
Docker host
方案描述
Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址。
方案设计理由
这种模式下的容器没有隔离的 network namespace
容器的 IP 地址同 Docker host 的 IP 地址
需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突
方案特点及优势
可与docker其他网络方式共存。
网络安全方案设计
依赖软件方案设计
依赖软件使用habor私有库进行镜像的版本管理,由公司维护自己的依赖软件。
名称 版本
软件
使用docker进行容器化,同时支持以下要求:
-
可配置性
支持配置 -
数据持久化
-
可扩展性
自开发软件方案设计
自开发软件
使用docker进行容器化,同时支持以下要求:
- 可配置性
可配置 - 数据持久化
日志/存储文件等保留到硬盘。
5 参考资料