智能软件平台 XMagital 应用包及描述配置文件规范
1. 引言
1.1 目的
本规范对应用包及描述配置文件的制作提出了规范性要求。其输入是XMagital V1.0的需求规格要求及相关子系统架构设计。该规范对平台开发应用或第三方应用的制作提出了要求,同时也是应用仓库、应用部署及基础运行环境与应用包相关功能的设计依据。
1.2 预期读者
本文档的预期读者包括:XMagital平台软件的管理人员、设计人员、开发人员、测试人员,在XMagital平台基础上进行应用软件产品开发的设计人员、开发人员、测试人员、工程实施人员和维护人员。
1.3 术语与缩略语
1.3.1 术语
本文使用的专业术语、自定义的词语、容易产生理解偏差的词语以及缩略语。
术语 | 解释 |
---|---|
平台 | 一个公共的基础,在此基础上可以开发不同产品。平台是产品线开发的基础,它为衍生一个产品提供可共用和可重用的特性、设计元素(组件、代码功能)以及相关流程和工具。本文中所提及的平台即XMagital平台。 [GB/T37413-2019 数字化车间术语和定义] |
应用 | Application,为应用软件(application software)的简称,指专为特定工程或特定生产场景编写的程序包,或本身也具有一定的通用性,但是通过XMagital应用开发框架编写的、并可以随时从系统摘除的软件包或模块(如签名软件,称量软件,或WMS接口程序等等)。 |
环境 | 环境即应用运行时依赖的环境。例如,Java应用依赖JRE环境、NodeJs应用依赖NodeJs环境等。 |
应用包 | 是对应用程序相关资源的统称,包含应用主程序及相关资源、安装脚本、进程控制脚本。 |
描述配置文件 | 是对应用程序相关资源的描述信息,包含基本信息、安装程序信息、运行信息。 |
应用仓库 | 应用仓库,管理平台应用及第三方应用包。 |
部署工具 | H部署工具提供服务器节点的管理、现场应用及行业包管理、应用部署能力,方便工程施工人员快速安装系统。 |
基础运行环境 | 基础运行环境遵循以应用为中心的设计理念,统一封装容器、应用运行时和底层基础设施相关的技术细节,让使用者专注于业务应用的配置、开发和使用。基础运行环境提供服务和应用稳定运行的能力,涵盖了应用的部署、服务启停与守护、节点与服务监控、系统运维的功能。 |
2 设计约束
2.1 假设和依赖
-
平台支持的Linux系统:64位的 Linux5.X及以上,例如:Ubuntu 22.04 LTS Server;银河麒麟Kylin Server V10。
-
本规范仅适用运行在Linux环境下的应用包。
-
应用包的环境依赖和数据结构,由应用设计及开发人员保证版本兼容性。
-
应用设计及开发人员保证应用之间不存在强依赖的循环,上传应用到应用仓库时需进行强依赖的循环检查。
3. 应用包规范概述
3.1 应用包概述
本规范对应用包及描述配置文件的制作提出了规范性要求,明确应用包及描述配置文件的格式和组成部分。
3.2 应用包组成结构
1)节点软件安装后的目录结构
节点软件安装后的目录结构,如下图 1:
图1 节点软件安装后的目录结构
节点软件安装后的目录包含应用运行环境目录、容器运行环境目录、公共组件目录、运行数据目录、日志信息目录、工程项目相关数据目录、原始安装包目录和节点配置信息文件。
-
应用运行环境目录(apps):传统应用运行环境目录。包含基于平台规范开发的应用、独立应用或已有的应用。
-
容器运行环境目录(containers):容器环境挂载宿主机目录。容器应用在容器环境里加载镜像文件并以容器的形式运行。
-
公共组件目录(lib):存放应用公共的、指定一个版本的组件。
-
运行数据目录(data):存放应用运行过程中产生的数据。
-
日志信息目录(logs):存放应用的运行日志。
-
工程项目相关数据目录(project):存放工程项目相关数据。
-
原始安装包目录(pack):存放应用的原始安装包文件。
-
环境依赖包目录(vendors):子系统依赖运行环境的程序包。
-
节点配置信息文件(nodemanifest):包含节点信息和节点服务信息。
2)应用包规范目录结构
应用包为tar.gz压缩文件,文件名形如:应用ID-版本号.tar.gz。
以下分别对基于平台规范开发的应用(standard)、独立开发或已有应用(custom)目录结构进行说明。
- 基于平台规范开发的应用(standard)
基于平台规范开发的应用目录结构示例如下图 2:
图2 基于平台规范开发的应用目录结构
基于平台规范开发的应用目录包含应用压缩包、证书文件、指纹验证文件、描述配置文件。
-
应用压缩包:包含运行程序目录(bin)、配置信息目录(config)、文件存储目录(files)、容器镜像目录(images)、初始化数据目录(init)。
-
证书文件:应用开发人员提供证书信息文件,上传应用到应用仓库时验证应用的合法性。
-
指纹验证文件:指纹验证文件是为解决发布的软件包被别人更改或者软件在传输过程中出现传输错误等问题,在提供软件包的同时,需提供一个指纹验证文件。
-
应用缩略图标文件(icon):应用缩略图,支持png图片格式,要求缩略图分辨率128x128px。
-
描述配置文件(appmanifest):包含了应用包的基本信息,部署安装信息以及运行所需的信息。
- 独立开发或已有的应用(custom)
独立开发或已有的应用目录结构示例如下图 3:
图3 独立开发或已有的应用目录列表
独立开发或已有的应用目录包含应用压缩包、证书文件、指纹验证文件、描述配置文件。
-
应用压缩包:包含运行程序及相关资源文件。
-
证书文件:应用开发人员提供证书信息文件,上传应用到应用仓库时验证应用的合法性。
-
指纹验证文件:指纹验证文件是为解决发布的软件包被别人更改或者软件在传输过程中出现传输错误等问题,在提供软件包的同时,还提供一个指纹验证文件。
-
应用缩略图标文件(icon):应用缩略图,支持png图片格式,要求缩略图分辨率128x128px。
-
描述配置文件(appmanifest):包含了应用包的基本信息,部署安装信息以及运行所需的信息。
3.3 应用包类型
已识别出的应用类型如下:
1) 传统应用
-
可执行程序应用:包括编译后可独立运行的Go程序,编译后可携带动态库运行的C/C++程序等。
-
Java应用:Java应用依赖JRE运行环境。
-
.Net应用(C#):在Linux系统下运行程序时需依赖.Net Core。
-
Web前端应用 Web前端应用依赖Web服务器(例如Nginx)进行部署。通常会将前端项目的构建结果放在节点上的某个文件夹下,然后通过启动Web服务器来加载一个WEB服务。
-
解释型动态语言开发的应用 NodeJs、Python等解释型动态语言需要依赖相应的运行时及依赖库。
2) 容器应用
容器应用是通过在容器环境里加载镜像文件并运行在独立名称空间里的应用。
3) 公共基础应用
是一组通用的、可重复使用的特定语言软件组件或库,打包为公共基础应用包。例如:Java应用的公共依赖库可统一打包为一个公共基础应用包。
为了确保应用程序按照规定引用统一的公共基础应用包,开发人员打包前需要进行校验,即公共基础应用包中存在的依赖文件不应重复出现在自身应用包中,避免冗余和潜在的冲突问题。
不同的应用类型,应用和环境的关系图如下图 4:
图4 应用和环境关系图
应用与环境之间存在依赖关系,应用和应用之间也存在依赖关系。
已识别出的各个应用类型的环境依赖版本推荐如下表 1:
应用类型 | 环境依赖版本 |
---|---|
可执行程序 | .Net Core7 |
Java应用 | Java1.8 |
Web前端应用 | Nginx 1.22+ |
解释型动态语言开发的应用 | Nodejs 18.16.0;Python 3.10.6 |
容器应用 | 无 |
部署工具根据节点服务信息,识别出节点服务所需的环境依赖,在节点上按需进行预先安装指定环境版本的运行环境。
3.4. 应用包使用场景
应用包使用场景如下图 5:
图5 应用包使用场景
1)开发人员在开发环境开发平台应用并构建应用包,并通过平台提供的校验工具(applint)验证打包正确性。
2)配置人员将发版的平台应用包或第三方应用包上传到应用仓库,应用上传校验通过后,应用仓库进行应用信息及安装包的统一存储和管理。
应用上传校验包含应用包大小检查、证书验证、应用包指纹验证、描述配置文件合规检查、应用包组成检查。
- 应用包大小检查
应用包大小应限制在200M以内,如果超出则警告提示。一个应用包尽量是一个完整独立的应用,具有多目标的复杂应用建议拆分为多个应用包。
-
证书验证
-
检查证书信息文件是否存在;
-
应用仓库通过调用信息安全服务证书管理接口进行证书验证,根据返回验证结果判断证书信息是否合法。
-
-
应用包指纹验证
-
检查指纹验证文件是否存在;
-
应用仓库通过检查文件前后指纹是否发生改变,就可以判断源文件是否被改动。
-
-
描述配置文件合规检查
-
检查描述配置文件是否存在;
-
验证描述配置文件合规性(文件名称、文件类型、文件内容语法格式);
-
根据应用类型,检查应用信息必填项和取值校验。
-
-
应用包组成检查
根据描述配置文件中安装程序信息、运行信息配置项内容,检查应用包的主程序及相关资源文件是否存在。
3)工程实施人员根据项目现场网络状况,可通过在线下载或离线导入项目所需的应用包到部署工具,在部署工具中按规划进行部署配置后,下发部署配置信息到各节点基础运行环境进行应用包的安装、升级、回滚工作。
4. 应用包规范定义
4.1 应用包规范
应用类型分为传统应用和容器应用。以下对不同类型的应用包进行规范定义说明。
4.1.1 应用包文件格式
应用包压缩采用tar.gz压缩,文件名形如:
应用ID-版本号.tar.gz 。
1)应用ID命名规范
建议:应用ID,长度最大64个字符,包含小写字母、数字、“-”、“_”、“.”。
2)版本号命名规范
建议:版本号,长度最大10个字符,包含数字、“.”。例如1.1.0。
3)应用包目录结构参照3.2章节应用包组成结构部分。
基于平台规范开发的应用,需按照基于平台规范开发应用目录结构,存放运行程序及相关资源文件。
独立开发或已有的应用,存放运行程序及相关资源文件目录结构不做限制。
4.1.2 应用包组成
4.1.2.1 传统应用
应用包包含如下内容:
- 应用包主程序及相关资源
必须。这是应用包的主体,包含可执行文件、脚本以及运行所需的资源文件。
- 应用包安装程序(脚本)
可选。执行应用包安装工作。
- 进程控制程序(脚本)
可选。负责指定程序的启停。如果应用包中只包含一个主程序,且基础运行时可直接对其进行进程启动(除描述配置文件中提供的启动参数外,不需要其他额外工作),则在应用包中可以不提供该脚本。
- 存活(Alive)监控检测命令程序或脚本
可选。应用如果是shell脚本方式进行存活检测,则需要提供。
- 就绪(Ready)监控检测命令程序或脚本
可选。应用包如果是shell脚本方式进行就绪检测,则需要提供。
- 证书信息文件
可选。开发人员需要提供证书信息文件以验证应用的合法性。
- 指纹验证文件
可选。开发人员需要提供指纹验证文件以判断源压缩文件是否被改动。指纹验证技术使用MD5算法。
- 描述配置文件(appmanifest.ini)
必须。包含了应用包的基本信息,部署安装信息以及运行所需的信息。详见4.2章节部分。
4.1.2.1.1 应用包主程序及相关资源
1)应用包主程序
必须。传统应用,以二进制文件(ELF)格式、jar包、脚本文件等形式提供。
2)健康检查处理
可选。开发人员可选择以接口或shell方式进行健康检查。主程序需要按照健康检查接口定义的要求,提供相关接口或命令。
-
健康检查支持方式
-
健康检查支持http、tcp或shell命令方式。
-
健康检查支持组合方式。例如:存活状态检测采用tcp方式,就绪状态检测采用http方式。
-
-
健康检查定义
http健康检查
a)存活状态检测接口
接口地址:是URL路径,例如:/alive,实际调用接口检查时会拼接真实的地址和端口,形如http://172.21.29.10:8087/alive。
提交方式:GET
传入参数:无
接口返回值:
code | 含义 | |
---|---|---|
返回码 | 200 | 正常 |
响应内容 | ok | |
响应类型 | text |
调用存活状态检测接口进行存活状态健康检查判断:
- 返回码200,响应内容为ok,则认为检测正常;响应内容为非ok,则检测异常。
-
返回码201~399,响应内容为应用内部错误信息,则检测异常。
-
返回其它代码(如:4XX、5XX等)时,则检测异常。
b)就绪状态检测接口
接口地址:是URL路径,例如:/ready,实际调用接口检查时会拼接真实的地址和端口,形如http://172.21.29.10:8087/ready。
提交方式:GET
传入参数:无
接口返回值:
code | 含义 | |
---|---|---|
返回码 | 200 | 正常 |
响应内容 | ok | |
响应类型 | text |
调用就绪状态检测接口进行就绪状态健康检查判断:
- 返回码200,响应内容为ok,则认为检测正常;响应内容为非ok,则检测异常。
- 返回码201~399,响应内容为应用内部错误信息,则检测异常。
- 返回其它代码(如:4XX、5XX等)时,则检测异常。
tcp健康检查
项 | 值 |
---|---|
存活端口 | 8090 |
就绪端口 | 8091 |
通过tcp协议对端口进行检测,如果端口可以正常连接就视为检测成功。
shell命令
开发人员可以选择提供存活检查命令和就绪健康检查命令。shell命令可以是简单的Linux命令或者shell脚本。
执行命令后,读取返回值,返回值为0,执行结果成功,则认为检测正常;否则检测异常。
4.1.2.1.2 应用包安装程序(脚本)
可选。提供应用包安装程序(脚本),实现以下功能:
-
支持静默方式安装
-
支持接收环境变量
-
支持安装脚本带参数
-
支持安装初始化处理
-
支持脚本类型
1)支持静默方式安装
应用包安装过程应该为静默方式,不可以通过交互式输入来控制安装过程。
如果应用包安装中确实需要某些信息,请参考下面“3)支持安装脚本带参数”部分,设计好相关参数,并在应用包描述配置文件中提供相关参数。进行安装时,由基础运行时服务在调用该安装脚本时传入该参数。
2)支持接收环境变量
参见4.2.2.2 安装程序信息,每个应用包都会提供该应用被其他应用依赖时所需的环境变量。基础运行环境在调用应用包安装程序(脚本)、控制程序(脚本)时,会根据应用依赖关系,将调用应用包依赖的应用的环境变量中安装目录参数替换成实际目录位置后,传递给应用包相关程序(脚本)。(注:基础运行环境应检查应用间的循环依赖问题。)
应用包相关程序(脚本)通过参数 “–env:env1=val1;env2=val2;…”形式接收环境变量信息。对参数中的每一个环境变量,应用包相关程序(脚本)需自行确定:是覆盖当前的环境变量,还是在当前的环境变量基础上进行累加。例如:PATH=$PATH;\local\hsm-os\apps\app1。
3)支持安装脚本带参数
传统应用支持在安装脚本中带参数和环境变量。
调用参数:
- –arg:arg1;arg2;…
接收开发人员提供的特定安装参数。
- –env:env1=val1;env2=val2;…
接收安装配置时传入的环境变量。
4)支持安装初始化处理
根据需要,应用可以在安装脚本中进行安装完成后所需的初始化处理(比如:文件拷贝、初始数据导入、应用配置更新等操作)。
5)支持脚本类型
支持脚本类型为bash。
6)安装前环境检查
安装脚本需具备安装前环境检查,包含应用已安装版本检查和执行策略、应用环境依赖检查。
4.1.2.1.3 进程控制程序(脚本)
可选。提供进程控制程序(脚本)。主要完成指定程序的启停控制。支持脚本类型为bash。
1)启动进程脚本:启动指定的可执行程序。
调用参数:
- -p:prog1;prog2;…,进程名
启动指定的可执行程序。
- –arg:arg1;arg2;…
接收开发人员提供的特定启动参数。
- –env:env1=val1;env2=val2;…
接收安装配置时传入的环境变量。
输出程序PID到指定文件:
- 指定PID文件:PID文件和程序为同级目录下,即在bin目录下。形如program1-0.1.1.pid。
- 应用提供启动脚本时,要求启动脚本向指定PID文件输出PID信息。
- 启动脚本文件中,启动每个程序时,需将PID信息分别输出到和程序相对应的PID文件。
例如:下面的启动脚本文件中,启动每个程序时,分别将PID信息输出到指定PID文件“program1-0.1.1.jar.pid”和“program2-0.1.1.jar.pid”。
#!/bin/bash
echo “Start to run the program”
nohup /usr/local/hsm-os/vendors/jdk1.8.0_261/bin/java -jar /usr/local/hsm-os/apps/demo1/bin/program1-0.1.1.jar >/dev/null 2>&1 &
echo $! > program1-0.1.1.jar.pid
nohup /usr/local/hsm-os/vendors/jdk1.8.0_261/bin/java -jar /usr/local/hsm-os/apps/demo1/bin/program2-0.1.1.jar >/dev/null 2>&1 &
echo $! > program2-0.1.1.jar.pid
执行启动脚本输出PID信息到指定文件示例如下图 6:
图 6 执行启动脚本输出PID信息到指定文件示例
2)停止进程脚本:停止指定的可执行程序。
-p:prog1;prog2;…,进程名
停止指定的可执行程序。
4.1.2.2 容器应用
应用包包含如下内容:
- 应用包主程序及相关资源
必须。这是应用包的主体,包含容器镜像文件。
- 证书信息文件
可选。开发人员需要提供证书信息文件以验证应用的合法性。
- 指纹验证文件
可选。开发人员需要提供指纹验证文件以判断源压缩文件是否被改动。指纹验证技术使用MD5算法。
- 描述配置文件(appmanifest.ini)
必须。包含了应用包的基本信息,部署安装信息以及运行所需的信息。详见4.2章节部分。
4.1.2.2.1 应用包主程序及相关资源
1)应用包主程序
必须。容器镜像文件,以tar包格式提供。
2)健康检查处理
可选。开发人员可选择以接口或shell方式进行健康检查。主程序需要按照健康检查接口定义的要求,提供相关接口或命令。
- 健康检查支持方式
- 健康检查支持http、tcp或shell命令方式。
- 健康检查支持组合方式。例如:允许存活状态检测采用tcp方式,就绪状态检测采用http方式。
- 健康检查定义
http健康检查
a)存活状态检测接口
接口地址:是URL路径,例如:/alive,实际调用接口检查时会拼接真实的地址和端口,形如http://172.21.29.10:8087/alive。
提交方式:GET
传入参数:无
接口返回值:
code | 含义 | |
---|---|---|
返回码 | 200 | 正常 |
响应内容 | ok | |
响应类型 | text |
调用存活状态检测接口进行存活状态健康检查判断:
-
返回码200,响应内容为ok,则认为检测正常;响应内容为非ok,则检测异常。
-
返回码201~399,响应内容为应用内部错误信息,则检测异常。
-
返回其它代码(如:4XX、5XX等)时,则检测异常。
b)就绪状态检测接口
接口地址:是URL路径,例如:/ready,实际调用接口检查时会拼接真实的地址和端口,形如http://172.21.29.10:8087/ready。
提交方式:GET
传入参数:无
接口返回值:
code | 含义 | |
---|---|---|
返回码 | 200 | 正常 |
响应内容 | ok | |
响应类型 | text |
调用就绪状态检测接口进行就绪状态健康检查判断:
- 返回码200,响应内容为ok,则认为检测正常;响应内容为非ok,则检测异常。
- 返回码201~399,响应内容为应用内部错误信息,则检测异常。
- 返回其它代码(如:4XX、5XX等)时,则检测异常。
tcp健康检查
项 | 值 |
---|---|
存活端口 | 8090 |
就绪端口 | 8091 |
通过tcp协议对端口进行检测,如果端口可以正常连接就视为检测成功。
shell命令
开发人员可以选择提供存活检查命令和就绪健康检查命令。shell命令可以是简单的Linux命令或者shell脚本。
执行命令后,读取返回值,返回值为0,执行结果成功,则认为检测正常;否则检测异常。
4.1.2.2.2 资源限制配置
可选。在描述配置文件中,开发人员可提供默认资源限制配置。详见4.2章节部分。
部署工具可配置应用运行时的资源限制,包含核数和内存资源配置。
4.1.2.2.3 存储卷配置
可选。在描述配置文件中,开发人员需提供目标存储卷映射列表配置。详见4.2章节部分。
部署工具可配置应用运行时的存储卷,包含定义存储卷、挂载存储卷配置。容器应用采用HostPath类型存储卷。HostPath存储卷指向节点文件系统上特定的文件或目录,即使用工作节点本地的存储空间。
4.2. 描述配置文件规范
4.2.1 描述配置文件格式
描述配置文件为支持复杂格式的类INI文件,字符集为UTF-8,包含了应用包的基本信息,部署安装信息以及运行所需的信息。
4.2.2 描述配置文件组成
描述配置文件中包括以下3部分内容:
- 基本信息
提供标识应用包基本属性以及应用间的依赖关系。
- 安装程序信息
提供应用包部署安装所需信息。
- 运行信息
提供应用包运行、守护所需信息。
应用包基本信息、安装程序信息、运行信息,为基础运行环境需要使用,由开发人员提供的信息,内容固定。
描述配置文件示例内容如下图:
图 7 描述配置文件示例
4.2.2.1 基本信息
应用包基本信息详情,对应描述配置文件[info]段,内容如下表 2基本信息表:
信息项 | 子项 | 说明 | 数据类型 | 是否必须 | 取值约定 |
---|---|---|---|---|---|
ID | 应用ID | 标量:文本 | 是 | 长度最大64个字符,包含小写字母、数字、“-”、“_”、“.” | |
name | 应用显示名称 | 标量:文本 | 是 | 长度最大64个字符 | |
nameEn | 应用显示英文名称 | 标量:文本 | 否 | 长度最大64个字符 | |
type | 应用类型(传统应用、容器应用) | 标量:文本 | 是 | [legacy,container] | |
version | 版本号,形如:1.1.0。 | 标量:文本 | 是 | ||
solution | 行业解决方案 | 标量:文本 | 否 | ||
appDependency | 服务依赖 | 列表 | 否 | 列表元素为对象,包含appIdVersion、dependencyType属性 | |
appDependency | appIdVersion | 服务依赖的应用信息 | 标量:文本 | 否 | 应用ID-版本号,形如:APP-1.0.1。 服务依赖配置,应用版本号支持指定版本和适配当前应用的版本两种方式。 1. 指定版本,例如:APP-1.0.1。 2. 适配当前应用的版本,例如:App-*。 |
appDependency | dependencyType | 服务依赖的类型 | 标量:文本 | 否 | |
hiddenDependency | 服务隐含依赖(隐式依赖需考虑检查方式,例如查看版本号、进程、配置文件等方式) | 列表 | 否 | 示例:中间件隐含依赖OpenSSL | |
hiddenDependency | id | 隐含依赖id | 标量:文本 | 否 | 示例:OpenSSL |
hiddenDependency | version | 隐含依赖的版本 | 标量:文本 | 否 | 版本号支持指定版本和适配所有的版本两种方式。 指定版本,例如: 1.1.1。 适配所有的版本,使用“*”标识,例如:*。 |
certFile | 证书文件名称 | 标量:文本 | 否 | ||
fingerprintFile | 指纹验证文件名称 | 标量:文本 | 否 | ||
funcDesc | 功能模块说明 | 标量:文本 | 否 | 长度最大255个字符 | |
releaseNote | 发布/升级说明 | 标量:文本 | 否 | 长度最大255个字符 | |
source | 应用来源 | 标量:文本 | 是 | ||
appMode | 应用兼容模式(标准应用、定制化应用) | 标量: 文本 | 是 | [standard,custom] | |
strictMode | 严格模式(true-严格模式;false-正常模式) | 标量: 布尔值 | 否 | 默认false。 严格模式下,检查证书信息、指纹验证合规;正常模式下,不检查证书信息、指纹验证合规。 | |
supSysType | 支持Linux系统的发行版类型 | 列表 | 是 | ||
appsets | 应用集名称,用于描述一组软件功能的集合 | 标量:文本 | 是 | ||
archType | 支持CPU架构类型,缺省默认为x86。若类型为aarch64时,应用ID需增加“_aarch64”标识,例如hsm-smc_aarch64-1.0.0.tar.gz。 | 标量:文本 | 否 | [x86,aarch64],缺省默认为x86类型。 |
表 2 基本信息表
4.2.2.2 安装程序信息
应用包安装程序信息详情,对应描述配置文件[package]段,内容如下表 3:
信息项 | 子项 | 说明 | 数据类型 | 是否必须 | 类型 | 取值约定 |
---|---|---|---|---|---|---|
targetPaths | 容器内的目录列表(用于将本地目录或存储卷映射到容器内的指定目录) | 列表 | 否 | 容器应用 | 例: [“/usr/local/temp/“] | |
installProgramName | 安装脚本文件名称 | 标量:文本 | 否 | 传统应用 | ||
installParams | 安装参数 | 列表 | 否 | 传统应用 | 列表中的参数以“–arg:arg1;arg2;…”形式,传递给installProgram | |
unInstallProgramName | 卸载脚本文件名称 | 标量:文本 | 否 | 传统应用 | ||
install | 安装时提供的环境变量 | 对象 | 否 | 传统应用 | 对象元素可扩展。对象元素格式为,变量:值。形如PATH = “$PATH:/home/mysql/bin”。 key不支持中文。 | |
upgradeProgramName | 升级脚本文件名称 | 标量:文本 | 否 | 传统应用 | ||
upgradeParams | 升级参数 | 列表 | 否 | 传统应用 | ||
upgradeEnvs | 升级时提供环境变量 | 对象 | 否 | 传统应用 | ||
degradeProgramName | 降级脚本文件名称 | 标量:文本 | 否 | 传统应用 | ||
degradeParams | 降级参数 | 列表 | 否 | 传统应用 | ||
degradeEnvs | 降级时提供环境变量 | 对象 | 否 | 传统应用 |
表 3 安装程序信息表
4.2.2.3 运行信息
应用包运行信息详情,对应描述配置文件[execute]段,内容如下表 4:
信息项 | 子项 | 说明 | 数据类型 | 是否必须 | 类型 | 取值约定 |
---|---|---|---|---|---|---|
ports | 端口号列表 | 列表 | 否 | 容器应用 | 列表元素为对象 | |
ports | sourcePort | 应用原始端口号 | 标量:文本 | 否 | 容器应用 | 容器应用专用 |
ports | targetPort | 对外暴露端口号 | 标量:文本 | 否 | 容器应用 | 建议,应用需支持在部署工具中修改。 平台/基础应用端口范围6000-8000。 业务应用端口范围8000以上。 |
cpuLimit | 建议核数大小 | 标量:文本 | 否 | 容器应用、传统应用 | 单位:m(毫核) | |
memoryLimit | 建议内存大小 | 标量:文本 | 否 | 容器应用、传统应用 | 单位:M(兆) | |
programType | 程序类型 | 标量:文本 | 是 | 容器应用、传统应用 | [java,exec,web,dotnet,nodejs,python,container,common] | |
privileged | 是否特权模式运行 | 标量:布尔值 | 否 | 容器应用、传统应用 | 默认false | |
startProgramName | 对应用包内主程序进行启动的脚本文件名称 | 标量:文本 | 否 | 传统应用 | ||
startParams | 启动参数 | 列表 | 否 | 传统应用 | 如果startProgramName不为空,则列表中的参数以“–arg:arg1;arg2;…”形式,传递给startProgramName;如果startProgramName为空,则列表中的参数以“arg1 arg2 …”形式,传递给programs列表的第一个进程名(即如果应用包中有多个可执行程序,需要提供进程控制脚本;如果仅有一个可执行程序,可以不提供进程控制脚本,由基础运行环境直接进行进程启停) | |
stopProgramName | 对应用包内主程序进行停止的脚本文件名称 | 标量:文本 | 否 | 传统应用 | ||
dataDir | 数据存储目录列表 | 列表 | 否 | 容器应用、传统应用 | 相对目录 | |
log | 日志收集配置 | 列表 | 否 | 容器应用、传统应用 | 列表元素为对象 | |
log | logDir | 日志存储路径 | 标量:文本 | 否 | 容器应用、传统应用 | 相对目录 |
log | logFileFormat | 日志文件格式 | 列表 | 否 | 容器应用、传统应用 | |
log | logSep | 日志分隔符 | 标量:文本 | 否 | 容器应用、传统应用 | |
log | logFormat | 日志格式 | 标量:文本 | 否 | 容器应用、传统应用 | 日志格式配置(日志项可选): 1. timestamp 时间戳,时间精确到毫秒级 2. level 级别,包括FATAL(严重)、ERROR(错误)、WARN(警告)、INFO(操作信息)、DEBUG(调试信息),文本格式 3. type 类型,描述日志类型,由调用方定义,例如报文信息、接口调用错误等,文本格式,文本格式 4. source 来源服务名+服务ID。,文本格式 5. local 位置,线程信息、代码行位置,文本格式 6. message 日志信息(必须),由调用方指定,字符串格式 7. detail 详情,由调用方指定,JSON格式 例如: _ 标准应用(standard) logFormat = “timestamp, level, type, source, local, message, detail” _ 定制化应用(custom) logFormat=“timestamp,level,message” |
env | 运行时提供的环境变量 | 对象 | 否 | 传统应用 | 1)对象元素可扩展。对象元素格式为,变量:值。形如datasource_url = “jdbc:mysql://localhost:3306/test”。 2)key不支持中文。 3)运行环境变量值中,支持占位符配置,占位符格式为:${xx:xxx}。 目前支持ip占位符:${ip:应用ID},部署安装时统一替换为真实ip。 例如datasource_url = “jdbc:mysql://${ip:mysql}:3306/test”。 | |
web | web前端路由配置(programType=web时,此配置生效,反之无效) | 对象 | 否 | 传统应用 | ||
web | routes | 路由配置列表 | 列表 | 否 | 传统应用 | 列表元素为对象 |
web. routes | path | 路由路径 | 标量:文本 | 否 | 传统应用 | 路由路径形如:path= “/deploy”等。 |
web.routes | type | 指令类型(alias、proxy_pass、try_files、custom) | 标量:文本 | 否 | 传统应用 | [alias,proxy_pass,try_files,custom] |
web.routes | target | 路由目标路径或地址 | 标量:文本 | 否 | 传统应用 | 路径目标路径形如:target= “files/”。 路由地址中支持占位符配置,占位符格式为:${xx:xxx}。 目前支持ip占位符:${ip:应用ID},部署安装时统一替换为真实ip。 例如target = ”${ip:hsm-install}:6010”。 |
web.routes | content | 自定义(web.route.type=custom时,此配置生效,反之无效) | 标量: 文本 | 否 | 传统应用 | content配置项支持单行文本和多行文本。 部署安装时,会将content和target配置项动态拼接在一起。 例如:target配置如下,target=”${ip:hsm-db-device-model-svc}:6890” 单行文本示例: content=“proxy_pass ${target} ;rewrite ^/api/model/(.*)$ /$1 break;” 多行文本使用三对双引号(""")来表示多行字符串,开始和结束需要添加(""")。 多行文本示例: content =proxy_pass ${target}; rewrite ^/api/model/(.*)$ /$1 break;""" |
web.routes | targetFilter | 路由目标转换规则(默认为空,代理所有服务) | 标量: 文本 | 否 | 传统应用 | [A,E,L,R] A或空值:代理所有服务(默认) E:只代理工程师站服务 L:只代理本机的服务 R:代理除工程师站外的服务 |
programs | 用于基础运行环境进行守护和健康检查 | 列表 | 否 | 容器应用、传统应用 | 列表元素为对象 | |
programs | progName | 程序名 | 标量:文本 | 是 | 容器应用、传统应用 | 传统应用:progName为可执行程序的相对目录名。同时也是可执行程序的安装相对目录名(部署工具解包后会拷贝整个应用包至平台应用运行环境目录apps/下)。 容器应用:progName为镜像名(形如app 1:v1.0.0)。 例如:一个可运行程序相对目录为 bin/example1,则我们希望开发人员提供的程序名是:example1(相对于安装相对目录 /bin)。一般认为,该程序启动后进程名还是example1。这样我们就可以守护该进程。 |
programs | progParams | 程序参数 | 列表 | 否 | 容器应用、传统应用 | |
programs | notNeedGuard | 程序是否需要守护(true-不需要守护;false-需要守护) | 标量: 布尔值 | 否 | 容器应用、传统应用 | 默认false |
programs | healthCheckAliveType | 存活状态检测接口类型(tcp、http、shell命令) | 标量:文本 | 否 | 容器应用、传统应用 | [tcp,http,shell] |
programs | healthCheckAliveInterface | 存活状态检测接口 | 标量:文本 | 否 | 容器应用、传统应用 | http类型下提供 |
programs | healthCheckAliveHttpPort | http类型时的存活状态检测端口 | 标量:文本 | 否 | 容器应用、传统应用 | http类型下提供 建议端口范围8000以上。 |
programs | healthCheckAliveTcpPort | tcp类型时的存活状态检测端口 | 标量:文本 | 否 | 容器应用、传统应用 | tcp类型下提供 建议端口范围8000以上。 |
programs | healthCheckAliveShellCmd | shell命令时的存活状态检测命令 | 标量:文本 | 否 | 容器应用、传统应用 | shell命令类型下提供 |
programs | healthCheckReadyType | 就绪状态检测接口类型(tcp、http、shell命令) | 标量:文本 | 否 | 容器应用、传统应用 | [tcp,http,shell] |
programs | healthCheckReadyInterface | 就绪状态检测接口 | 标量:文本 | 否 | 容器应用、传统应用 | http类型下提供 |
programs | healthCheckReadyHttpPort | http类型时的就绪状态检测端口 | 标量:文本 | 否 | 容器应用、传统应用 | http类型下提供 建议端口范围8000以上。 |
programs | healthCheckReadyTcpPort | tcp类型时的就绪状态检测端口 | 标量:文本 | 否 | 容器应用、传统应用 | tcp类型下提供 建议端口范围8000以上。 |
programs | healthCheckReadyShellCmd | shell命令时的就绪状态检测命令 | 标量:文本 | 否 | 容器应用、传统应用 | shell命令类型下提供 |
extend | 可扩展自定义属性对象 | 对象 | 否 | 容器应用、传统应用 | 应用可根据需要,添加自定义属性对象值,应用自己读取对象信息,基础环境无需读取该信息。 示例一: 中间件代理配置: [excute.extend] mwNeedPorxy=”true” [[excute.extend.mwMethod]] path=”v1/file/upload” requestMethod=”POST” type=”fileUp” 示例二: 工程环境菜单配置: [execute.extend] #工程环境菜单信息 engMenu = ['''{ “id” : “install-main”, “name” : “系统部署”, “icon” : “icon-install”, “active”: { “kind”: “open”, “data” : “/hsm-install/?appName=hsm-install&time=1698224626253#/sidebar” }, “enabled”: true, “order” : 1, “items” : null}'''] |
描述配置文件运行信息部分补充:
1)应用配置
- 基础数据库服务(postgresql、influxdb、redis)如需支持数据库相关信息在线统一修改,在appmanifest.ini中支持自定义配置表单信息,安装部署时会自动解析并渲染出表单页面。
postgresql数据库自定义配置表单信息,示例如下
# appmanifest.ini
......
[execute.extend]
[execute.extend.define]
#应用配置显示类型(支持table-表格、form-表单)
type="table"
#绑定环境变量唯一标识(type为table类型时生效)
unique_id="DB_DATASOURCE"
[[execute.extend.define.list]]
#属性
key= "DB_DATASOURCE"
#属性类型(text、password、number)
type= "text"
#属性名称
prompt="访问数据库名"
#属性英文名称
prompt_en="visit datasource name"
#是否必填
requirement=true
#正则表达式(支持英文字母、数字、"-"、"_")(type为text、password类型时生效)
formater="^[\\d\\w_-]+$"
formater_message="支持英文字母、数字、'-'、'_'"
formatermessage_en="Only supports English letters and numbers,'-', '_'"
#字符最大输入长度(type为text、password类型时生效)
maxlength=32
#字符最小输入长度(type为text、password类型时生效)
minlength=4
#最大值(type为number类型时生效)
max= 0
#最小值(type为number类型时生效)
min= 0
#数值精度(type为number类型时生效)
precision=0
#绑定运行环境变量标识
bind_env= "DB_DATASOURCE"
#默认值
default= ""
#排序号
sort=1
[[execute.extend.define.list]]
#属性
key= "DB_UID"
#属性类型(text、password、number)
type= "text"
#属性名称
prompt="访问数据库用户名"
#属性英文名称
prompt_en="visit datasource username"
#是否必填
requirement=true
#正则表达式(支持英文字母、数字、"-"、"_")(type为text、password类型时生效)
formater="^[\\d\\w_-]+$"
formater_message="支持英文字母、数字、'-'、'_'"
formatermessage_en="Only supports English letters and numbers,'-', '_'"
#字符最大输入长度(type为text、password类型时生效)
maxlength=32
#字符最小输入长度(type为text、password类型时生效)
minlength=4
#最大值(type为number类型时生效)
max= 0
#最小值(type为number类型时生效)
min= 0
#数值精度(type为number类型时生效)
precision=0
#绑定运行环境变量标识
bind_env= "DB_UID"
#默认值
default= ""
#排序号
sort=2
[[execute.extend.define.list]]
#属性
key= "DB_PWD"
#属性类型(text、password、number)
type= "password"
#属性名称
prompt="访问数据库密码"
#属性英文名称
prompt_en="visit datasource password"
#是否必填
requirement=true
#正则表达式(支持英文字母、数字、"-"、"_")(type为text、password类型时生效)
formater="^[\\d\\w_-]+$"
formater_message="支持英文字母、数字、'-'、'_'"
formatermessage_en="Only supports English letters and numbers,'-', '_'"
#字符最大输入长度(type为text、password类型时生效)
maxlength=32
#字符最小输入长度(type为text、password类型时生效)
minlength=4
#最大值(type为number类型时生效)
max= 0
#最小值(type为number类型时生效)
min= 0
#数值精度(type为number类型时生效)
precision=0
#绑定运行环境变量标识
bind_env= "DB_PWD"
#默认值
default= ""
#排序号
sort=3
......
[[execute.extend.define.list]]
#属性
key= "DB_PWD"
#属性类型(text、password、number)
type= "password"
#属性名称
prompt="访问数据库密码"
#属性英文名称
prompt_en="visit datasource password"
#是否必填
requirement=true
#正则表达式(支持英文字母、数字、"-"、"_")(type为text、password类型时生效)
formater="^[\\d\\w_-]+$"
formater_message="支持英文字母、数字、'-'、'_'"
formatermessage_en="Only supports English letters and numbers,'-', '_'"
#字符最大输入长度(type为text、password类型时生效)
maxlength=32
#字符最小输入长度(type为text、password类型时生效)
minlength=4
#最大值(type为number类型时生效)
max= 0
#最小值(type为number类型时生效)
min= 0
#数值精度(type为number类型时生效)
precision=0
#绑定运行环境变量标识
bind_env= "DB_PWD"
#默认值
default= "postgres"
influxdb数据库自定义配置表单信息,示例如下
# appmanifest.ini
......
[execute.extend]
[execute.extend.define]
#应用配置显示类型(支持table-表格、form-表单)
type="form"
#绑定环境变量唯一标识(type为table类型时生效)
unique_id=" "
[[execute.extend.define.list]]
#属性
key= "DB_TIMEOUT"
#属性类型(text、password、number)
type= "number"
#属性名称
prompt="数据库存储时间(天)"
#属性英文名称
prompt_en="datasource save time (unit day)"
#是否必填
requirement=true
#正则表达式(支持英文字母、数字、"-"、"_")(type为text、password类型时生效)
formater="^[\\d\\w_-]+$"
formater_message="支持英文字母、数字、'-'、'_'"
formatermessage_en="Only supports English letters and numbers,'-', '_'"
#字符最大输入长度(type为text、password类型时生效)
maxlength=0
#字符最小输入长度(type为text、password类型时生效)
minlength=0
#最大值(type为number类型时生效)
max= 360
#最小值(type为number类型时生效)
min= 30
#数值精度(type为number类型时生效)
precision=0
#绑定运行环境变量标识
bind_env= "DB_TIMEOUT"
#默认值
default= "180"
#排序号
sort = 1
......
- 数据库支持在线统一修改后,各应用需配置数据库相关信息环境变量进行适配,安装部署升级时,按基础数据库服务统一修改的信息进行动态替换并生成配置文件,如下示例:
# appmanifest.ini
......
[execute.env]
#访问postgresql数据库名称
DB_DATASOURCE= "eng"
#访问postgresql数据库用户名
postgresql_username= "${def:DB_UID}"
#访问postgresql数据库密码
postgresql_password= "${def:DB_PWD}"
#influxdb数据库-数据存储时间
influxdb_timeout= "${def:DB_TIMEOUT}"
......
5. 附录
本附录包含描述配置文件信息参照表、应用包示例及应用包文件压缩说明。
5.1 描述配置文件信息参照表
描述配置文件信息参照表内容如下图 8:
图 8 描述配置文件信息参照表内容
信息项填写说明:
必填项:必须填写。 可选项:按需填写,如果不需要该信息项,无需填写。 不涉及项:无需填写。
5.2 平台环境变量
系统内核服务启动时通过Systemd创建平台环境变量,并将其传递给子进程。平台全局环境变量有:
作用范围 | 环境变量名称 | 环境变量值 | 设置位置 | 备注 |
---|---|---|---|---|
全局 | HSM_CERT | 应用子进程内存空间 | 是否开启签名认证(true/false) | |
全局 | HSM_MW_NAMESPACE | 应用子进程内存空间 | MW命名空间 | |
全局 | HSM_LITE | 应用子进程内存空间 | 是否轻量模式(true/false) | |
全局 | HSM_APPID | 应用子进程内存空间 | 当前应用ID | |
全局 | HSM_APP_VERSION | 应用子进程内存空间 | 当前应用版本 | |
全局 | HSM_LOCAL_CODE | 应用子进程内存空间 | 当前节点编码 如e1,s1 | |
全局 | HSM_LOCAL_DOMAIN | 应用子进程内存空间 | 当前节点域名 如e1.io(映射到ip1和ip2) | |
全局 | HSM_LOCAL_IP | 应用子进程内存空间 | 当前节点域名 如e1.io(兼容历史版本) | |
全局 | HSM_LOCAL_IP1 | 应用子进程内存空间 | 当前节点ip1 | |
全局 | HSM_LOCAL_IP2 | 应用子进程内存空间 | 当前节点ip2 | |
全局 | HSM_GROUP_ID | 应用子进程内存空间 | 节点所在服务器组ID 如group1 | |
全局 | HSM_GROUP_NAME | 应用子进程内存空间 | 节点所在服务器组名称 如 数据服务器 | |
全局 | HSM_GROUP_DOMAIN | 应用子进程内存空间 | 节点所在服务器组域名 如group1.io(映射到vip1和vip2) | |
全局 | HSM_GROUP_VIP1 | 应用子进程内存空间 | 节点所在服务器组虚ip1 | |
全局 | HSM_GROUP_VIP2 | 应用子进程内存空间 | 节点所在服务器组虚ip2 | |
全局 | HSM_SK_HOSTNAME | 应用子进程内存空间 | 主机名 | |
全局 | HSM_HOME | /usr/local/hsm-os | 应用子进程内存空间 | 平台安装目录 |
全局 | HSM_SK_PORT | 6000 | 应用子进程内存空间 | 系统内核服务号端口 |
全局 | HSM_TEMPLATE | 应用子进程内存空间 | 已选部署模板(single-manifest: 1+1 ;double-manifest: 1+2 ;multi-manifest: 1+4 ;double-integ-manifest: 2+1;single: 一体机) |