From 79f328eee96fbcf464202ebcf1dcc1dd893f8dd1 Mon Sep 17 00:00:00 2001 From: lroyia <814876716@qq.com> Date: Fri, 17 Dec 2021 14:52:08 +0800 Subject: [PATCH] =?UTF-8?q?'=E6=97=A5=E6=8A=A5=E5=91=A8=E6=8A=A5=E7=9A=84?= =?UTF-8?q?=E8=AF=B4=E6=98=8E'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 应用部署/youfool-increpack-readme.md | 250 ++++++++++++++++++ .../新兵作战指南(后端篇).md | 9 +- ...作周报(2021.12.13 - 2021.12.17).xls | Bin 0 -> 38400 bytes 3 files changed, 257 insertions(+), 2 deletions(-) create mode 100644 应用部署/youfool-increpack-readme.md create mode 100644 模版/xxx个人工作周报(2021.12.13 - 2021.12.17).xls diff --git a/应用部署/youfool-increpack-readme.md b/应用部署/youfool-increpack-readme.md new file mode 100644 index 0000000..b9df8fe --- /dev/null +++ b/应用部署/youfool-increpack-readme.md @@ -0,0 +1,250 @@ +
众望通科技 研发中心
+
YOUFOOL-INCREPACK 架构设计
+ +[TOC] + + + +## 1 项目说明 + +YOUFOOL-INCREPACK是一个管理补丁发布的 **工具链**。主要为了解决 **开发环境** 与 **实施环境** 网络隔离情况下,规范Web应用中补丁的升级,同时为Web应用添加校验机制,未经授权的修改无法部署到Web应用中,规范了实施环境的管理。 + +## 2 主要功能 + +* 根据配置生成指定范围增量补丁文件; +* 版本管理自动化,对版本号形成强约束管理; +* 向补丁发放授权; +* 补丁升级过程自动化:补丁下载、解压、备份、覆盖、系统关停、启动、升级成功检测; +* Web中间件启动过程校验,未经授权的文件无法部署启动。 + +## 3 技术设计 + +![输入图片说明](./youfool-increpack-framework.png "YOUFOOL-INCREPACK 架构示意图") + +YOUFOOL-INCREPACK由四个部分组成: + +* PMS +* Increpack-maven-plugin +* Increpack-client +* Increpack-interceptor + +### 3.1 PMS + +项目管理系统,闭环管理的角色,升级流程的起点与终点: + +* 发布的补丁的授权文件,设定版本逐级发布的链路(链路节点参与补丁授权),最后接收现场升级后的完成信息,作为版本发布的闭环节点; +* 负责所有系统版本发布信息的管理; +* 负责所有系统的License管理; + +### 3.2 Increpack-maven-plugin + +Maven插件,只适用在Maven管理的开发项目中,Package阶段完成补丁的打包。配置 `Git` 仓库信息、Revision信息和版本号信息后,生成特定版本号样式的补丁。 + +> 补丁名称样例:*aicods_gz-1.0.12-RELEASE-r252.200504.zip* + +#### 3.2.1 补丁文件结构 + +* 工程文件,目录结构遵循约定,与部署环境一致 +* incre_config 目录专门存放配置文件信息 +* auth文件,补丁的授权信息 +* version.json文件,补丁的版本信息 +* README.txt文件,补丁的描述信息 + +#### 3.2.2 版本号说明 + +补丁版本号示例: ` youfool-pms_v1.0.12_c6303209da_20201011 ` + +* 项目名称:youfool-pms,按照约定,与POM中 artifactId 一致; + +* 版本号: v1.0.12,编号规则(严格递增): + + `MajorVersionNumber.MinorVersionNumber.BugFixNumber` + + 1. `MajorVersionNumber`,主版本号,项目发生重大升级时递增 + + 2. `MinorVersionNumber`,子版本号,项目进行需求变动升级时递增 + + 3. `BugFixNumber`,修正版本号,项目进行Bug修复时递增 + +* 代码版本号:c6303209da,对应 `GIT` 的 commit SHA-1 编号,增量补丁截止的版本 + +* 时间序列号:20201011,打包操作的时间描述,2020年10月11日 + + +### 3.3 Increpack-client + +客户端负责工具,由实施人员操作。主要用于辅助实施人员完成补丁的升级、回退和一些简单的系统管理功能。具体功能有: + +* 补丁授权的校验 +* 补丁版本号校验 +* 执行补丁文件的覆盖与备份 +* 往实施环境写入授权信息 +* 应用系统的关闭与启动 +* 系统可用性检测 + +### 3.4 Increpack-interceptor + +Web容器拦截器,用于Web容器启动时进行授权校验: + +* 计算环境中应用文件的Hash信息是否与auth授权数据一致,如果出现不一致,认为应用文件被篡改,中断系统启动过程; +* 应用的license校验; +* 系统启动的消息发布,发布渠道:企业微信和应用自带的版本发布消息模块。 + + + +## 4 版本发布流程 + +### 4.1 版本发布服务器 + +### 4.2 分支管理 + +### 4.3 版本号管理 + + + +## 5 配置说明 + +### 5.1 工程配置说明 + +#### 5.1.1 POM配置 + + 1. 引入依赖youfool-increpack-maven-plugin + + ```xml + + com.chinaweal.youfool + youfool-increpack-maven-plugin + 2.0.0-SNAPSHOT + + ``` + + 2. 在build.plugins节点下配置需要用到的插件(直接拷贝即可) + + ```xml + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + ${project.artifactId} + + target/assembly.xml + + + + + make-assembly + package + + single + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + compile + + java + + + com.chinaweal.youfool.increpack.maven.IncrePackMain + + ${project.artifactId} + ${project.version} + + false + + + + authMac + package + + java + + + com.chinaweal.youfool.increpack.common.AuthPackMain + + + + + + ``` + + +#### 5.1.2 increpack.xml配置 + + 文件放置在Maven工程根目录 + +```XML + + + http://172.22.80.91:8086/control/upgradeRecord/getUpgradeByAppIdAndCodeId + + d789d196fdb40bdb2df321216da192ff + + e53514c7330d9ccbe701a26cf0803243 + + + + git + http://47.107.61.133:3000/chinaweal/fsrl-server.git + D:\chinaweal\gitea-code\fsrl-server_medical + youfool-increpack-maven-plugin-git + + d160c658ccf1e764cb65bc5e59986b1b2b791144 + 64575ae03c6406744821bc4cba81b69f9f27181f + + + + + src\main\resources\properties + src\main\resources\spring\JobBySpring.xml + src\main\resources\config.properties + src\main\resources\logback.xml + src\main\resources\backfill\backfill.properties + + + +``` + +#### 5.1.3 前端工程配置 + +package.json追加工程信息 + +```json +{ + "appId": "7d7182320870b9f0a36d843ddbb77362",// 应用ID + "codeId": "ec05f963917a612d247f39ec8fc1ba47",//工程ID + "increApi": "http://172.22.80.91:8086/control/upgradeRecord/getUpgradeByAppIdAndCodeId"//版本服务器接口地址 +} +``` + +vue.config.js 配置引用插件 + +```javascript +configureWebpack: { + plugins: [ + new IncrePack(packageJson) + ] +} +``` + + + +## 6 下一步 + +### 6.1 完善功能 + +1. 增量打包插件进行调整新建目录专门存放配置文件 +2. 增量打包插件,进行记录删除的日志进行移除文件 + +### 6.2 规划方向 + +1. Client功能的完整:下载补丁、关停中间件、启动中间件、系统可用性检测、系统版本升级数据管理; +2. 升级的闭环:PMS结合项目实现补丁授权、生产环境升级历史的统一管理。 diff --git a/技术规范/新兵作战指南(后端篇).md b/技术规范/新兵作战指南(后端篇).md index 77939c8..c8aa75d 100644 --- a/技术规范/新兵作战指南(后端篇).md +++ b/技术规范/新兵作战指南(后端篇).md @@ -145,12 +145,17 @@ IDEA社区版运行tomcat必装 ### 增量打包部署 +[youfool-increpack-readme](../应用部署/youfool-increpack-readme.md) + ## 军情报告(日报,周报) ### 日报 -一般在入职后的第二周,项目经理就开始要求你写日报。 +一般在入职后的第二周,项目经理就开始要求你写日报。日报通过企业微信的工作台的`汇报`-`日报`功能进行每日的工作,以及第二天的工作的汇报。 ### 周报 -## 常见问题 +同样的,一般在入职后第二周或第三周开始,项目经理就开始要求你每周周五早上写周报。点击下载周报模版。 +模版一般通过企业邮箱发送到自己的项目经理手上。这个具体要看你的项目经理的安排。 + +## 常见问题(Q&A) diff --git a/模版/xxx个人工作周报(2021.12.13 - 2021.12.17).xls b/模版/xxx个人工作周报(2021.12.13 - 2021.12.17).xls new file mode 100644 index 0000000000000000000000000000000000000000..c052d7703dc2318a026cee5eafaa658b7351519c GIT binary patch literal 38400 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 ZWGJPBkg9>E=>va9(d6>`BXAx5{{T&L6Sn{W literal 0 HcmV?d00001