方便用户快速了解和使用CICD管理系统,节省人工辅导成本。
1、锐明
备注:内部文档,禁止外传
| 序号 | 概要名词 | 说明 |
|---|---|---|
| 1 | CICD管理系统 | 面向研发、测试、运维等不同角色的综合平台,整合软件开发、测试和部署各阶段的繁琐流程。通过可视化、配置化、一键化操作,实现DevOps持续交付,提高研发效率、降低成本,并支持云环境与客户私有化部署,尽量减少人工干预。 |
| 2 | 私有化运维交付系统 | 针对运维及前线技术支持/专家设计,按环境维度管理客户局点。该系统从 CICD管理系统 获取发布后的中间件或业务组件包,支持安装、升级、变量同步等运维操作,确保产品部署后达到就绪状态 |
| 3 | 客户交付系统 | 集中管理所有客户的部署模型信息,对接开发内部的统一网关和用户中心,与运营平台打通。同时联动 私有化运维交付系统,实现从部署模型配置到日常运维的全流程一站式管理 |
| 4 | OMS | 为「Operation and Maintenance System」的缩写, 专职负责部署工作. OMS = OMS Server + OMSlet |
| 5 | CDS | 为「Customer Delivery System」的缩写, 客户交付系统系统 |
| 6 | cicd-web | CICD管理系统 的前端组件,负责展示及交互。 |
| 7 | cicd-server | CICD管理系统 的后端组件,通过HTTP接口为 cicd-web 提供服务,主要负责基础信息管理,采用Java开发。 |
| 8 | oms-server | 被 CICD管理系统 和 私有化运维交付系统 共用。它提供HTTP接口,负责运维部署动作的编排与执行,上游对接 cicd-server 和 custom-server,采用Python开发。 |
| 9 | oms-let | 安装在目标机上的轻量级代理,封装Shell脚本、加固系统配置,并负责部分常用软件包的安装。通过HTTP接口接收OMS Server下发的命令,采用Shell脚本开发。 |
| 10 | host-baseline | 安装在目标机上, 提供系统级文件, 尽可能屏蔽系统差异. 无运行态, 开发语言: Shell. |
| 11 | cicd-document-web | CICD管理系统 的帮助文档, 属于前端组件。 |
| 12 | jenkins | 专用于 CICD管理系统, 利用其Pipeline Job承接流水线的sonar扫描、编译构建、组装包、发版及代码覆盖率等任务. |
| 13 | COS | CICD管理系统 中的物料库,使用腾讯云的cos对象存储,统一存放组件包,项目版本包,流水线集成包,证书文件等. |
CICD管理系统 由5个逻辑组件组成,如下:
CICD管理系统: 有单独的web管理界面配套, 云环境下的操作入口。
Jenkins: 负责实际的流水线执行, 输出物料(即包文件)。
物料库: 统一存放物料(一般为构建好的包文件)。
OMS Server: 运维管理系统的服务端, 单独剥离运行以兼容云环境&客户私有化环境的部署。
Machine XXX: 具体部署业务组件的机器节点, 与OMS Server配套使用。
各逻辑组件的关系如图:


CICD管理系统 作为整个解决方案系统门户,提供可视化、可编排的CI/CD持续交付软件生产线,实现DevOps持续交付高效自动化,缩短应用开发到市场交付周期,提升研发效率。
流水线服务本质上是一个可视化的自动化任务调度平台,需要配合服务器中编译构建、代码检查、测试、部署等服务的自动化任务使用。根据需要的场景,如开发测试环境应用部署、生产环境应用部署等,对这些自动化任务进行自定义编排,一次配置后就可以一键自动化触发调度执行,避免频繁低效的手工操作。

如下,以mms组件接入示例 1.代码新增cicd/descriptor.yml,参考5.3.1 组件描述符

2.代码新增cicd/compile_dependency.yml,参考5.3.8 依赖项

3.代码新增cicd/nacos/mms_application.properties

4.代码新增cicd/mariadb/init_s17_mms.sql

5.代码新增cicd/assemble.sh

注:assemble.sh的组件名(COMPONENT_NAME)及组件版本号(COMPONENT_VERSION可使用 $1,$2来代替。$1,$2值在jenkins 构建时注入,$1="mms",$2="V3.0.15",需要注意最终与编译文件名称是否匹配。
如下,以djms组件接入示例
1.代码新增cicd/descriptor.yml,参考5.3.1 组件描述符
说明:组件描述符中集群变量可参考原package_define.yml集群变量

2.代码新增cicd/nacos/djms_application.properties(使用规则可参考5.3.3 Nacos初始化)

3.代码新增cicd/mariadb/init_s17_djms.sql(数据库初始化脚本,可参考5.3.2 数据库初始化)

4.调整assemble.xml配置

5.调整maven打包后压缩包名称, 规范: ${组件名}-${组件版本}.tar.gz, eg: djms-3.0.15.2-SNAPSHOT.tar.gz

6.代码新增 cicd/assemble.sh(打包脚本,java中仅做组件包的拷贝,打包由maven完成,拷贝组件包到指定文件夹以满足对接规范)

assemble.sh示例
如下,以cicd-web组件接入示例
1.项目内添加config.ini.j2、config.runtime.js.template.j2文件\
config.ini.j2:对应原有的config.ini文件。原有config.ini由jenkins打包时前端脚本生成,对接cicd后config.ini文件将由cicd通过config.ini.j2模板生成。

2.config.runtime.js.template.j2:对应原有的config.runtime.js.template文件

3.添加script脚本(采用原有前端项目jenkins工作空间中的通用脚本)

4.添加cicd文件夹。内容包含组件描述符descriptor.yml和打包脚本assemble.sh
组件描述符descriptor.yml

5.打包脚本assemble.sh

注:assemble.sh的组件名(COMPONENT_NAME)及组件版本号(COMPONENT_VERSION可使用 $1,$2来代替。$1,$2值在jenkins 构建时注入,$1="cicd-web",$2="V1.0.3",需要注意最终与编译文件名称是否匹配。
1、基于目标版本拉取对接分支
示例:
基于对接版本拉新分支 fms目标分支: V3.15.5-cicd 原分支(对接版本): 3.0.15.5

2、合并上次对接分支代码
主要合并cicd文件夹

3、修改打包脚本文件中版本号
文件路径:cicd\assemble.sh

1、基于目标版本拉取对接分支
示例:
基于对接版本拉新分支 fms目标分支: V3.15.5-cicd 原分支(对接版本): 3.0.15.5

2.合并上次对接分支代码
主要合并cicd文件夹和assembly.xml

如存在${组件名}_application.properties文件配置变更,直接替换。
目标文件路径:cicd\nacos${组件名}_application.properties

3.修改打包脚本文件中版本号
文件路径:cicd\assemble.sh

4.sql文件调整 说明:sql文件存储路径cicd\mariadb
init_${数据库名}_fms.sql:数据库初始化文件,对应descriptor.yml中的mariadb_config
update_${版本号}.sql:对应某个版本的sql变动文件,如该版本无sql变更则无需创建该文件(本次对接的版本与上次cicd对接版本若存在sql变更,两个版本期间的所有sql变更合并为一个sql文件,统一命名为update_${当前对接的版本号}.sql)
实例:

1.界面新建团队(已有团队则跳过)

2.界面新建组件

3.界面新建组件版本

CICD内部逻辑宏观上分为三个大步骤: 基础信息配置、打包 及 部署, 每一步都需要遵循相应的规范. 组件包文件涉及规范的目录结构如下:(详细解释参考下述章节)
流水线的输入源均为 组件, 组件的获取目前强制从git仓库拉取. 因此前置web界面中必须正确配置:
1). git地址, 操作入口: 版本管理 -> 组件管理
操作界面参考: 使用手册 4.3.1
2). git分支, 操作入口: 版本管理 -> 组件版本管理
操作界面参考: 使用手册 4.5.1
CICD在构建时提供了上下文文件供业务组件作为构建参数使用:
1、jenkins构建时,会在目标项目代码顶层目录同级追加文件cicd_output/context_info.txt
2、context_info.txt内容:
3、jenkins构建临时目录完整示例:/iotp/data/cicd_custom_workspace/pipelineEnvCmpId_10092/git_source_code/cicd_output/context_info.txt
不同语言类型的项目, 其打包方式不一样. 如 Java、Node 均有成熟的版本依赖以及打包工具, 而 C++ 类型项目需要手动配置头文件及依赖的库文件.
因此对于CICD系统, 在打包环节不会限制具体的使用方式, 仅在拉取git代码并构建后, 配合界面流水线流程配置中的打包任务即 组装组件包, 才会最终生成组件包文件.
组装组件包 任务内会固定调用相对(git代码仓库)路径为 cicd/assemble.sh 的shell文件, 输出的组件包文件也放至cicd文件夹内, 名称及类型为: $\{组件名称\}-$\{组件版本号名称\}.tar.gz.
Note: 打包好的组件包文件会存放至物料库, OMS-Server 做实际的部署操作时内部会自行根据部署描述符转换为物料坐标, 根据物料坐标从物料库获取组件包文件.
组件描述符文件相对路径为 $\{根目录\}/cicd/descriptor.yml, 其作用是统一记录对接cicd过程中需要配置的信息(需涵盖老CICD的 local_package_define.yml 和 package_define.yml 两个文件的配置,国产化配置也维护到此文件), 格式为yml. 示例:
必填, 预留字段, 用于标识组件描述符的版本. 目前固定取值为 v1
必填, 用于区分是 部署描述符 还是 组件描述符. 组件描述符取值固定为 Component Note: 部署描述符为 cicd-server 与 OMS-Server 之间交互的数据, 对于接入方无需关注.
必填, 标识当前组件属于三级研发的哪一层, 取值范围(大小写敏感): env - 环境/中间件, base - 基础组件, standard - 行业标准组件, custom - 行业定制组件
必填, 组件名称. 必须与界面配置的组件名称相同
选填, 依赖的中间件列表. 每项指定中间件名称(name)及版本(version), 具体填写内容可在界面参考”CICD团队”内的组件. OMS-Server在部署过程中, 会对组件描述符中所声明的中间件依赖项, 以及界面中项目所关联的组件来做匹配逻辑, 当且仅当两边声明一致时才会自动安装所依赖的中间件. 目前支持的中间件如下:
| 名称 / name | 版本 / version | 备注 |
|---|---|---|
| database(mariadb) | V10.5.15 | 数据库依赖后续统一写database,不写具体的数据库名称,已有组件依赖的mariadb无需改动cicd自动适配。 应用场景:中间件环境部署的mysql/dmserver时,cicd校验依赖中间件时将自动适配为校验mysql/dmserver是否已安装。 |
| nacos | V2.2.3 | 支持X86/ARM双架构架构中间件 控制台默认账户密码: nacos/IOTP-socan#2970 |
| V2.2.3 | ||
| redis | V6.2.6 | 支持X86/ARM双架构架构中间件 |
| redis-sentinel | V6.2.6 | 支持X86/ARM双架构架构中间件 |
| zookeeper | V3.8.4 | 支持X86/ARM双架构架构中间件 |
| kafka | V3.7.1 | 支持X86/ARM双架构架构中间件 |
| nginx | V17.239.58 | 支持X86/ARM双架构架构中间件 |
| clickhouse-server | V22.2.3.5 | 支持X86/ARM双架构架构中间件 |
| minio | V2023-02-27 | |
| node | V10.24.0 | 支持X86/ARM双架构架构中间件 |
| assets-engine | V2.0.0 | 支持X86/ARM双架构架构中间件 |
| flink | V1.13.6 | |
| milvus | V2.3.10 | |
| vsftpd | V3.0.2 | |
| dmserver | V8.0.0 | ARM架构中间件 |
| admq | V3.0.5 | ARM架构中间件 |
说明:为以往的mariadb_config功能迁移,是数据库初始化信息(不具体到实际的数据库中间件),同时兼容以往的mariadb_config,已有组件可不做调整。
选填, 声明需要执行的数据库初始化信息。
dm_user: 组件在运行过程中, 程序内访问达梦数据库的用户(非必填,若为空则使用user完成达梦数据库的用户创建及赋权),切记不是root用户
user: 组件在运行过程中, 程序内访问数据库的用户,切记不是root用户
password: 组件在运行过程中, 程序内访问数据库的密码,根据安全规范,请使用jasypt加密字符串(目前已支持数据库密文密码), 切记不是root用户的密码
database: 组件在运行过程中,程序内需要访问的数据库schema名称(对用户做此数据库的赋权操作,同时做数据库初始化), 支持多个数据库(但不推荐).
grant_database: 组件在运行过程中,程序内需要访问的数据库schema名称(对用户做此数据库的赋权操作,同时做数据库初始化), 支持多个数据库(但不推荐).
OMS Server根据上述四个配置项在Mariadb中创建数据库以及用户操作, 每个数据库允许额外指定其空库时的初始化sql, 具体参考下述章节 5.3.2 数据库初始化
选填, 声明需要执行的nacos初始化信息.
mode: 标识以何种模式执行, 取值范围: generated、custom. 不同模式的初始化逻辑不同, 具体参考下述章节 5.3.3 Nacos初始化
选填, 声明需要做jinja2模板替换的文件路径, 相对于打包文件的根目录. 模板文件详情参考下述章节 5.3.6 模板文件
选填, 声明集群&&实例变量, 每个变量有3个必填元素: name、desc、value. 取值均为字符串内容, 其中value除字面量值外, 还支持 变量表达式、变量函数写法, 详细函数说明参考下述章节 5.3.7 变量
使用集群变量的场景包括:
jinja2模板文件的替换
nacos初始化(在 generated 模式下), ${componentName}.properties 文件内容的生成, 每一个集群变量都会转换为文件中的KV配置项
使用实例变量的场景包括:
jinja2模板文件的替换
nacos初始化(在 generated 模式下), ${componentName}_${ip}.properties 文件内容的生成, 每一个实例变量都会转换为文件中的KV配置项
Note: 对于大部分程序, 集群中每个实例都会使用相同的配置内容, 因此无需配置instance_variable. 仅当各个实例的确需要配置不同的内容时才使用, 如: 设备接入端相关程序需要配置实例所运行机器的ip地址.
选填, 声明需要执行的clickhouse初始化信息 database:组件在运行过程中,程序内需要访问的数据库schema名称, 支持多个数据库. Clickhouse初始化逻辑参考下述章节 5.3.4 Clickhouse初始化
选填, 声明需要开放防火墙端口的白名单
示例:
spec.ports.name不能与spec.cluster_variables.name同名
spec.ports.value中的引用name必须与spec.cluster_variables.name一致
spec.ports.value中的引用name在spec.cluster_variables中必须存在
完整的数据库初始化包含: 建库 + 建用户 + 授权访问 + 空库初始化.
【建库】 和【建用户】已在组件描述符 spec.mariadb_config(或database_config) 声明
【授权访问】由OMS Server负责
【空库初始化】需由接入方将sql文件(该文件囊括了空库的全量初始化逻辑, e.g: 建表、建索引、预置数据等)放置约定的路径:
$\{根目录\}/cicd/mariadb/init_$\{数据库名\}.sql$\{根目录\}/cicd/dmserver/init_$\{数据库名\}.sqlOMS Server 内部会统一将上述4个步骤合并输出为一个临时sql文件, 并在数据库服务的master节点做本地执行. 合并后的示例sql文件(为兼容mysql8.0语法,建用户建表语句已更新)内容示例如下:
组件描述符部分示例

完整的Nacos初始化包含: (组件描述符中)指定初始化模式 + 指定配置文件
generated模式(默认值)兼容现有ansible框架下的接入规范,标识由 OMS Server自动创建namespace、group、dataId 以及组件内的config/bootstrap.properties文件.
推导规则: namespace对应团队标识, group对应组件名称, dataId分为四类:
${componentName}_application.properties 组件给定, 文件路径位置: ${打包根目录}/cicd/nacos/xxx_application.properties. 安装/升级时始终覆盖.${componentName}_base.properties 依据组件描述符中所声明的集群变量 cluster_variables 生成. 安装/升级时始终覆盖.${componentName}_update.properties 记录运维过程中变更的KV. 仅会在Nacos控制台不存在时创建, 已存在时忽略.${componentName}_${ip}.properties 依据组件描述符中所声明的实例变量 instance_variables 生成. 仅会在Nacos控制台不存在时创建, 已存在时忽略.bootstrap.properties 文件内容, 由 OMS Server 按固定模板生成, 随后放至路径: ${根目录}/config/bootstrap.properties. 生成示例内容:

标识由组件自身指定namespace、group以及dataId的创建, 采用文件系统来组织, 规则: ${根目录}/cicd/nacos/${namespace}/${group}/${dataId}.properties
其中 ${dataId}.properties 可为j2模板文件, 以支持变量替换. 同时该模式下, bootstrap.properties 也不再生成, 需要接入方自行指定(可按j2模板文件给定, 关于jinja2模板参考下述章节 5.3.6). 示例:


组件描述符部分示例

Clickhouse目前的初始化仅支持建表建库,OMS Server 仅负责将接入方指定的【建库】和【建表】脚本进行合并,然后统一执行初始化
完整的ck数据库初始化包含: 建库 + 空库初始化.
【建库】 在组件描述符 spec.clickhouse_config 声明
【空库初始化】需由接入方将sql文件(该文件囊括了空库的全量初始化逻辑放置约定的路径: ${根目录}/cicd/clickhouse/init_clickhouse_${数据库名}.sql
OMS Server 内部会统一将上述2个步骤合并输出为一个临时sql文件, 并在clickhouse的master节点做本地执行. 合并后的示例sql文件内容如下:
组件描述符部分示例

JVM初始化配置是通过jinja2模板的形式完成;使用时通过在前端界面定义环境变量,实现在jinja2模板中动态替换引用变量: 如dcs中的jvm动态配置
descriptor.yml 文档中定义模板文件位置,定义环境变量配置
descriptor.yml 文件中的变量

模板文件主要解决的问题是: 代码级别无法确定其配置值, 需要根据部署的 主机/环境/方式 来动态确定.
OMS Server 目前支持Jinja2模板语法, 不限定模板文件的位置及使用场景, 仅会基于变量源(参考下述章节 5.3.7.1 )做文件的生成动作. 凡是要做变量替换的文件均可以此方式支持, 只需在 组件描述符 中列举出完尽的模板文件.
模板文件名无限制, 但文件后缀强制为”.j2”. 生成后会在相同位置输出移除 .j2 后缀的文件, 且原模板文件会被删除. 如:${根目录}/config/bootstrap.properties.j2 生成后变为 ${根目录}/config/bootstrap.properties`
详尽的Jinja2模板文件语法可参考官网: https://jinja.palletsprojects.com/en/stable/
组件描述符部分示例

变量服务于模板文件的生成以及nacos配置文件内容的生成.
整个 CICD管理系统 内, 有如下几处变量源, 优先级从低到高依次为(相同key的配置值高优先级覆盖低优先级):
| 变量源 | 配置入口 | 作用 | 备注 |
|---|---|---|---|
| 集群变量 | git仓库 -> 组件描述符 | 声明服务于集群的变量. | 支持 字面量值、变量函数 |
| 实例变量 | git仓库 -> 组件描述符 | 声明服务于单个实例的变量. | 支持 字面量值、变量函数 |
| 环境变量 | web界面 -> 环境管理 -> 环境变量 | 声明环境级别的变量,一般由各项目版本的开发人员添加. | 配置时可指定 适用于组件 |
| 预定义变量 | 无法配置, OMS Server内部指定 | 通常包含当前主机IP、依赖的中间件地址等信息. 此类信息的特点是必须在部署时才能确定, 无法提前给出 | 不支持界面自定义 |
OMS Server在部署过程中基于变量源汇总的KV做模板生成逻辑.
若nacos初始化模式为generated, 那么 集群变量 会额外推送至nacos存储.
对于业务组件, 集群变量 通常会指定诸如mysql、redis等三方中间件的地址, 此类信息无法提前在组件描述符 descriptor.yml 中指定, 而组件描述符本身又不能以jinja2方式给定. 因此引入变量函数来占位, 实际取值会根据函数计算结果得出, 示例:

目前支持的函数(大小写敏感)包括:
| 函数名 | 函数作用 | 函数参数 | 示例/说明 | 贴图 |
|---|---|---|---|---|
| env | 获取依赖的中间件信息 | 参数个数固定为两个, 参数1标识中间件, 参数2标识中间件的信息key(可选的参数信息参考下表) | env(mariadb,master_ip) | ![]() |
| local_ip | 获取当前机器ip | 无 | local_ip() 该函数仅作用于实例级别变量 | ![]() |
| south_ip | 获取当前主机所配置的南向IP, 未配置时取当前机器ip(即local_ip函数结果) | 无 | south_ip() 该函数仅作用于实例级别变量 | ![]() |
| north_ip | 获取当前主机所配置的北向IP, 未配置时取当前机器ip(即local_ip函数结果) | 无 | south_ip() 该函数仅作用于实例级别变量 | |
| deployment_mode | 获取部署模式(单机为0,集群为1) | 无 | deployment_mode() | ![]() |
| optional | 获取可选中间件信息(若指定中间件未安装则返回空字符串) | 参数个数固定为两个 参数1标识中间件 参数2标识中间件的信息key (可选的参数信息参考下方optional表) | optional(minio,addresses) | ![]() |
| default | 获取界面配置的环境变量,若未配置则取默认值 | 参数个数固定为两个 参数1标识界面配置的变量名 参数2标识变量默认值Note: 变量名, 只能包含数字,下划线,中横线,字母 且 只能用下划线或字母开头 | default(component_name,dcs) 为支持默认值复杂value,default支持第二种写法参数2变量默认值通过双引号修饰,将双引号中的字符串认定为一个值 'default(component_name,"dc##,,,&*%^%^s")' | ![]() |
| env_cert | 获取证书配置,若未配置则取默认值 | 参数个数固定为两个 参数1标识证书相关的key 参数2标识变量默认值 (可选的参数信息参考下方env_cert表) | env_cert(key_path,/iotp/network/cert/s17.key) | ![]() |
| optional_storage | 获取存储配置(变量来源中间件配置和环境变量) | 参数个数固定为两个 参数1标识cicd预定义的变量名,当前仅支持cicd_storage_app_id 参数2标识变量默认值 | optional_storage(cicd_storage_app_id, 20210101) | ![]() |
| optional_dependency_value | 依赖服务变量读取函数 | 使用该函数需提前在cicd系统中配置组件的依赖关系,以贴图为例,需先配置ms依赖服务为mdgw, 使用该函数的取值顺序如下 1、判断环境mdgw服务是否部署,存在则取mdgw集群变量中的intranet.proxy.http.port参数 2、若mdgw未部署则取ms服务上下文变量中的intranet.http.hls.port参数 3、若ms服务上下文变量中的intranet.http.hls.port参数不存在,则取默认参数21240 | optional_dependency_value(“依赖服务名”,“依赖服务集群变量取值项”,“上下文变量取值项”,默认参数) | ![]() |
env函数支持的中间件及其信息key为:
| 中间件标识 | 信息key | 作用&类型 | 示例&说明 |
|---|---|---|---|
| database(mariadb) | master_ip | 数据库主节点IP(mha部署时为虚拟ip; 不区分类型, mysql/mariadb/dmserver通用) 字符串 | “192.168.132.15” 推荐使用env(database, master_ip),已有组件兼容env(mariadb, master_ip) |
| port | 数据库端口(不区分类型, mysql/mariadb/dmserver通用) 整型 | 13306 推荐使用env(database, port),已有组件兼容env(mariadb, port) | |
| all_ips | 数据库全部节点ip(不区分类型, mysql/mariadb/dmserver通用) 字符串数组 | [ “192.168.132.15”, “192.168.132.16”, “192.168.132.17” ] 推荐使用env(database, all_ips),已有组件兼容env(mariadb, all_ips) | |
| redis | master_ip | 主节点IP 字符串 | “192.168.132.15” |
| port | 端口 整型 | 16379 | |
| all_ips | 全部节点ip 字符串数组 | [ “192.168.132.15”, “192.168.132.16”, “192.168.132.17” ] | |
| mode | 部署模式 整型 | 单机-0, 集群(哨兵)-1 | |
| addresses | 集群地址 字符串 | “192.168.1.100:16379,192.168.1.101:16379” | |
| nacos | port | 端口 整型 | 21980 |
| all_ips | 全部节点ip 字符串数组 | [ “192.168.132.15”, “192.168.132.16”, “192.168.132.17” ] | |
| addresses | 集群地址 字符串 | “192.168.1.100:21980,192.168.1.101:21980” | |
| kafka | port | 消息中间件端口(admq/kafka通用) 整型 | 16379 |
| addresses | 消息中间件集群地址(admq/kafka通用) 字符串 | “192.168.1.100:19092,192.168.1.101:19092” | |
| clickhouse | port | 端口 整型 | 18123 |
| addresses | 集群地址 字符串 | “192.168.1.100:18123,192.168.1.101:18123” | |
| all_addresses | 全部集群地址 字符串 | “192.168.1.100:18123,192.168.1.101:18123” | |
| master_ip | 主节点IP 字符串 | “192.168.132.15” | |
| clickhouse_user | 用户名 字符串 | default | |
| clickhouse_password_plaintext | 明文密码 字符串 | 仅做示例, 不可使用 ST-esuohkcilc | |
| clickhouse_password_ciphertext | 密文密码 字符串 | 仅做示例, 不可使用 e653e07d52a090f3293524add62ba5 | |
| flink | port | 端口 整型 | 18081 |
| addresses | 集群地址 字符串 | “192.168.1.100:18081,192.168.1.101:18081” | |
| assets-engine | master_ip | 逻辑上的主节点 字符串 | 192.168.132.1 |
| node_port | 服务端口 整型 | 20600 | |
| nginx_port | nginx映射端口 整型 | 20601 | |
| addresses | 全量地址 字符串 | 192.168.132.1:20600,192.168.132.2:20600 | |
| zookeeper | addresses | 全量地址 字符串 | 192.168.1.1:12181,192.168.1.2:12181,192.168.1.3:12181 |
| milvus | master_ip | 主节点IP 字符串 | 192.168.132.172 |
| port | 端口 整型 | 19530 |
optional函数支持的中间件及其信息key为:
说明:oci存储时config.ini文件内需要填写pem证书文件路径,此路径固定为(config文件也将存放在此路径下):/iotp/cloud_config/oci/${pem文件名称}
| 中间件标识 | 信息key | 作用&类型 | 示例&说明 |
|---|---|---|---|
| minio | addresses | 集群地址 字符串 | “192.168.0.1:21186,192.168.0.2:21186” |
| port | 端口 整型 | 21187 | |
| cos | region | cos.public.region 字符串 | ap-guangzhou |
| access_key | cos.public.access.key 字符串 | AKIDZx4vzseorfCSSxGYzoPr | |
| secret_key | cos.public.secret.key 字符串 | GFBrIbXCbldEYcePt5 | |
| oss | addresses | oss地址 字符串 | 192.168.132.171:9999 |
| access_key | oss.public.access.key 字符串 | AKIDZx4vzseorfCSSxGYzoPr | |
| secret_key | oss.public.secret.key 字符串 | GFBrIbXCbldEYcePt5 | |
| obs | addresses | obs地址 字符串 | 192.168.132.171:9999 |
| region | obs.public.region 字符串 | ap-guangzhou | |
| access_key | obs.public.access.key 字符串 | AKIDZx4vzseorfCSSxGYzoPr | |
| secret_key | obs.public.secret.key 字符串 | GFBrIbXCbldEYcePt5 | |
| oci | config_path | oci config配置文件存放路径 字符串 | /iotp/cloud_config/oci/config.ini |
| access_key | oci.public.access.key 字符串 | AKIDZx4vzseorfCSSxGYzoPr | |
| secret_key | oci.public.secret.key 字符串 | GFBrIbXCbldEYcePt5 |
env_cert函数支持的key和推荐default值为:
| 证书Key | 默认值 | 作用&类型 |
|---|---|---|
| pfx_path | /iotp/network/nginx/platform.pfx | pfx证书路径 |
| key_path | /iotp/network/nginx/platform.key | pem私钥路径 |
| pem_path | /iotp/network/nginx/platform.pem | pem公钥路径 |
| pfx_key_store_password | ENC#iiU2enuvCjiBhkXr2BMIzpKoF1aGW+yx# | pfx容器密码 |
| pfx_key_alias | alias | 证书别名 |
| pfx_key_password | TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256,ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384,ECDHE-ECDSA-CHACHA20-POLY1305,ECDHE-RSA-CHACHA20-POLY1305 | 证书密码 |
为支持环境变量、集群变量同级间相互引用,特引入 变量表达式 写法(同时兼容原有写法直接填变量值或变量函数):
变量表达式规则:变量表达式整体通过 f"xxx"修饰,以 f"开头、"结尾 作为是否是变量表达式的判定依据。
在 f"xxx" 中支持直接写变量值,也支持通过 ${} 去修饰一个变量名,解析时会将 ${} 中字符串作为一个变量名在同等级的变量中寻找同名变量并做值替换。
| 作用域 | 应用场景 | 环境变量配置 | 变量表达式 | 处理后的变量值 |
|---|---|---|---|---|
| 环境变量 | 引用其他环境变量 | ![]() | f"${cicd_variable}" | cicd_variable1=streamax_value |
| 仅变量值的表达式写法 | ![]() | f"cicd_value" | cicd_variable2=cicd_value | |
| 变量值与环境变量混用 | ![]() | f"http://${cicd_variable}:${cicd_variable2}" | cicd_variable3=http://streamax_value:cicd_value | |
| 传递型环境变量 | ![]() | f"http:${cicd_variable1}" | cicd_variable3=streamax_value | |
| 集群变量 | 引用其他集群变量 | ![]() | 'f"${cicd.variable1}"' | cicd.variable3=cicd_value |
| 仅变量值的表达式写法 | ![]() | 'f"cicd_value"' | cicd.variable1=cicd_value | |
| 变量值与集群变量混用 | ![]() | 'f"${cicd.variable1}####"' | cicd.variable2=cicd_value#### | |
| 传递型集群变量 | ![]() | 'f"http:${cicd.variable2}"' | cicd.variable4=http:cicd_value#### |
注意:集群变量不支持表达式跟变量函数混用,若此场景,将需要用变量函数配置的部分单独抽成一个独立的集群变量
错误写法:直接在变量表达式中写env(mariadb,master_ip)函数获取mariadb主节点ip

正确写法:将env(mariadb,master_ip)函数单独写为一个变量的value,同时变量函数引用新加的mariadb变量名,如下:

预定义变量服务于模板文件 + 变量函数, 目前支持的预定义变量如下:
| 变量Key | 说明 | 示例(示例值均包含类型信息, 如带双引号的为字符串) |
|---|---|---|
| _first_index_ip | 主机列表索引第一的主机ip | “192.168.1.100” |
| _instance_index | 标识某个组件(在某次任务单中)在对应集群中的索引, 从1开始 | 1 |
| _host_ip | 标识当前主机的ip地址 | “192.168.1.100” |
| _instance_qty | 标识当前组件(集群下)总计多少实例 | 3 |
| _cluster_host_ips | 标识当前组件(集群下)所有的实例IP, 类型为JSON数组形式 | ["192.168.1.100", "192.168.1.101", "192.168.1.102"] |
| _kafka_all_ips | 标识当前任务单中部署kafka的全量ip | ["192.168.1.100", "192.168.1.101", "192.168.1.102"] |
| _kafka_port | 标识kafka的监听端口 | 19092 |
| _kafka_addresses | kafka集群的地址 | "192.168.1.100:19092,192.168.1.111:19092" |
| _zookeeper_all_ips | 标识当前任务单中部署zookeeper的全量ip | ["192.168.1.100", "192.168.1.101", "192.168.1.102"] |
| _zookeeper_port | 标识zookeeper的监听端口 | 12181 |
| _mariadb_master_ip | 标识当前任务单中数据库的master ip | "192.168.1.101" |
| _mariadb_all_ips | 标识当前任务单中部署数据库的全量ip | ["192.168.1.100", "192.168.1.101", "192.168.1.102"] |
| _mariadb_port | 标识mariadb的监听端口 | 13306 |
| _redis_all_ips | 标识当前任务单中部署Redis的全量ip | ["192.168.1.100", "192.168.1.101", "192.168.1.102"] |
| _redis_port | 标识redis的监听端口 | 16379 |
| _redis_mode | 标识redis的模式, 取值范围: 单机-0, 集群(哨兵)-1 | 0 |
| _redis_addresses | redis集群的地址 | "192.168.1.100:16379,192.168.1.111:16379" |
| _nacos_all_ips | 标识当前任务单中部署nacos的全量ip | ["192.168.1.100", "192.168.1.101", "192.168.1.102"] |
| _nacos_port | 标识nacos的监听端口 | 21980 |
| _nacos_addresses | nacos集群的访问地址 | “192.168.0.1:21980,192.168.0.2:21980” |
| _clickhouse_all_ips | 当前任务单中部署clickhouse的全量ip | ["192.168.1.100", "192.168.1.101", "192.168.1.102"] |
| _clickhouse_port | clickhouse的监听端口 | 19000 |
| _clickhouse_addresses | clickhouse集群的访问地址 | "192.168.0.1:19000,192.168.0.2:19000" |
| _clickhouse_user | clickhouse用户 | default |
| _clickhouse_password_plaintext | clickhouse明文密码 | "ST-esuohkcilc" |
| _clickhouse_password_ciphertext | clickhouse密文密码 | "653e07d52a090f3293524ad" |
| _nginx_all_ips | 标识当前任务单中部署nginx的全量ip | ["192.168.1.100", "192.168.1.101", "192.168.1.102"] |
| _prometheus_all_ips | 标识当前任务单中部署prometheus的全量ip | ["192.168.1.100", "192.168.1.101", "192.168.1.102"] |
| cicd_storage_app_id | cicd预定义的存储app_id:标识当前任务单中的APPID(当前规则:预定义的变量cos_app_id > 界面填写的cicd_storage_app_id) | "2018081019" |
| cos_app_id | cos云存储的app_id | 2018081020 |
组件描述符部分示例

S17 C++项目在编译/运行时会额外依赖头文件、静态库或动态库, 这些依赖项来源于内部公共库 或 下载的第三方库. 为解决依赖项问题, 统一在文件 cicd/compile_dependency.yml 中声明全量的依赖项,每个依赖项也采用git管理. 在编译业务组件时, 会自动解析该文件, 按需递归编译依赖项.
编译过程中的目录固定为 cicd_compile, 每次编译前会予以清空. 编译后依赖项的输出固定为 cicd_output, 其中又按照依赖项的ID来组织. 接入方的打包脚本 cicd/assemble.sh 可按需拷贝相关库文件. 关于S17 C++项目编译说明可参考:
以mms为例, 最终编译成功后的目录结构如下:

依赖声明文件 compile_dependency.yml 示例:
约定:本套工具主要由 oms-let 完成,需要业务组件支持相关脚本的支持,为减少业务层相关脚本的开发工作,尽量少的改动业务组件,本套工具对接,与原有ansibleCICD系统基本保持一致,包括安装(install.sh)、启动(start.sh)、停止(stop.sh)、健康检查(health.sh)、守护(guard.sh)、卸载(uninstall.sh). oms-let 仅做对应脚本工具的调用操作,具体内部逻辑由服务组件脚本完成, 服务组件需注册为systemd自定义服务.
CICD-V1.1.1 版本后,支持组件在构建时自动集成最新的运维脚本,包括bin目录下脚本和script目录下脚本。
运维现有脚本文件及结构

组件未发布且使用jenkins进行构建时;
替换数据来源script脚本、bin脚本
替换规则
以java工程为例, 替换脚本统一会放到以下目录,需要自查assembly

调用各组件目录下的 install.sh, 完整路径为: $svc_name/script/install.sh
调用示例:
调用各组件目录下的 start.sh, 完整路径为: $svc_name/script/start.sh
调用示例:
调用各组件目录下的 stop.sh, 完整路径为: $svc_name/script/stop.sh
调用示例:
调用各组件目录下的 guard.sh, 完整路径为: $svc_name/script/guard.sh
调用示例:
调用各组件目录下的 uninstall.sh, 完整路径为: $svc_name/script/uninstall.sh
调用示例:
调用各组件目录下的 health.sh, 完整路径为: $svc_name/script/health.sh
health.sh示例:
调用各组件目录下的 pid.sh, 完整路径为: $svc_name/script/pid.sh
pid.sh示例:
CICD以 中台SPI 为契机, 提供通用文件操作, 辅助各团队尽可能将部署步骤自动化, 使用方式为:
cicd/descriptor.yml 内声明该组件在部署时需要执行的文件删除、文件拷贝动作仍然以 中台SPI 使用场景为例, 对应的组件描述符内 file_operations 内容如下(每个字段的作用参考对应的字段备注):
cicd/descriptor.yml 中文件操作相关字段, 未按规定编写时, 前置Jekins编译时阻断组件描述符 内声明的策略来执行.e.g:
组件A在其
组件描述符内声明, 将包内的文件 "./libs/demo.tar.gz" 拷贝至中间件mariadb所在全部机器的指定路径 "/iotp/data/env/mariadb/abc.tar.gz"对于以下情况, 程序都不会单独校验:
1). 中间件环境数据不包含mariadb
2). 中间件环境数据包含mariadb, 且是自建, 但未安装成功
3). 中间件环境数据包含mariadb, 但是云中间件
4). 中间件mariadb所在机器父级目录 /iotp/data/env/mariadb/ 不存在
均按照 yaml 中字段 "on_target_path_not_exists" 声明的策略来执行
CICD服务统一优先使用系统注册命令systemctl start ${服务名} 进行服务启停,所以需使用${服务名}.service文件。目前CICD系统仅提供一套前端通用模板和后端通用模板(依赖nacos的业务服务适用),针对不使用nacos的后端服务提供业务方自定义service文件的能力。
自定义service文件示例如下:
1、以base-license-server服务为例:需要在服务内添加cicd/systemd/base-license-server.service文件。并调整maven打包脚本assembly.xml,确保service文件在打包后文件的cicd/systemd文件夹中存在:

2、service文件内容模板如下,仅需将下面红框中的组件名称和组件类型改为对应的信息即可。

CICD管理系统 在V1.1.7版本已具备ARM架构部署能力,国产化所使用的达梦数据库在语法以及历史(老CICD)配置应用上面与X86有诸多差异,因此使用 CICD管理系统 进行ARM架构部署时有以下修改点(注意事项)
新增 cicd/dmserver 目录, 维护达梦数据库初始化sql, 后续sql使用规则与mariadb文件夹一致(版本sql变更需增加update和维护init)

因达梦数据库特性,需用户与数据库名称一致,部分服务(在x86中)目前未统一用户名, 需在 cicd/descriptor.yml 新增 dm_user

assembly.xml 添加打包cicd/dmserver目录配置(C++无需处理)

服务现有的 local_package_define.yml 和 package_define.yml 配置,需合并到 cicd/descriptor.yml 的 cluster_variables(新CICD仅维护一份配置),目前识别到的变量及示例如下:
