2468 lines
140 KiB
HTML
2468 lines
140 KiB
HTML
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>文档</title>
|
||
<link href="./css/semantic/semantic.min.css" rel="stylesheet">
|
||
<link href="./css/markdown.css" rel="stylesheet">
|
||
<style>
|
||
body{padding-top:0;background:#f7f7f7}
|
||
body>.ui.container{width:100%;padding:0}
|
||
#project-title{background:#6e6e6e;width:100%;line-height:3.572rem;color:#fff;font-size:1.2rem}
|
||
#project-title .title-wrap{font-weight:700;padding:0 12px;width:100%;max-width:1366px!important;min-width:900px;margin:0 auto}
|
||
#project-title .left,#project-title right{display:inline-block}
|
||
#project-title .right{float:right}
|
||
#project-title .right .wiki-actions .menu{left:auto;right:0;margin-top:.4em!important}
|
||
#wiki-preview-container{width:100%;max-width:1366px!important;min-width:900px;padding:0;border:1px solid #e3e9ed;border-top:0}
|
||
#wiki-preview>.ui.segment{margin-top:0;padding:1rem;padding-left:0;border:0}
|
||
.hover-places{display:inline-block}
|
||
#page-detail{width:60%;margin:0 auto}
|
||
#page-detail .title{font-weight:700;font-size:24px;padding:12px 0;border-bottom:1px solid #ccc}
|
||
#page-detail .content{margin-top:15px}
|
||
.content p{word-wrap:break-word}
|
||
#wiki-parent,#wiki-title,#wikis{display:none}
|
||
.ui.grid{padding:0!important}
|
||
#ex-all{cursor:pointer;color:#537c8d}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="ui container">
|
||
<div id="project-title">
|
||
<div class="title-wrap">
|
||
<div class="left">
|
||
<i class="icon eye"></i>
|
||
文档预览:
|
||
全开使用手册
|
||
</div>
|
||
<div class="right">
|
||
Export by Gitee
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="ui container" id="wiki-preview-container">
|
||
<div id="wiki-preview">
|
||
<div class="ui segment">
|
||
<div id="page-detail" class="markdown-body">
|
||
<div class='title'>1. 前言</div><div class='content'><h2>
|
||
<a id="11-文档修订记录" class="anchor" href="#11-%E6%96%87%E6%A1%A3%E4%BF%AE%E8%AE%A2%E8%AE%B0%E5%BD%95"></a>1.1 文档修订记录</h2>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>修订次数</th>
|
||
<th>文档版本号</th>
|
||
<th>修订时间</th>
|
||
<th>修订人</th>
|
||
<th>修订内容</th>
|
||
<th>审核人</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>1</td>
|
||
<td>V1.0</td>
|
||
<td>2025.4</td>
|
||
<td>姚煜楠</td>
|
||
<td>初始版本内容编写。</td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td></td>
|
||
<td></td>
|
||
<td></td>
|
||
<td></td>
|
||
<td></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<h2>
|
||
<a id="12-框架概述" class="anchor" href="#12-%E6%A1%86%E6%9E%B6%E6%A6%82%E8%BF%B0"></a>1.2 框架概述</h2>
|
||
<p>全代码开发平台是集团技术中台的重要组成部分,在主流JAVA技术开发基础上,整合了优质的第三方开源项目,并基于集团常见业务场景进行适配优化,最终研制而成的快速应用开发平台。其定位为通用代码开发脚手架,为快速开发上线低代码开发平台无法满足的定制化系统进行赋能。全开平台提供了一个开箱即用的开发环境,包含了集团完整的技术生态和技术规范,以统一应用开发的技术路线,让系统开发者基于技术底座专注于业务实现。平台内置多个应用开发所必须的公共组件,各组件以服务或依赖包的方式引入项目,包括项目脚手架工程、用户登录组件、权限控制组件、用户管理组件、ORM组件、代码生成器组件、附件上传组件、流程组件等。</p>
|
||
<h3>
|
||
<a id="121-技术栈" class="anchor" href="#121-%E6%8A%80%E6%9C%AF%E6%A0%88"></a>1.2.1 技术栈</h3>
|
||
<ul>
|
||
<li>
|
||
<strong>JDK版本</strong>: 8以上</li>
|
||
<li>
|
||
<strong>基础框架</strong>: Spring Boot 2.7.5、Spring Cloud&Alibaba 2021.0.5</li>
|
||
<li>
|
||
<strong>前端框架</strong>: Vue 3.3.4、Ant-Design-Vue 3.0</li>
|
||
<li>
|
||
<strong>持久层</strong>: MyBatis-Plus 3.5.2、Druid 1.2.22</li>
|
||
<li>
|
||
<strong>权限框架</strong>: Sa-Token 1.29.0</li>
|
||
<li>
|
||
<strong>数据库</strong>: 支持人大金仓(默认)、MySQL、Oracle、PostgreSQL等</li>
|
||
<li>
|
||
<strong>缓存</strong>: Redis</li>
|
||
<li>
|
||
<strong>文档</strong>: Knife4j 2.0.7</li>
|
||
<li>
|
||
<strong>工具库</strong>: Hutool 5.8.20</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="122-主要特性" class="anchor" href="#122-%E4%B8%BB%E8%A6%81%E7%89%B9%E6%80%A7"></a>1.2.2 主要特性</h3>
|
||
<ul>
|
||
<li>
|
||
<strong>前后端分离架构</strong>:前端基于最新的Vue3 + Ant Design Vue,后端基于 Spring Boot,前后端核心技术均为主流技术。</li>
|
||
<li>
|
||
<strong>开箱即用</strong>:无需进行复杂的二次集成。平台具备自动生成代码、接口管理、基于 RBAC 改进模型权限控制、数据大屏、Camunda 工作流、打印模板、在线接口、Xss 防跨站攻击等功能,并集成了集团组织架构同步、短信邮件平台、待办推送、CAS单点登录等功能。</li>
|
||
<li>
|
||
<strong>在线自定义接口设计</strong>:用户只需要针对业务数据进行处理,即可在线生成接口,后端无需重新编译,实现“接口热插拔”,可供内外部进行调用,具备高扩展性、高移植性、高兼容性等特点。同时,平台提供大量接口相关功能,并提供大量接口示例,方便用户进行接口使用及系统集成。</li>
|
||
<li>
|
||
<strong>统一授权、认证</strong>:平台使用“Sa-Token”实现统一安全认证中心,并支持与集团统一认证的CAS单点登录、与EIP门户和移动办公对接的互信机制。</li>
|
||
<li>
|
||
<strong>灵活的权限控制</strong>:平台的权限控制基于RBAC改进模型,可通过组织架构信息,针对“功能”、“接口”、“数据”进行精细化管理,满足用户实施面向企业安全策略的需要。同时平台已实现集团三级管控模式的数据权限机制,方便实现平台单位对下属单位的数据管控需求。</li>
|
||
<li>
|
||
<strong>移动端支持</strong>:平台支持以H5的方式集成到移动办公中。同时根据需求的不同,平台提供了数据展示页设计和功能页设计两种移动端界面生成方式,生成基础的移动端页面,集成了移动端业务的增删查改和流程审批功能。</li>
|
||
<li>
|
||
<strong>代码生成器</strong>:平台基于“Mybatis-plus-generator”提供代码生成器功能,用户可通过可视化配置生成“Web 端”、“移动端”、“后端”代码,然后根据自身业务需要进行代码调整。生成的代码提供了基本的增删查改功能和流程审批集成,极大提高了代码开发效率。</li>
|
||
<li>
|
||
<strong>零代码开发</strong>:平台提供自定义表单功能,根据平台提供的“组件池”,用户通过简单的拖拽及配置则可以完成功能的设计和发布,设计完成的功能无需生成代码,直接嵌入系统,实现功能“热插拔”。</li>
|
||
<li>
|
||
<strong>工作流引擎</strong>:平台集成了符合BPMN设计规范的轻量级工作流引擎“Camunda”,功能更强大,架构更稳定。同时针对中国式工作流进行了深度的二次研发,提供了“表单发起流程”、“电子签章”、“流程委托”、“流程版本变更”、“流程传阅”等符合中国国情的工作流功能,并且重新设计了流程模板绘制页面,用户只需进行简单的拖拉拽和配置即可完成复杂的流程设计。</li>
|
||
<li>
|
||
<strong>BI设计</strong>:平台除了支持帆软大屏的集成,还提供了一个简单的BI引擎(桌面设计)集成了百度 Echarts、地图等插件,内置了表格、统计指标等用户常用组件,用户可以通过0代码的方式设计并实现BI大屏页面,同时发布成菜单供系统用户进行查看,平台管理员可以通过功能授权对用户进行权限控制。针对复杂的大屏驾驶舱需求,平台集成了goView组件,提供了更加强大和丰富的BI大屏设计组件,并支持vue代码级的修改。</li>
|
||
<li>
|
||
<strong>报表功能</strong>:除了支持帆软报表的集成,平台提供UReport报表开发和vue-plugin-hiprint打印组件,基于单元格迭代方式,可快速开发出各种类型复杂中式报表,同时可通过图形化配置实现“标准化”、“动态化”的打印模板,通过将模板中的相关组件绑定接口数据,可以实现传入不同数据显示不同的报表结果,最终完成“报表套打”、“格式规范”、“需要跟业务数据进行关联”的报表开发打印。</li>
|
||
<li>
|
||
<strong>多租户数据隔离</strong>:平台通过mybatis的tenant机制实现“字段级别”的数据隔离,即保证数据隔离的安全,也可实现跨租户的数据交流。管理员可以在平台的“租户管理”中进行租户授权和功能授权,租户之间共用组织架构、功能代码但存在数据隔离。</li>
|
||
<li>
|
||
<strong>信创数据库支持</strong>:平台可支持“人大金仓”、“达梦”、“高斯”等国产数据库,也兼容“MySQL”、“Oracle”、“PostgreSQL“等。</li>
|
||
<li>
|
||
<strong>文件存储</strong>:集成minio文件存储管理组件和kkFileView文件预览组件。</li>
|
||
<li>
|
||
<strong>定时任务</strong>:集成power-job定时任务,可动态完成任务的添加、修改、删除、暂停、恢复及日志查看等功能。</li>
|
||
<li>
|
||
<strong>消息服务</strong>:集成了集团的短信和邮件服务。</li>
|
||
<li>
|
||
<strong>安全功能</strong>:完善的xss防御、sql注入防御、黑白名单、接口限流、接口鉴权等。</li>
|
||
</ul>
|
||
<h2>
|
||
<a id="13-快速上手" class="anchor" href="#13-%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B"></a>1.3 快速上手</h2>
|
||
<ol>
|
||
<li>阅读《快速开发指南》明白整体开发流程</li>
|
||
<li>拉取空项目代码,修改数据库/redis等配置,启动项目程序</li>
|
||
<li>按照对应的前端/后端/移动端/大屏开发指南完成业务需求开发</li>
|
||
<li>查阅《常见业务场景开发示例》快速完成常见业务需求的开发</li>
|
||
<li>查阅《外部组件集成》与其他系统或服务进行对接集成</li>
|
||
<li>按照《部署指南》完成项目部署和上线</li>
|
||
<li>查阅《常见问题》快速定位常见问题原因和解决办法</li>
|
||
<li>查阅《核心功能设计和使用》了解框架底层设计思路,排查难度大的问题</li>
|
||
<li>查阅《更新日志》获取框架升级信息</li>
|
||
</ol></div><div class='title'>2. 快速开发指南</div><div class='content'><h3>
|
||
<a id="21-环境要求" class="anchor" href="#21-%E7%8E%AF%E5%A2%83%E8%A6%81%E6%B1%82"></a>2.1 环境要求</h3>
|
||
<ul>
|
||
<li>JDK 8+</li>
|
||
<li>Maven 3.6+</li>
|
||
<li>MySQL 5.7+</li>
|
||
<li>Redis 5.0+</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="22-项目配置" class="anchor" href="#22-%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE"></a>2.2 项目配置</h3>
|
||
<div class="markdown-code-block">
|
||
<pre lang="yaml" class="yaml"><code># application.yml
|
||
server:
|
||
port: 8080
|
||
|
||
spring:
|
||
datasource:
|
||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||
url: jdbc:mysql://localhost:3306/xjrsoft?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
|
||
username: root
|
||
password: root
|
||
|
||
redis:
|
||
host: localhost
|
||
port: 6379
|
||
database: 0
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<h3>
|
||
<a id="23-启动项目" class="anchor" href="#23-%E5%90%AF%E5%8A%A8%E9%A1%B9%E7%9B%AE"></a>2.3 启动项目</h3>
|
||
<div class="markdown-code-block">
|
||
<pre lang="bash" class="bash"><code>mvn spring-boot:run
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div></div><div class='title'>3. 核心功能使用</div><div class='content'><h3>
|
||
<a id="31-权限管理" class="anchor" href="#31-%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86"></a>3.1 权限管理</h3>
|
||
<ul>
|
||
<li>基于Sa-Token的权限控制</li>
|
||
<li>支持多角色</li>
|
||
<li>支持数据权限</li>
|
||
<li>支持接口权限</li>
|
||
<li>支持菜单权限</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="32-数据访问" class="anchor" href="#32-%E6%95%B0%E6%8D%AE%E8%AE%BF%E9%97%AE"></a>3.2 数据访问</h3>
|
||
<ul>
|
||
<li>MyBatis-Plus增强</li>
|
||
<li>多数据源支持</li>
|
||
<li>动态SQL</li>
|
||
<li>分页查询</li>
|
||
<li>逻辑删除</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="33-代码生成" class="anchor" href="#33-%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90"></a>3.3 代码生成</h3>
|
||
<ul>
|
||
<li>支持多种数据库</li>
|
||
<li>自定义模板</li>
|
||
<li>前后端代码生成</li>
|
||
<li>表单配置生成</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="34-工作流" class="anchor" href="#34-%E5%B7%A5%E4%BD%9C%E6%B5%81"></a>3.4 工作流</h3>
|
||
<ul>
|
||
<li>基于Camunda的工作流引擎</li>
|
||
<li>流程设计器</li>
|
||
<li>流程部署</li>
|
||
<li>任务管理</li>
|
||
<li>流程监控</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="35-报表功能" class="anchor" href="#35-%E6%8A%A5%E8%A1%A8%E5%8A%9F%E8%83%BD"></a>3.5 报表功能</h3>
|
||
<ul>
|
||
<li>基于UReport的报表系统</li>
|
||
<li>报表设计器</li>
|
||
<li>数据源配置</li>
|
||
<li>报表预览</li>
|
||
<li>报表导出</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="36-文件存储" class="anchor" href="#36-%E6%96%87%E4%BB%B6%E5%AD%98%E5%82%A8"></a>3.6 文件存储</h3>
|
||
<ul>
|
||
<li>支持多种云存储
|
||
<ul>
|
||
<li>七牛云</li>
|
||
<li>阿里云OSS</li>
|
||
<li>腾讯云COS</li>
|
||
<li>华为云OBS</li>
|
||
<li>MinIO</li>
|
||
</ul>
|
||
</li>
|
||
<li>文件上传下载</li>
|
||
<li>文件预览</li>
|
||
<li>文件管理</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="37-消息服务" class="anchor" href="#37-%E6%B6%88%E6%81%AF%E6%9C%8D%E5%8A%A1"></a>3.7 消息服务</h3>
|
||
<ul>
|
||
<li>短信服务</li>
|
||
<li>邮件服务</li>
|
||
<li>企业微信</li>
|
||
<li>钉钉集成</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="38-定时任务" class="anchor" href="#38-%E5%AE%9A%E6%97%B6%E4%BB%BB%E5%8A%A1"></a>3.8 定时任务</h3>
|
||
<ul>
|
||
<li>基于Power-Job的分布式任务调度</li>
|
||
<li>任务管理</li>
|
||
<li>任务监控</li>
|
||
<li>任务日志</li>
|
||
</ul></div><div class='title'>4. 后端开发</div><div class='content'><h3>
|
||
<a id="41-项目结构" class="anchor" href="#41-%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84"></a>4.1 项目结构</h3>
|
||
<p>src/main/java/com/xjrsoft/</p>
|
||
<p>├── common/ # 公共模块</p>
|
||
<p>├── config/ # 配置类</p>
|
||
<p>├── module/ # 业务模块</p>
|
||
<p>│ ├── authority/ # 权限模块</p>
|
||
<p>│ ├── system/ # 系统模块</p>
|
||
<p>│ ├── workflow/ # 工作流</p>
|
||
<p>│ ├── form/ # 表单模块</p>
|
||
<p>│ └── ...</p>
|
||
<p>└── ITCApplication.java</p>
|
||
<h3>
|
||
<a id="42-开发规范" class="anchor" href="#42-%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83"></a>4.2 开发规范</h3>
|
||
<ol>
|
||
<li>
|
||
<p>代码规范</p>
|
||
<ul>
|
||
<li>遵循阿里巴巴Java开发手册</li>
|
||
<li>使用Lombok简化代码</li>
|
||
<li>统一异常处理</li>
|
||
<li>统一返回格式</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>命名规范</p>
|
||
<ul>
|
||
<li>类名: 大驼峰命名</li>
|
||
<li>方法名: 小驼峰命名</li>
|
||
<li>变量名: 小驼峰命名</li>
|
||
<li>常量名: 全大写下划线分隔</li>
|
||
<li>包名: 全小写点分隔</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>注释规范</p>
|
||
<ul>
|
||
<li>类注释: 说明类的用途</li>
|
||
<li>方法注释: 说明方法的功能、参数、返回值</li>
|
||
<li>关键代码注释: 说明复杂逻辑</li>
|
||
</ul>
|
||
</li>
|
||
</ol>
|
||
<h3>
|
||
<a id="43-开发流程" class="anchor" href="#43-%E5%BC%80%E5%8F%91%E6%B5%81%E7%A8%8B"></a>4.3 开发流程</h3>
|
||
<ol>
|
||
<li>创建数据库表</li>
|
||
<li>使用代码生成器生成基础代码</li>
|
||
<li>修改生成的代码</li>
|
||
<li>编写业务逻辑</li>
|
||
<li>编写单元测试</li>
|
||
<li>提交代码</li>
|
||
</ol></div><div class='title'>4.1 单体版</div><div class='content'><h2>
|
||
<a id="411单体版说明" class="anchor" href="#411%E5%8D%95%E4%BD%93%E7%89%88%E8%AF%B4%E6%98%8E"></a>4.1.1单体版说明</h2>
|
||
<h3>
|
||
<a id="框架定位" class="anchor" href="#%E6%A1%86%E6%9E%B6%E5%AE%9A%E4%BD%8D"></a>框架定位</h3>
|
||
<p>全代码开发平台(以下简称“平台”)是基于 <strong>Spring Boot 2.7.5 + Vue 3</strong> 的<strong>单体架构</strong>快速开发框架,整合了集团技术中台的核心能力,提供开箱即用的开发环境,适用于<strong>定制化业务系统</strong>开发。</p>
|
||
<p><strong>核心目标</strong></p>
|
||
<ul>
|
||
<li>
|
||
<strong>降低开发门槛</strong> :提供标准化技术栈,减少环境搭建和基础组件开发成本。</li>
|
||
<li>
|
||
<strong>提升开发效率</strong> :内置代码生成器、零代码表单、工作流引擎等工具,支持快速业务开发。</li>
|
||
<li>
|
||
<strong>保障技术合规</strong> :遵循集团技术规范,集成安全、权限、信创数据库等企业级能力。</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="技术架构图-" class="anchor" href="#%E6%8A%80%E6%9C%AF%E6%9E%B6%E6%9E%84%E5%9B%BE-"></a><strong>技术架构图</strong> <img src="https://foruda.gitee.com/images/1747214519828804736/ff0a505a_5089312.png" alt="技术架构图.png">
|
||
</h3>
|
||
<h3>
|
||
<a id="本地开发流程" class="anchor" href="#%E6%9C%AC%E5%9C%B0%E5%BC%80%E5%8F%91%E6%B5%81%E7%A8%8B"></a><strong>本地开发流程</strong>
|
||
</h3>
|
||
<p>如下图,单体版所有代码都在本地,前后端分离,后端代码都在一个程序内,所以开发调试都是在本地,相对简单。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747212342688998492/0ade0625_5089312.png" alt="image.png"></p>
|
||
<h2>
|
||
<a id="412初始化步骤" class="anchor" href="#412%E5%88%9D%E5%A7%8B%E5%8C%96%E6%AD%A5%E9%AA%A4"></a>4.1.2初始化步骤</h2>
|
||
<h3>
|
||
<a id="数据库初始化" class="anchor" href="#%E6%95%B0%E6%8D%AE%E5%BA%93%E5%88%9D%E5%A7%8B%E5%8C%96"></a><strong>数据库初始化</strong>
|
||
</h3>
|
||
<p>数据库初始化见项目的script/mysql全库.sql或人大金仓全库脚本.sql</p>
|
||
<h3>
|
||
<a id="后端配置" class="anchor" href="#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE"></a><strong>后端配置</strong>
|
||
</h3>
|
||
<p>创建配置文件application-local.yml用来做本地开发的配置</p>
|
||
<p>在application.yml配置文件中添加spring.profiles.active=local启用该新增的配置文件。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747211515541039837/08f58227_5089312.png" alt="image.png"></p>
|
||
<p>在新增的配置文件中,通过增加数据库链接、redis链接、单点回调地址、前端路由地址、生成代码路径等配置项</p>
|
||
<p>用自己的配置覆盖application.yml中的默认配置项。</p>
|
||
<p>注:其他环境的配置文件也通过这种方式进行管理。</p>
|
||
<h3>
|
||
<a id="启动后端" class="anchor" href="#%E5%90%AF%E5%8A%A8%E5%90%8E%E7%AB%AF"></a><strong>启动后端</strong>
|
||
</h3>
|
||
<p>直接运行Application文件即可启动后端项目。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747211650228285733/e76aeb9a_5089312.png" alt="image.png"></p>
|
||
<h3>
|
||
<a id="启动前端" class="anchor" href="#%E5%90%AF%E5%8A%A8%E5%89%8D%E7%AB%AF"></a><strong>启动前端</strong>
|
||
</h3>
|
||
<p><strong>前端运行前配置</strong></p>
|
||
<p>修改.env文件,配置前端项目端口号:VITE_PORT=3100(自定义)</p>
|
||
<p>修改.env.development文件修改后端服务地址:VITE_GLOB_API_URL=<a href="http://127.0.0.1:8080/">http://127.0.0.1:8080/</a></p>
|
||
<p><img src="https://foruda.gitee.com/images/1747216321038197144/218ddcf2_5089312.png" alt="image.png"></p>
|
||
<p><strong>前端运行</strong></p>
|
||
<p>安装依赖:cd front npm install或pnpm install</p>
|
||
<p>运行:npm run serve即可启动前端项目</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747211927367914726/9f5258f4_5089312.png" alt="image.png"></p>
|
||
<h2>
|
||
<a id="413开发示例" class="anchor" href="#413%E5%BC%80%E5%8F%91%E7%A4%BA%E4%BE%8B"></a>4.1.3开发示例</h2>
|
||
<p>以下会演示创建一个带流程的测试表单以供参考</p>
|
||
<ol>
|
||
<li>
|
||
<p>打开前端首页,输入用户名密码进行登录</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747278951106814397/d4b1ae65_5089312.png" alt="LoginPage.jpg"></p>
|
||
</li>
|
||
<li>
|
||
<p>创建数据表</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747290298249541744/c7b5922d_5089312.png" alt="workOrderPage.jpg"></p>
|
||
</li>
|
||
<li>
|
||
<p>点击左侧菜单:在线开发->代码生成
|
||
<strong>功能说明</strong>
|
||
界面优先:不需要事先准备表,先进行拖拉拽出界面,下一步后会自动根据表单生成表字段进行编辑
|
||
数据优先(较常用):需要事先准备表,拖拉拽的每个组件需要和表字段进行关联
|
||
简易模版:可以拖拉拽出不需要数据表的的功能
|
||
快速生成代码:根据所选的表根据表字段自动生成表单</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747279792556773154/02f67012_5089312.png" alt="CodeCreate.jpg"></p>
|
||
<p><strong>注</strong>:需根据实际业务需求进行代码生成,这里仅演示数据优先</p>
|
||
</li>
|
||
<li>
|
||
<p>填写基本信息</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747291191926379723/769fb2df_5089312.png" alt="基本信息.jpg"></p>
|
||
</li>
|
||
<li>
|
||
<p>拖拉拽表单</p>
|
||
<p>需要从左侧组件框里找到合适的组件类型拖入表单区域,然后选中组件后设置其右侧的属性,绑定表、字段等属性
|
||
响应式(推荐开启):开启后能够根据不同的屏幕尺寸、设备类型或容器大小自动调整其布局、样式或功能,以提供最佳的用户体验</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747291002358251764/9b509243_5089312.png" alt="表单设计.jpg"></p>
|
||
</li>
|
||
<li>
|
||
<p>表单事件</p>
|
||
<p>在此处可以添加自定义API、JS脚本到表单节点,比如表单加载前后、提交表单前后</p>
|
||
</li>
|
||
<li>
|
||
<p>界面设计</p>
|
||
<p>查询配置:定义列表页的查询项
|
||
列表配置:定义列表页的列属性、配置左侧的树配置、调整列的不同属性比如对齐方式、自适应宽度、列头筛选等
|
||
按钮设置:定义列表上的按钮,以及自定义按钮,需要注意如果开启流程需要勾选发起审批</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747291905932415985/ef482927_5089312.png" alt="发起审批按钮.jpg"></p>
|
||
</li>
|
||
<li>
|
||
<p>代码预览</p>
|
||
<p>此步可以查看生成出来的代码</p>
|
||
</li>
|
||
<li>
|
||
<p>菜单设置</p>
|
||
<p>设置业务菜单信息,可以将生成的代码打包下载成独立文件后续可以导入,也可以直接将代码文件生成到项目中</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747292141189438827/73aabd22_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
<li>
|
||
<p>生成代码与拷贝</p>
|
||
<p>前端代码会生成到配置文件application.yml中的 xjrsoft.generate.webPath=xxxxx 配置下(示例配置的路径是C:\Users\ITC\Desktop\codeGenerate)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747295445541338395/494509b7_5089312.png" alt="image.png"></p>
|
||
<p>后端由于选择了直接生成到项目中,后端文件会生成到src/main/java/com/xjrsoft/module/下</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747295518660126439/7ed5f589_5089312.png" alt="image.png"></p>
|
||
<p>拷贝代码到项目,将生成的文件C:\Users\ITC\Desktop\codeGenerate\src目录下的api和views拷贝到项目的src对应的目录下
|
||
<img src="https://foruda.gitee.com/images/1747292560563037360/0362eeaf_5089312.png" alt="image.png">
|
||
api目录:统一存放所有API请求定义,避免接口URL散落在各个组件中,便于维护
|
||
views目录:统一存放了页面组件,实现业务界面和用户交互</p>
|
||
<p><strong>注:可以在api和views下添加自己的业务代码</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>重启项目</p>
|
||
<p>重启项目后刷新页面即可看到新增的菜单和功能
|
||
注:此时表单还没有进行流程配置,还需要配置流程</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747292873407380427/89ea4b69_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
<li>
|
||
<p>新增流程设计</p>
|
||
<p>点击菜单 工作流程->流程设计 点击新增流程按钮
|
||
1、从左侧拖入需要的用户节点、网关、结束节点等
|
||
2、填写右侧流程属性信息,选择默认表单为之前创建的工单
|
||
3、选择某个节点设置节点审批人
|
||
4、选择关联功能tab->勾选是否启用按钮->选择功能表单->流程已添加表单->勾选工单点击确认->最后选择更新表单按钮->保存模版
|
||
注:后续表单有字段调整也需要在此处更新表单并保存</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747293468659062907/22cfb1e1_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
<li>
|
||
<p>新增表单完成</p>
|
||
<p>刷新页面再次进入刚才新增的菜单,可以看到表单已经关联流程
|
||
至此新增带流程表单就完成了</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747293620315907556/502a0f8d_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
</ol></div><div class='title'>4.2 微服务版</div><div class='content'><h2>
|
||
<a id="421微服务版说明" class="anchor" href="#421%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%89%88%E8%AF%B4%E6%98%8E"></a>4.2.1微服务版说明</h2>
|
||
<p>微服务版本后端是共用一套基础服务,开发人员在本地运行自己的业务服务,连入集中的开发环境进行功能开发。</p>
|
||
<p>前端是只有一个前端项目不做拆分,本地运行整个前端项目,开发人员在上面添加自己的业务前端代码,连接共用的后端开发环境。</p>
|
||
<p>如下图,微服务版前端和业务服务后端的代码在本地,后端公共服务是部署在远程,本地接入远程的公共服务环境,再连回本地业务服务,相对复杂。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747212440221630322/86c493a8_5089312.png" alt="image.png"></p>
|
||
<p>开发时生成的业务代码,需要开发人员访问共用的开发环境的base服务,把代码拉下来,与本地的业务代码比对后合并到本地代码中,再提交到代码仓库。后期会添加把生成的业务代码打包下载的功能。</p>
|
||
<p>因此前端部分的部署运行方式同4.1章节的单体版本,只是把后端地址改成共用的开发环境的gateway服务的地址。</p>
|
||
<h2>
|
||
<a id="422微服务版配置" class="anchor" href="#422%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%89%88%E9%85%8D%E7%BD%AE"></a>4.2.2微服务版配置</h2>
|
||
<p>微服务应用的配置主要是使用SpringBoot和Nacos的配置方式。</p>
|
||
<p>SpringBoot的bootstrap.yml配置了微服务应用的名称和端口,以及要接入的Nacos的注册和配置中心的地址、命名空间、分组,还有其他本地开发相关的或不能放置到Nacos的配置项。</p>
|
||
<h2>
|
||
<a id="423本地开发" class="anchor" href="#423%E6%9C%AC%E5%9C%B0%E5%BC%80%E5%8F%91"></a>4.2.3本地开发</h2>
|
||
<ol>
|
||
<li>在bootstrap.yml中给业务服务确定端口号和服务名。</li>
|
||
<li>修改spring.cloud.nacos的注册和配置中心为共用开发环境中的nacos地址、命名空间和分组。</li>
|
||
<li>启动服务。</li>
|
||
<li>如果业务服务需要使用自己的数据库,是在共用开发环境的多数据源中进行配置使用的。</li>
|
||
</ol>
|
||
<p><strong>本地开发业务服务接入远程公共服务</strong></p>
|
||
<ol>
|
||
<li>
|
||
<p>本地启动整个前端应用,例如local-front,连接的后端设置为远程公共服务的gateway服务;</p>
|
||
</li>
|
||
<li>
|
||
<p>本地启动要开发的业务服务,例如local-business-service,配置接入nacos的注册中心;</p>
|
||
</li>
|
||
<li>
|
||
<p>修改gateway服务路由的配置spring.cloud.gateway.routes,添加自己业务的资源路径路由到的本地服务的定义,例如</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747213070211462278/60c209b2_5089312.png" alt="image.png"></p>
|
||
<p>就是将前端应用/ast_asset/**路径的请求直接路由到本地开发的业务服务asset-service-yyn,即可将本地前后端应用对应运行起来进行开发。</p>
|
||
<p><strong>注意</strong>,由于gateway的路由机制是从前往后匹配,匹配到即直接路由,<strong>因此业务服务的路由需要放置在最后一个通用路由规则之前</strong>,防止被路由到base服务去。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747213264038062471/3decb966_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
</ol>
|
||
<h2>
|
||
<a id="424开发示例" class="anchor" href="#424%E5%BC%80%E5%8F%91%E7%A4%BA%E4%BE%8B"></a>4.2.4开发示例</h2>
|
||
<p>以下演示微服务版带流程的测试表单以供参考</p>
|
||
<ol>
|
||
<li>
|
||
<p>nacos上确定所有服务都已启动</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747304223815212287/9942d5d3_5089312.png" alt="服务列表.jpg"></p>
|
||
</li>
|
||
<li>
|
||
<p>配置并启动前端
|
||
前端的.env文件的VITE_GLOB_API_URL指向远程公共服务的gateway服务ip:port</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747304636838449768/a9a6478a_5089312.png" alt="前端接口配置.jpg">
|
||
启动前端,输入用户名密码进行登录</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747304872595993981/a862ea0f_5089312.png" alt="微服务登录页.jpg"></p>
|
||
</li>
|
||
<li>
|
||
<p>创建并启动业务服务</p>
|
||
<p>创建启动业务服务后配置中接入nacos配置中心
|
||
配置cloud.nacos.config.server-addr=nacos配置中心地址</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747360157527309132/bb08e4f1_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
<li>
|
||
<p>nacos添加业务资源路径
|
||
在nacos的配置中心找到对应的gateway配置,编辑spring.cloud.gateway.routes,增加自己的业务资源路径,发布更新即可
|
||
注意:需要将新增的配置放到最后一个通用路由规则之前,因为gateway匹配机制是从前向后的</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747361981411700632/e8a888f4_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
<li>
|
||
<p>准备业务数据表与新增代码生成</p>
|
||
<ul>
|
||
<li>创建数据表
|
||
<img src="https://foruda.gitee.com/images/1747290298249541744/c7b5922d_5089312.png" alt="workOrderPage.jpg">
|
||
</li>
|
||
<li>点击左侧菜单:在线开发->代码生成
|
||
<strong>功能说明</strong>
|
||
界面优先:不需要事先准备表,先进行拖拉拽出界面,下一步后会自动根据表单生成表字段进行编辑
|
||
数据优先(较常用):需要事先准备表,拖拉拽的每个组件需要和表字段进行关联
|
||
简易模版:可以拖拉拽出不需要数据表的的功能
|
||
快速生成代码:根据所选的表根据表字段自动生成表单
|
||
<img src="https://foruda.gitee.com/images/1747279792556773154/02f67012_5089312.png" alt="CodeCreate.jpg">
|
||
<strong>注</strong>:需根据实际业务需求进行代码生成,这里仅演示数据优先</li>
|
||
<li>填写基本信息
|
||
<img src="https://foruda.gitee.com/images/1747361659412198664/9541fe62_5089312.png" alt="image.png">
|
||
</li>
|
||
<li>拖拉拽表单
|
||
需要从左侧组件框里找到合适的组件类型拖入表单区域,然后选中组件后设置其右侧的属性,绑定表、字段等属性
|
||
响应式(推荐开启):开启后能够根据不同的屏幕尺寸、设备类型或容器大小自动调整其布局、样式或功能,以提供最佳的用户体验
|
||
<img src="https://foruda.gitee.com/images/1747361734016395152/8cb24133_5089312.png" alt="image.png">
|
||
</li>
|
||
<li>表单事件
|
||
在此处可以添加自定义API、JS脚本到表单节点,比如表单加载前后、提交表单前后</li>
|
||
<li>界面设计
|
||
查询配置:定义列表页的查询项
|
||
列表配置:定义列表页的列属性、配置左侧的树配置、调整列的不同属性比如对齐方式、自适应宽度、列头筛选等
|
||
按钮设置:定义列表上的按钮,以及自定义按钮,需要注意如果开启流程需要勾选发起审批
|
||
<img src="https://foruda.gitee.com/images/1747291905932415985/ef482927_5089312.png" alt="发起审批按钮.jpg">
|
||
</li>
|
||
<li>代码预览
|
||
此步可以查看生成出来的代码</li>
|
||
<li>菜单设置
|
||
设置业务菜单信息,可以将生成的代码打包下载成独立文件后续可以复制到项目
|
||
<img src="https://foruda.gitee.com/images/1747379051391602809/6b82b6a0_5089312.png" alt="image.png">
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>生成代码与拷贝</p>
|
||
<p>注:基础服务是公用的,所以代码生成都要用打包下载做例子,包括前端的
|
||
所以这里选择打包下载,会直接将前后端代码打包成压缩包自动下载
|
||
<img src="https://foruda.gitee.com/images/1747380201827995442/214128b3_5089312.png" alt="image.png">
|
||
解压包结构如下,back:后端项目代码;front:前端项目代码</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747379818721970308/37296236_5089312.png" alt="image.png">
|
||
只需要将其复制到对应前后端项目中即可</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747379980642231518/ceb581fe_5089312.png" alt="image.png">
|
||
<img src="https://foruda.gitee.com/images/1747380250209430654/288e1939_5089312.png" alt="image.png">
|
||
api目录:统一存放所有API请求定义,避免接口URL散落在各个组件中,便于维护
|
||
views目录:统一存放了页面组件,实现业务界面和用户交互
|
||
<strong>注:可以在api和views下添加自己的业务代码</strong></p>
|
||
</li>
|
||
<li>
|
||
<p>重启项目</p>
|
||
<p>重启项目后刷新页面即可看到新增的菜单和功能
|
||
注:此时表单还没有进行流程配置,还需要配置流程</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747362039900525494/d32fab70_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
<li>
|
||
<p>新增流程设计</p>
|
||
<p>点击菜单 工作流程->流程设计 点击新增流程按钮
|
||
1、从左侧拖入需要的用户节点、网关、结束节点等
|
||
2、填写右侧流程属性信息,选择默认表单为之前创建的工单
|
||
3、选择某个节点设置节点审批人
|
||
4、选择关联功能tab->勾选是否启用按钮->选择功能表单->流程已添加表单->勾选工单点击确认->最后选择更新表单按钮->保存模版
|
||
注:后续表单有字段调整也需要在此处更新表单并保存</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747293468659062907/22cfb1e1_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
<li>
|
||
<p>新增表单完成</p>
|
||
<p>刷新页面再次进入刚才新增的菜单,可以看到表单已经关联流程
|
||
至此新增带流程表单就完成了</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747293620315907556/502a0f8d_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
</ol>
|
||
<h2>
|
||
<a id="425跨服务调用" class="anchor" href="#425%E8%B7%A8%E6%9C%8D%E5%8A%A1%E8%B0%83%E7%94%A8"></a>4.2.5跨服务调用</h2>
|
||
<p>注:跨服务调用(如 workorder-service 调用 user-service 或其他服务)使用 FeignClient</p>
|
||
<ul>
|
||
<li>假设user-service服务提供getInfoByUserName接口
|
||
<img src="https://foruda.gitee.com/images/1747383195213235308/279ba8cd_5089312.png" alt="image.png">
|
||
</li>
|
||
<li>在workorder-service中定义FeignClient客户端接口
|
||
<img src="https://foruda.gitee.com/images/1747382747855204636/7a5438a3_5089312.png" alt="image.png">
|
||
value:指定目标服务名(必须与注册中心一致)
|
||
path:指定该服务的统一API前缀
|
||
@GetMapping与目标服务的接口定义一致</li>
|
||
<li>在workorder-service的业务代码中调用
|
||
<img src="https://foruda.gitee.com/images/1747383026389748116/46f0c427_5089312.png" alt="image.png">
|
||
</li>
|
||
</ul></div><div class='title'>4.3 多租户模式</div><div class='content'><h2>
|
||
<a id="431-开启多租户模式" class="anchor" href="#431-%E5%BC%80%E5%90%AF%E5%A4%9A%E7%A7%9F%E6%88%B7%E6%A8%A1%E5%BC%8F"></a><strong>4.3.1 开启多租户模式</strong>
|
||
</h2>
|
||
<p>全开框架默认是单租户模式,如果需要开启多租户模式,需要修改前端代码和后端代码的配置文件。</p>
|
||
<p>(1)后端配置修改:
|
||
在项目 spring boot 配置文件中加上以下配置:</p>
|
||
<div class="markdown-code-block">
|
||
<pre lang="properties" class="properties"><code>xjrsoft:
|
||
tenant:
|
||
enabled: true #是否启用多租户
|
||
admin-tenant-code: system #管理员租户编码
|
||
tenant-field: tenant_id #多租户 区分字段enantCode
|
||
default-tenant-code: system
|
||
is-use-default-tenant: true
|
||
hidden-sub-menu-ids:
|
||
- 1419273699655498176
|
||
- 1700041673784094722
|
||
ignore-table: #忽略多租户的表
|
||
- xjr_app_func_design
|
||
- xjr_app_menu
|
||
- xjr_app_page_design
|
||
- xjr_area
|
||
- xjr_code_schema
|
||
- xjr_databaselink
|
||
- xjr_language
|
||
- xjr_language_type
|
||
- xjr_liteflow_chain
|
||
- xjr_liteflow_script
|
||
- xjr_menu
|
||
- xjr_menu_button
|
||
- xjr_menu_column
|
||
- xjr_menu_form
|
||
- xjr_report
|
||
- xjr_report_relation
|
||
- xjr_subsystem
|
||
- xjr_tenant
|
||
- xjr_tenant_authorize
|
||
- xjr_app_menu_button
|
||
- xjr_app_menu_column
|
||
- xjr_app_menu_form
|
||
- xjr_app_authorize
|
||
- xjr_user
|
||
- xjr_department
|
||
- xjr_user_dept_relation
|
||
- xjr_authorize
|
||
- DEPT_TREE
|
||
- MENU_TREE
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>(2)前段配置修改:
|
||
在环境变量配置文件中加上变量 VITE_TENANT_ENABLED=true,如下图所示:</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747133990335423262/415d8da2_9136487.png" alt="image.png"></p>
|
||
<p>(3)给数据库表加上租户字段。
|
||
除了以上步骤(1)中配置了租户忽略的表(ignore-tabl:配置中列出的表))之外,其它数据表都加上 tenant_id 字段</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>加租户字段语句示例:ALTER TABLE xxx ADD tenant_id int8 NULL;
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<h2>
|
||
<a id="432-新建租户站点" class="anchor" href="#432-%E6%96%B0%E5%BB%BA%E7%A7%9F%E6%88%B7%E7%AB%99%E7%82%B9"></a>4.3.2 新建租户(站点)</h2>
|
||
<p>1.使用系统管理员账号(账号:admin,租户码:system)登录系统。</p>
|
||
<p>2.找到“系统管理---租户管理"模块,点击新增租户,填写唯一的租户名称和租户编码以及其它信息,如下图所示:</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747134803351893104/ba694640_9136487.png" alt="image.png"></p>
|
||
<p>3.点击功能授权,按需授予租户系统菜单的访问权限,如下图所示:</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747135091508522365/8e97e58f_9136487.png" alt="image.png"></p>
|
||
<h2>
|
||
<a id="433-配置站点管理员和员工角色" class="anchor" href="#433-%E9%85%8D%E7%BD%AE%E7%AB%99%E7%82%B9%E7%AE%A1%E7%90%86%E5%91%98%E5%92%8C%E5%91%98%E5%B7%A5%E8%A7%92%E8%89%B2"></a>4.3.3 配置站点管理员和员工角色</h2>
|
||
<p>1.使用系统管理员账号 admin,以目标站点的租户身份登录系统,如下图所示:</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747135965151101830/21c90183_9136487.png" alt="image.png"></p>
|
||
<p>2.进入到角色管理模块,创建一个站点管理员角色和至少一个用户,将用户添加为站点管理员角色、如下图所示:</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747136140659120132/5d28a082_9136487.png" alt="image.png"></p>
|
||
<p>3.打开功能授权、接口授权,将菜单、按钮、列表和接口的所有权限授予站点管理员,使其拥有对站点的最高级别管理权限,如下图所示:</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747136279698675277/227d428c_9136487.png" alt="image.png"></p>
|
||
<p>4.新建一个员工角色,按需授予其基本功能菜单权限。</p>
|
||
<h2>
|
||
<a id="434-表单个性化配置" class="anchor" href="#434-%E8%A1%A8%E5%8D%95%E4%B8%AA%E6%80%A7%E5%8C%96%E9%85%8D%E7%BD%AE"></a>4.3.4 表单个性化配置</h2>
|
||
<p>假设场景:租户 B 需要用到某张表单 form01,而该表单已经存在 A 租户下,并且已经生成了代码。</p>
|
||
<p>1.可以通过以下步骤完成表单 form01 在租户 B 下的配置:</p>
|
||
<p>(1).将 xjr_form_template 表中的 id 字段的主键属性去掉;给 tenant_id 字段设置默认值为 1;创建联合主键(id,tenant_id)。</p>
|
||
<p>sql 语句参考如下:</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>去掉id字段的主键属性:
|
||
ALTER TABLE xjr_form_template DROP CONSTRAINT "xxxx"; ---xxxx请改成具体的主键名称
|
||
给tenant_id字段设置默认值:
|
||
ALTER TABLE xjr_form_template ALTER COLUMN tenant_id SET DEFAULT 1;
|
||
创建联合主键的语句:
|
||
ALTER TABLE xjr_form_template ADD CONSTRAINT xjr_form_template_pk PRIMARY KEY (id,tenant_id);
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>(2).将表单 form01 对应的表单数据拷贝一份(xjr_form_template 表)为 insert 语句;保持 id 字段的值不变,将 tenant_id 字段修改为租户 B 的租户 id;执行 insert 语句。
|
||
如图所示:</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747138096698058921/3bbc3771_9136487.png" alt="image.png"></p>
|
||
<p>2.使用管理员账号 admin 以租户 B 的身份登录系统,在“表单设计”模块的“完整配置--> 渲染覆盖配置”中,可以根据租户需求,对表单详情页字段的名称和显隐、列表页展示字段、列表查询栏进行个性化配置。</p>
|
||
<p>配置方式:直接拷贝表单代码的 config.ts 文件中的配置粘贴到“渲染覆盖配置“一栏即可。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747138515604406197/4471df92_9136487.png" alt="image.png"></p>
|
||
<p><img src="https://foruda.gitee.com/images/1747138630494079227/fbf11c05_9136487.png" alt="image.png"></p>
|
||
<p>3.将需要进行个性化配置的表单的前端代码./components/config.ts路径中的配置useCustomConfig改成true.</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750919818808105264/f93146a1_9136487.png" alt="image.png"></p>
|
||
<p>配置示例:
|
||
现在用A租户的站点管理员账号登录系统,尝试对表单form01做以下配置:
|
||
(1)搜索栏配置成只保留姓名。
|
||
(2)列表栏展示姓名、性别、年龄,并且姓名字段改成显示成“名字”,占用500px宽度。
|
||
(3)表单详情页配置成显示姓名、性别,不显示年龄,并且将性别字段改成显示成英文“gender”</p>
|
||
<p>配置修改如下:
|
||
<img src="https://foruda.gitee.com/images/1747220797689092581/bc7e5d1f_9136487.png" alt="image.png">
|
||
<img src="https://foruda.gitee.com/images/1747220741746668744/729e685a_9136487.png" alt="image.png"></p>
|
||
<p>效果如下:</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747220989301927222/a352f613_9136487.png" alt="image.png"></p>
|
||
<p><img src="https://foruda.gitee.com/images/1747221007996399259/e4ba926a_9136487.png" alt="image.png"></p>
|
||
<p>其它租户的表单个性化配置,可以通过同样的方式实现,可以用目标租户的站点管理员账号登录后进行配置,也可以用系统管理员admin以目标租户身份登录进行配置。</p>
|
||
<h2>
|
||
<a id="435-流程设计" class="anchor" href="#435-%E6%B5%81%E7%A8%8B%E8%AE%BE%E8%AE%A1"></a>4.3.5 流程设计</h2>
|
||
<p>配置方式:使用系统管理员admin,以目标租户的身份登录系统,进入到“流程定义”模块,按照常规流程定义步骤,完成该租户下指定表单的流程定义。</p>
|
||
<p>示例:
|
||
(1)以A租户的身份登录系统,进行流程设计</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747218380857062414/65344e21_9136487.png" alt="image.png"></p>
|
||
<p>发起审批,效果如下:</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747219434072141869/0a217f71_9136487.png" alt="image.png"></p>
|
||
<p>(2)以B租户的身份登录系统,进行流程设计</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747218586903338916/35f09db4_9136487.png" alt="image.png"></p>
|
||
<p>发起审批,效果如下:</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747219248236210313/90be173d_9136487.png" alt="image.png"></p>
|
||
<h2>
|
||
<a id="436-代码逻辑差异化" class="anchor" href="#436-%E4%BB%A3%E7%A0%81%E9%80%BB%E8%BE%91%E5%B7%AE%E5%BC%82%E5%8C%96"></a>4.3.6 代码逻辑差异化</h2>
|
||
<p>如果是业务代码层面的差异,不能通过表单自定义配置覆盖的情况,需将差异的代码修改为接口中执行,不同租户通过配置不同的接口事件触发,从而执行差异化的业务代码逻辑。</p>
|
||
<p>可供使用的接口配置有:流程回调事件配置、表单事件配置,组件触发事件配置。</p>
|
||
<p>1.流程回调事件配置:如图所示,可以在流程设计页面中,在流程审批过程中的各个环节配置事件以执行个性化的业务逻辑。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1748326679916683718/bb128c96_9136487.png" alt="image.png"></p>
|
||
<p>2.表单事件配置:如下图示例,在初始化表单阶段,配置一个事件节点,调用api记录用户查看表单的事件。<img src="https://foruda.gitee.com/images/1748316825985563648/8fbd2b22_9136487.png" alt="image.png"></p>
|
||
<ol start="3">
|
||
<li>组件触发事件配置:如下图示例,给姓名字段配上blur事件,在失去焦点时,如果值不是男、女,则默认赋值为“男”</li>
|
||
</ol>
|
||
<p><img src="https://foruda.gitee.com/images/1748318936169970097/e2e43bf1_9136487.png" alt="image.png"></p>
|
||
<h2>
|
||
<a id="437-跨租户审批" class="anchor" href="#437-%E8%B7%A8%E7%A7%9F%E6%88%B7%E5%AE%A1%E6%89%B9"></a>4.3.7 跨租户审批</h2>
|
||
<p>打开跨租户的待办页面时,因为一个页面中包含很多个请求,只有第一个主请求有业务id的能查询数据所属租户,从而切换其他逻辑到另一个租户中处理,才能正确返回跨租户的数据,</p>
|
||
<p>但是页面后续的其他请求,例如枚举、触发事件之类的也需要同步传所属租户id才能正确返回跨租户的数据,但是组件数量太多,修改的工作量很大。</p>
|
||
<p>因此使用另一种切租户的方案:</p>
|
||
<p>待办列表返回有其他租户的数据,打开时如果单据不是当前租户的话,界面上提示用户:需要切换租户后才能打开,是否切换?是则自动切租户再跳转需要的待办,否则取消打开单据。</p>
|
||
<p>功能图示:
|
||
1.点击待办列表中的待审批流程,如果流程是从其它租户发起,则会弹出切换租户确定框。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747961936228427514/458b22db_9136487.png" alt="image.png"></p>
|
||
<p>2.切换完租户,页面右上角会弹出切换租户成功通知,用户可以继续完成审批操作。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1747962064380499873/9f628f5b_9136487.png" alt="image.png"></p>
|
||
<h1>
|
||
<a id="438-以某个租户的身份执行数据库查询" class="anchor" href="#438-%E4%BB%A5%E6%9F%90%E4%B8%AA%E7%A7%9F%E6%88%B7%E7%9A%84%E8%BA%AB%E4%BB%BD%E6%89%A7%E8%A1%8C%E6%95%B0%E6%8D%AE%E5%BA%93%E6%9F%A5%E8%AF%A2"></a>4.3.8 以某个租户的身份执行数据库查询。</h1>
|
||
<p>如果想临时以某个租户的身份执行一些数据库查询,可以通过以下方式实现:</p>
|
||
<p>try {
|
||
TenantUtil.doInTenant(1000000); --注意:该语句必须放在try{}代码块的第一行,以确保TenantUtil.doInTenant(tenantId)和TenantUtil.doInTenant()能同时得到执行
|
||
----代码块(在此代码块中的数据库查询,将会以id为1000000的租户的身份进行)
|
||
}finally{
|
||
TenantUtil.doInTenant();
|
||
}</p>
|
||
<h1>
|
||
<a id="439系统数据迁移功能" class="anchor" href="#439%E7%B3%BB%E7%BB%9F%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB%E5%8A%9F%E8%83%BD"></a>4.3.9系统数据迁移功能</h1>
|
||
<p>系统数据迁移功能可以用于跨环境数据迁移和跨租户数据复制。</p>
|
||
<p>1.相关概念说明:</p>
|
||
<p>跨环境数据迁移:简称数据迁移,指的是将数据从A环境迁移到B环境,常见于将数据从测试环境迁移到生产环境或者从生产环境迁移到测试环境。</p>
|
||
<p>跨租户数据复制:简称数据复制,指的是新建租户时,可以将现有租户的基础数据复制到新租户,以简化新租户的数据初始化过程。</p>
|
||
<p>2.功能讲解</p>
|
||
<p>(1)导出工作区:在导出工作区,选择需要导出的项目,然后点击“导出所选项目”完成对数据的导出。</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>说明:无论是数据迁移还是数据复制,导出步骤是一样的
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p><img src="https://foruda.gitee.com/images/1750921399816086964/dfaef3ea_9136487.png" alt="image.png"></p>
|
||
<p>(2)导入工作区:需要进行数据迁移时,请选择“覆盖模式导入”;需要数据复制时,请选择“租户模式导入”。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750921377230929590/0616a8fe_9136487.png" alt="image.png"></p></div><div class='title'>5. 前端开发</div><div class='content'><p>.keep</p></div><div class='title'>6. 移动端开发</div><div class='content'><p>.keep</p></div><div class='title'>7. 大屏开发</div><div class='content'><p>.keep</p></div><div class='title'>8. 外部组件集成</div><div class='content'><h1>
|
||
<a id="wps集成" class="anchor" href="#wps%E9%9B%86%E6%88%90"></a>wps集成</h1>
|
||
<p><img src="https://foruda.gitee.com/images/1750239753302395729/17b3817e_5089312.png" alt="image.png"></p>
|
||
<p>金山文档在线预览编辑服务,提供了文件预览、文件编辑服务</p>
|
||
<p>框架中实现了wps所需要的回调接口,由文档中台直接回调业务系统中的接口:获取文件元数据、保存新文件、获取用户信息、通知等接口</p>
|
||
<p>流程</p>
|
||
<ol>
|
||
<li>文档打开时会从后端获取文件在线编辑链接</li>
|
||
<li>前端向文档中台发起加载文件、权限等信息请求</li>
|
||
<li>文档中台向后端回调文件元数据、下载文件接口,后端返回文件元数据、文件数据</li>
|
||
<li>文档中台向前端返回文件、权限等信息</li>
|
||
<li>前端根据文件、权限、水印渲染文件内容</li>
|
||
<li>保存,文件编辑后会向中台发送文件保存新版本请求,文档中台回调后台上传文件新版本接口,后端返回保存结果后中台返回保存结果</li>
|
||
<li>通知,用户加入或退出协作请求获取用户信息回调接口,请求通知回调接口通知对接方此文件目前有哪些人在协作</li>
|
||
</ol>
|
||
<h2>
|
||
<a id="直连模式" class="anchor" href="#%E7%9B%B4%E8%BF%9E%E6%A8%A1%E5%BC%8F"></a>直连模式</h2>
|
||
<p>直连模式是业务系统不经由其他系统直接对接文档中台</p>
|
||
<p>注:需要在文档中台系统上配置回调接口地址为业务系统地址</p>
|
||
<h3>
|
||
<a id="启用和配置" class="anchor" href="#%E5%90%AF%E7%94%A8%E5%92%8C%E9%85%8D%E7%BD%AE"></a>启用和配置</h3>
|
||
<p>在后端配置文件中的xjrsoft下配置weboffice.enabled=true即可启用</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750318578722236951/31c7af89_5089312.png" alt="image.png"></p>
|
||
<h3>
|
||
<a id="效果" class="anchor" href="#%E6%95%88%E6%9E%9C"></a>效果</h3>
|
||
<p>前端字段类型为upload的组件后点击编辑文档按钮</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750325934300638171/e6556e06_5089312.png" alt="image.png"></p>
|
||
<p>只读模式</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750326025405925810/4b8b8b9a_5089312.png" alt="image.png"></p>
|
||
<p>编辑模式 <img src="https://foruda.gitee.com/images/1750326226217177980/f96cd99e_5089312.png" alt="image.png"></p>
|
||
<p>保存文件</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750326252197848283/cde8fa70_5089312.png" alt="image.png"></p>
|
||
<h3>
|
||
<a id="防火墙申请" class="anchor" href="#%E9%98%B2%E7%81%AB%E5%A2%99%E7%94%B3%E8%AF%B7"></a>防火墙申请</h3>
|
||
<p>直连模式需要申请业务端到文档中台间的防火墙</p>
|
||
<h2>
|
||
<a id="代理模式" class="anchor" href="#%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F"></a>代理模式</h2>
|
||
<p>代理模式流程</p>
|
||
<ol>
|
||
<li>是业务系统提前向代理服务注册本系统的前缀及回调地址</li>
|
||
<li>前端向后端获取文件在线编辑链接</li>
|
||
<li>前端向文档中台发起加载文件、权限等信息请求;请求url中的文件id带上本系统的前缀</li>
|
||
<li>文档中台回调代理服务,代理服务根据回调的文件id前缀找到对应的业务系统地址</li>
|
||
<li>代理服务根据业务系统地址转发请求到业务系统,回调文件元数据、下载文件等接口</li>
|
||
</ol>
|
||
<h3>
|
||
<a id="启用和配置-1" class="anchor" href="#%E5%90%AF%E7%94%A8%E5%92%8C%E9%85%8D%E7%BD%AE-1"></a>启用和配置</h3>
|
||
<ol>
|
||
<li>
|
||
<p>业务系统配置文件中增加系统标识用于区分不同业务系统</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750328599179592003/2e3a974f_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
<li>
|
||
<p>在代理服务系统中配置系统前缀和系统地址映射</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750327676529451748/ee1be83f_5089312.png" alt="image.png"></p>
|
||
</li>
|
||
</ol>
|
||
<h3>
|
||
<a id="效果-1" class="anchor" href="#%E6%95%88%E6%9E%9C-1"></a>效果</h3>
|
||
<p><img src="https://foruda.gitee.com/images/1750328481648245944/d29ee85e_5089312.png" alt="image.png"></p>
|
||
<h3>
|
||
<a id="防火墙申请-1" class="anchor" href="#%E9%98%B2%E7%81%AB%E5%A2%99%E7%94%B3%E8%AF%B7-1"></a>防火墙申请</h3>
|
||
<p>代理模式需要申请</p>
|
||
<p>1、业务系统到文档中台的防火墙</p>
|
||
<p>2、代理系统到业务系统的防火墙</p></div><div class='title'>9. 部署指南</div><div class='content'><h3>
|
||
<a id="91-环境准备" class="anchor" href="#91-%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87"></a>9.1 环境准备</h3>
|
||
<ol>
|
||
<li>可运行JDK环境(信创环境arm架构/麒麟系统,jdk为openjdk8以上)</li>
|
||
<li>生产环境建议双机热备加前置机共三台</li>
|
||
<li>需要安装的中间件:redis、nginx、kkfileview(附件预览)</li>
|
||
<li>需申请防火墙权限和资源的中间件:数据库(人大金仓)、minio(文件存储)、需要对接的系统:数据中台(人员组织同步)等</li>
|
||
</ol>
|
||
<h3>
|
||
<a id="92-打包部署" class="anchor" href="#92-%E6%89%93%E5%8C%85%E9%83%A8%E7%BD%B2"></a>9.2 打包部署</h3>
|
||
<div class="markdown-code-block">
|
||
<pre lang="bash" class="bash"><code># 打包
|
||
mvn clean package -DskipTests
|
||
|
||
# 运行
|
||
java -jar target/xjrsoft-framework.jar
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<h3>
|
||
<a id="93-docker部署" class="anchor" href="#93-docker%E9%83%A8%E7%BD%B2"></a>9.3 Docker部署</h3>
|
||
<div class="markdown-code-block">
|
||
<pre lang="yaml" class="yaml"><code># docker-compose.yml
|
||
version: '3'
|
||
services:
|
||
app:
|
||
build: .
|
||
ports:
|
||
- "8080:8080"
|
||
environment:
|
||
- SPRING_PROFILES_ACTIVE=prod
|
||
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/xjrsoft
|
||
- SPRING_REDIS_HOST=redis
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div></div><div class='title'>9.1 单体部署</div><div class='content'><h2>
|
||
<a id="911-前置条件" class="anchor" href="#911-%E5%89%8D%E7%BD%AE%E6%9D%A1%E4%BB%B6"></a>9.1.1 前置条件</h2>
|
||
<h3>
|
||
<a id="9111-uml部署流程图" class="anchor" href="#9111-uml%E9%83%A8%E7%BD%B2%E6%B5%81%E7%A8%8B%E5%9B%BE"></a>9.1.1.1 UML部署流程图</h3>
|
||
<p><img src="https://foruda.gitee.com/images/1750036041620562828/db282fb6_15898786.png" alt="image.png"></p>
|
||
<p>图1.1-1部署流程参考图</p>
|
||
<h3>
|
||
<a id="9112-服务器配置" class="anchor" href="#9112-%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE"></a>9.1.1.2 服务器配置</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>服务器</th>
|
||
<th></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>IP地址</td>
|
||
<td>10.0.252.28</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td>操作系统</td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td>名称</td>
|
||
<td>Debian GNU/Linux</td>
|
||
</tr>
|
||
<tr>
|
||
<td>版本</td>
|
||
<td>10 (buster)</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td>资源配置</td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td>CPU核心数</td>
|
||
<td>4核</td>
|
||
</tr>
|
||
<tr>
|
||
<td>内存</td>
|
||
<td>8GB</td>
|
||
</tr>
|
||
<tr>
|
||
<td>磁盘</td>
|
||
<td>350GB(未核实)</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>表1.2-1 部署的服务器说明表</p>
|
||
<h3>
|
||
<a id="9113-软件依赖" class="anchor" href="#9113-%E8%BD%AF%E4%BB%B6%E4%BE%9D%E8%B5%96"></a>9.1.1.3 软件依赖</h3>
|
||
<ul>
|
||
<li>
|
||
<p>JDK 安装及环境变量配置</p>
|
||
</li>
|
||
<li>
|
||
<p>Nginx 安装</p>
|
||
<p>注:本文档不再详细展开基础建设服务的部署细节(如JDK,Nginx,Mysql,Redis等),相关内容可参考组织过程资产库相关开发文档。</p>
|
||
</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="9114-目录规划" class="anchor" href="#9114-%E7%9B%AE%E5%BD%95%E8%A7%84%E5%88%92"></a>9.1.1.4 目录规划</h3>
|
||
<ul>
|
||
<li>
|
||
<p>后端部署目录(新建项目目录)</p>
|
||
<p><code>/data/wps-proxy/back/wps-proxy-back2025061304.jar</code></p>
|
||
</li>
|
||
<li>
|
||
<p>前端资源目录(新建项目目录)</p>
|
||
<p><code>/data/wps-proxy/web/dist/index.html</code></p>
|
||
</li>
|
||
<li>
|
||
<p>Nginx 配置目录(默认目录)</p>
|
||
<p><code>/usr/local/nginx/conf/nginx.conf</code></p>
|
||
</li>
|
||
</ul>
|
||
<h2>
|
||
<a id="912-后端部署" class="anchor" href="#912-%E5%90%8E%E7%AB%AF%E9%83%A8%E7%BD%B2"></a>9.1.2 后端部署</h2>
|
||
<h3>
|
||
<a id="9121-项目打包" class="anchor" href="#9121-%E9%A1%B9%E7%9B%AE%E6%89%93%E5%8C%85"></a>9.1.2.1 项目打包</h3>
|
||
<ul>
|
||
<li>Ø使用Maven命令打包:<code>mvn package</code>
|
||
</li>
|
||
<li>Ø或者使用Idea工具进行Maven打包,如图2.1-1所示</li>
|
||
</ul>
|
||
<p><img src="https://foruda.gitee.com/images/1750044578552918667/44992716_15898786.png" alt="e9dcab7fc6fcb53495d0f9afcaa07d13.png"></p>
|
||
<p>图2.1-1 部署打包说明图</p>
|
||
<p>Ø修改JAR包文件名称(以项目和版本日期加版本号数为目的,最终文件如图2.1-2所示):<code>wps-proxy-back2025061304.jar</code></p>
|
||
<p><img src="https://foruda.gitee.com/images/1750045059734076826/bdd1ceb8_15898786.png" alt="image.png"></p>
|
||
<p>图2.1-2 部署打包说明图</p>
|
||
<h3>
|
||
<a id="9122-上传部署包" class="anchor" href="#9122-%E4%B8%8A%E4%BC%A0%E9%83%A8%E7%BD%B2%E5%8C%85"></a>9.1.2.2 上传部署包</h3>
|
||
<p>1、使用FTP工具(如图2.2-1和2.2-2所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750054238059854074/172b7812_15898786.png" alt="image.png"></p>
|
||
<p>图2.2-1 上传部署包参考图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750054364517012002/545dcacf_15898786.png" alt="image.png"></p>
|
||
<p>图2.2-2 上传部署包参考图</p>
|
||
<p>Ø文件已经上传到服务器,将文件复制到指定文件夹即可(如下图2.2-3所示):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>cp /root/dne_back/wps-proxy-back2025061304.jar /data/wps-proxy/back/
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p><img src="https://foruda.gitee.com/images/1750054459508630328/86a12d52_15898786.png" alt="image.png"></p>
|
||
<p>图2.2-3 上传目录参考图</p>
|
||
<p>Ø最终文件目录如下(如下图2.2-4所示):<code>/data/wps-proxy/back/wps-proxy-back2025061304.jar</code>
|
||
<img src="https://foruda.gitee.com/images/1750054498083754416/158db6ad_15898786.png" alt="image.png"></p>
|
||
<p>图2.2-4 上传目录参考图</p>
|
||
<h3>
|
||
<a id="9123-编写脚本并启动服务" class="anchor" href="#9123-%E7%BC%96%E5%86%99%E8%84%9A%E6%9C%AC%E5%B9%B6%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1"></a>9.1.2.3 编写脚本并启动服务</h3>
|
||
<p>1、编写启动脚本</p>
|
||
<p>可直接使用命令启动(核心命令如下):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>nohup java -jar wps-proxy-back2025061304.jar --spring.profiles.active=dev > app.log 2>&1 &
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>也可编写启动脚本,示例:</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>#!/bin/bash
|
||
|
||
# 定义变量
|
||
JAR_NAME="wps-proxy-back2025061304.jar"
|
||
PROFILE="dev"
|
||
LOG_FILE="app.log"
|
||
|
||
# 停止已经运行的进程
|
||
echo "Stopping previous instance if exists..."
|
||
pkill -f $JAR_NAME
|
||
|
||
# 等待进程停止
|
||
sleep 3
|
||
|
||
# 启动应用
|
||
echo "Starting application..."
|
||
nohup java -jar $JAR_NAME --spring.profiles.active=$PROFILE > $LOG_FILE 2>&1 &
|
||
|
||
# 显示启动状态
|
||
if [ $? -eq 0 ]; then
|
||
echo "Application started successfully!"
|
||
echo "Log file: $LOG_FILE"
|
||
echo "You can check logs with: tail -f $LOG_FILE"
|
||
else
|
||
echo "Failed to start application!"
|
||
fi
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>2、将上述内容保存为 <code>start.sh</code> 文件</p>
|
||
<p>3、给脚本添加可执行权限:<code>chmod +x start.sh</code></p>
|
||
<p>4、运行脚本:<code>./start.sh</code></p>
|
||
<h2>
|
||
<a id="913-前端部署" class="anchor" href="#913-%E5%89%8D%E7%AB%AF%E9%83%A8%E7%BD%B2"></a>9.1.3 前端部署</h2>
|
||
<h3>
|
||
<a id="9131-项目打包" class="anchor" href="#9131-%E9%A1%B9%E7%9B%AE%E6%89%93%E5%8C%85"></a>9.1.3.1 项目打包</h3>
|
||
<p>开发人员打包成dist文件夹,如下图3.1-1所示</p>
|
||
<p>Ø打包命令:<code>npm run build</code></p>
|
||
<p><img src="https://foruda.gitee.com/images/1750056357992837346/ae8cb1f0_15898786.png" alt="image.png"></p>
|
||
<p>图3.1-1 前端打包说明图</p>
|
||
<p>最终文件夹:<code>E:\Project\yuedian\wps-proxy\front\dist\</code></p>
|
||
<h3>
|
||
<a id="9132-上传资源" class="anchor" href="#9132-%E4%B8%8A%E4%BC%A0%E8%B5%84%E6%BA%90"></a>9.1.3.2 上传资源</h3>
|
||
<p>1、使用FTP工具(如图3.2-1和3.2-2所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750056610086740767/cb5b269f_15898786.png" alt="image.png"></p>
|
||
<p>图3.2-1 上传前端包说明图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750056885594089274/35d6f307_15898786.png" alt="image.png"></p>
|
||
<p>图3.2-2 上传前端包说明图</p>
|
||
<p>Ø文件夹已经上传到服务器,将文件夹整个复制到指定文件夹即可(如下图3.2-3所示):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>cp -r /root/dne_back/dist /data/wps-proxy/web/
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p><img src="https://foruda.gitee.com/images/1750057193285397049/f909cfca_15898786.png" alt="image.png"></p>
|
||
<p>图3.2-3 前端包目录说明图</p>
|
||
<p>Ø最终文件目录如下(如下图3.2-4所示):<code>/data/wps-proxy/web/dist</code></p>
|
||
<p><img src="https://foruda.gitee.com/images/1750057294206965653/dd20dca7_15898786.png" alt="image.png"></p>
|
||
<p>图3.2-4 前端包目录说明图</p>
|
||
<h3>
|
||
<a id="9133-nginx配置" class="anchor" href="#9133-nginx%E9%85%8D%E7%BD%AE"></a>9.1.3.3 Nginx配置</h3>
|
||
<p>1、配置前端页面和后端接口的反向代理</p>
|
||
<p>Ø输入下方命令打开Nginx的配置文件(如下图3.3-1所示)</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>vim cat /usr/local/nginx/conf/nginx.conf
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p><img src="https://foruda.gitee.com/images/1750058048724480952/9dd7d1bc_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-1 打开nginx配置文件说明图</p>
|
||
<p>Ø按“i”键即可进行vim文本插入</p>
|
||
<p>Ø在最下方的“}”符号内插入以下脚本命令,如下图3.3-2所示(按需修改)</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>
|
||
server{
|
||
listen 80;
|
||
server_name 10.0.252.28;
|
||
|
||
root /data/wps-proxy/web/dist;
|
||
index index.html;
|
||
|
||
location / {
|
||
try_files $uri $uri/ /index.html;
|
||
}
|
||
|
||
location /api/ {
|
||
proxy_pass http://10.0.252.28:7020/;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
}
|
||
}
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p><img src="https://foruda.gitee.com/images/1750057623618561246/1d304ceb_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-2 修改nginx文件说明图</p>
|
||
<p>Ø最后按“Esc”键,再输入“:wq”即可保存。</p>
|
||
<p>2、重启nginx</p>
|
||
<p>Ø输入下方重载Nginx命令(如图所示)</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>/usr/local/nginx/sbin/nginx -s reload
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<h3>
|
||
<a id="9134-应用配置" class="anchor" href="#9134-%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE"></a>9.1.3.4 应用配置</h3>
|
||
<p>Ø这里需要修改页面调用的接口地址,输入以下命令编辑前端的配置文件,如图3.4-1所示</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>vim /data/wps-proxy/web/dist/_app.config.js
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p><img src="https://foruda.gitee.com/images/1750058261357141276/63e132e2_15898786.png" alt="image.png"></p>
|
||
<p>图3.4-1 前端配置文件说明图</p>
|
||
<p>Ø按“i”键即可进行vim文本插入</p>
|
||
<p>Ø将接口地址一项修改为服务器的IP和端口(Nginx代理后的地址),如图3.4-2所示:</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>"VITE_GLOB_API_URL":`http://10.0.252.28:80/api`
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p><img src="https://foruda.gitee.com/images/1750057369280849322/13a5923a_15898786.png" alt="image.png"></p>
|
||
<p>图3.4-2 前端接口配置说明图</p>
|
||
<p>Ø最后按“Esc”键,再输入“:wq”即可保存。</p>
|
||
<h2>
|
||
<a id="914-验证部署" class="anchor" href="#914-%E9%AA%8C%E8%AF%81%E9%83%A8%E7%BD%B2"></a>9.1.4 验证部署</h2>
|
||
<h3>
|
||
<a id="9141-后端验证" class="anchor" href="#9141-%E5%90%8E%E7%AB%AF%E9%AA%8C%E8%AF%81"></a>9.1.4.1 后端验证</h3>
|
||
<p>1、打开接口文档(如图4.1-1),如下图所示代表服务启动成功(这里用服务的实际地址):<code>http://10.0.252.28:7020/doc.html#/home</code></p>
|
||
<p><img src="https://foruda.gitee.com/images/1750058720786847376/d1aa9b42_15898786.png" alt="image.png"></p>
|
||
<p>图4.1-1 后端接口文档说明图</p>
|
||
<h3>
|
||
<a id="9142-前端验证" class="anchor" href="#9142-%E5%89%8D%E7%AB%AF%E9%AA%8C%E8%AF%81"></a>9.1.4.2 前端验证</h3>
|
||
<p>1、打开页面首页(如图4.2-1),如下图所示代表配置成功(Nginx的配置和dist的配置文件配置):<code>http://10.0.252.28/#/login</code></p>
|
||
<p><img src="https://foruda.gitee.com/images/1750058907066406463/a9a26878_15898786.png" alt="image.png"></p>
|
||
<p>图4.2-1 前端主页说明图</p>
|
||
<h3>
|
||
<a id="9143-日志检查" class="anchor" href="#9143-%E6%97%A5%E5%BF%97%E6%A3%80%E6%9F%A5"></a>9.1.4.3 日志检查</h3>
|
||
<p>1、打开后端日志</p>
|
||
<p>输入查看日志命令,如下图4.3-1所示代表启动成功:<code>tail -f /data/wps-proxy/back/app.log </code></p>
|
||
<p><img src="https://foruda.gitee.com/images/1750059243886969602/4c50d4ef_15898786.png" alt="16b17bcb89d1d5ec869225426946ddbe.png"></p>
|
||
<p>图4.3-1 后端日志说明图</p>
|
||
<p>2、打开Nginx日志</p>
|
||
<p>输入查看日志命令,如下图4.3-2所示最新日志没有出现报错日志即可:<code>tail -f /usr/local/nginx/logs/error.log</code></p>
|
||
<p><img src="https://foruda.gitee.com/images/1750059974850902184/ffda5ebd_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-2 nginx错误日志说明图</p></div><div class='title'>9.2 Docker部署</div><div class='content'><p>.keep</p></div><div class='title'>9.3 K8S集群部署</div><div class='content'><p><strong>文档背景</strong></p>
|
||
<p>随着云原生技术的全面落地,我司基础设施已逐步向容器化与Kubernetes平台迁移。为规范生产级容器编排管理,提升部署效率与系统可靠性,特制定此K8s集群部署文档,重点达成以下目标:</p>
|
||
<p><strong>技术架构统一化</strong></p>
|
||
<p>·明确基于Kubernetes的标准化部署架构</p>
|
||
<p>·定义Namespace、Deployment、Service等核心资源的配置规范</p>
|
||
<p><strong>部署流程标准化</strong></p>
|
||
<p>·从镜像构建到集群发布的完整操作链路说明</p>
|
||
<p><strong>运维协作可视化</strong></p>
|
||
<p>·声明运维团队与开发团队的职责交接点</p>
|
||
<p>·提供资源申请、变更审批、故障排查的标准流程</p>
|
||
<p>本次文档编制既作为集群管理的技术基准,也作为跨团队云原生能力建设的指导手册,后续将随K8s版本迭代持续更新。</p>
|
||
<h2>
|
||
<a id="931-图示以及说明" class="anchor" href="#931-%E5%9B%BE%E7%A4%BA%E4%BB%A5%E5%8F%8A%E8%AF%B4%E6%98%8E"></a>9.3.1 图示以及说明</h2>
|
||
<h3>
|
||
<a id="9311-组织架构图" class="anchor" href="#9311-%E7%BB%84%E7%BB%87%E6%9E%B6%E6%9E%84%E5%9B%BE"></a>9.3.1.1 组织架构图</h3>
|
||
<p><img src="https://foruda.gitee.com/images/1750298081251916106/c85b1022_15898786.png" alt="image.png"></p>
|
||
<p>图1.1-1组织架构图参考图</p>
|
||
<h3>
|
||
<a id="9312-建设服务器说明" class="anchor" href="#9312-%E5%BB%BA%E8%AE%BE%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AF%B4%E6%98%8E"></a>9.3.1.2 建设服务器说明</h3>
|
||
<p>这里准备了四台服务器搭建集群(4节点),如图表1.2-1所示:</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>服务器</th>
|
||
<th>服务器最低要求</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>192.168.133.137 (node1)(作为master节点)</td>
|
||
<td>CPU >= 2核心 / 内存>= 2GB / 能连接网络</td>
|
||
</tr>
|
||
<tr>
|
||
<td>192.168.133.138 (node2)</td>
|
||
<td>CPU >= 2核心 / 内存>= 2GB / 能连接网络</td>
|
||
</tr>
|
||
<tr>
|
||
<td>192.168.133.139 (node3)</td>
|
||
<td>CPU >= 2核心 / 内存>= 2GB / 能连接网络</td>
|
||
</tr>
|
||
<tr>
|
||
<td>192.168.133.140 (node4)</td>
|
||
<td>CPU >= 2核心 / 内存>= 2GB / 能连接网络</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>表1.2-1 部署的服务器说明表</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750298191400185254/2d9449a9_15898786.png" alt="image.png"></p>
|
||
<p>图1.2-1 部署的服务器说明图</p>
|
||
<h2>
|
||
<a id="932-初始配置" class="anchor" href="#932-%E5%88%9D%E5%A7%8B%E9%85%8D%E7%BD%AE"></a>9.3.2 初始配置</h2>
|
||
<h3>
|
||
<a id="9321-设置hosts文件所有的节点都执行" class="anchor" href="#9321-%E8%AE%BE%E7%BD%AEhosts%E6%96%87%E4%BB%B6%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.2.1 设置hosts文件(所有的节点都执行)</h3>
|
||
<p>作用: 通过手动配置 /etc/hosts 文件,确保集群节点之间可以通过主机名直接解析 IP,避免依赖 DNS 服务,提高节点通信的稳定性和可靠性(验证如图2.1-1所示)。</p>
|
||
<p>Ø执行命令(这个IP改为自己服务器的IP):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>echo "192.168.133.137 node1
|
||
|
||
192.168.133.138 node2
|
||
|
||
192.168.133.139 node3
|
||
|
||
192.168.133.140 node4" >> /etc/hosts
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>Ø执行命令(验证):cat /etc/hosts</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750298324063024360/b1374d86_15898786.png" alt="image.png"></p>
|
||
<p>图2.1-1 修改hosts说明图</p>
|
||
<h3>
|
||
<a id="9322-设置hostname所有的节点都执行" class="anchor" href="#9322-%E8%AE%BE%E7%BD%AEhostname%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.2.2 设置hostname(所有的节点都执行)</h3>
|
||
<p>作用: 为当前服务器设置永久主机名(如 node1),确保Kubernetes 集群节点能正确识别自身和同伴节点身份,避免因主机名冲突或未定义导致通信异常(如图2.2-1所示)。</p>
|
||
<p>Ø 执行命令(四台服务器分别使用node1/node2/node3/node4):hostnamectl set-hostname node1</p>
|
||
<p>Ø 执行命令(验证):cat /etc/hostname</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750298446762354062/0eb8acba_15898786.png" alt="image.png"></p>
|
||
<p>图2.2-1 修改hostname说明图</p>
|
||
<h3>
|
||
<a id="9323-时间同步所有的节点都执行" class="anchor" href="#9323-%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.2.3 时间同步(所有的节点都执行)</h3>
|
||
<p>作用: 确保 Kubernetes 集群所有节点的时间保持同步,避免因时间偏差导致证书失效、日志混乱、调度异常等问题(如图2.3-1所示)。</p>
|
||
<p>Ø 执行命令(启动chronyd服务):systemctl start chronyd</p>
|
||
<p>Ø 执行命令(设置):systemctl enable chronyd</p>
|
||
<p>Ø 执行命令(验证):date</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750298509791451404/b56f2598_15898786.png" alt="image.png"></p>
|
||
<p>图2.3-1 同步服务器时间说明图</p>
|
||
<h3>
|
||
<a id="9324-设置防火墙所有的节点都执行" class="anchor" href="#9324-%E8%AE%BE%E7%BD%AE%E9%98%B2%E7%81%AB%E5%A2%99%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.2.4 设置防火墙(所有的节点都执行)</h3>
|
||
<p>作用: 关闭防火墙(如 firewalld/iptables)可避免拦截 Kubernetes 集群组件间通信,确保节点、Pod 及服务正常互联,但生产环境建议改用精确放行规则以提升安全性(如图2.4-1所示)。</p>
|
||
<p>Ø执行命令(停止防火墙):systemctl stop firewalld</p>
|
||
<p>Ø执行命令(开机关闭防火墙):systemctl disable firewalld</p>
|
||
<p>Ø执行命令(验证):systemctl status firewalld</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750298566278466263/7ff1b2fd_15898786.png" alt="image.png"></p>
|
||
<p>图2.4-1 设置防火墙说明图</p>
|
||
<h3>
|
||
<a id="9325-设置selinux所有的节点都执行" class="anchor" href="#9325-%E8%AE%BE%E7%BD%AEselinux%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.2.5 设置selinux(所有的节点都执行)</h3>
|
||
<p>作用: 将selinux 从强制模式(enforcing)改为禁用模式(disabled),避免 Kubernetes 组件因安全策略限制导致权限不足或访问被拒绝的问题,简化集群部署流程(如图2.5-1所示)。</p>
|
||
<p>Ø执行命令(设置):sed -i 's/enforcing/disabled/' /etc/selinux/config</p>
|
||
<p>Ø执行命令(验证):getenforce</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750298637987077717/ef68ae89_15898786.png" alt="image.png"></p>
|
||
<p>图2.5-1 设置SElinux说明图</p>
|
||
<h3>
|
||
<a id="9326-设置swap分区所有的节点都执行" class="anchor" href="#9326-%E8%AE%BE%E7%BD%AEswap%E5%88%86%E5%8C%BA%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.2.6 设置swap分区(所有的节点都执行)</h3>
|
||
<p>作用: Kubernetes 要求节点禁用交换分区(swap),以确保内存管理和调度策略(如 kubelet 的资源分配)能够正确工作,避免因swap 使用导致性能下降或不可预测的行为(如图2.6-1所示)。</p>
|
||
<p>Ø执行命令(设置):sed -i "s/.<em>swap.</em>/#&/" /etc/fstab</p>
|
||
<p>Ø执行命令(验证):cat /etc/fstab</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750298719405557531/c3b3e075_15898786.png" alt="image.png"></p>
|
||
<p>图2.6-1 设置swap说明图</p>
|
||
<h3>
|
||
<a id="9327-设置网桥过滤和地址转发所有的节点都执行" class="anchor" href="#9327-%E8%AE%BE%E7%BD%AE%E7%BD%91%E6%A1%A5%E8%BF%87%E6%BB%A4%E5%92%8C%E5%9C%B0%E5%9D%80%E8%BD%AC%E5%8F%91%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.2.7 设置网桥过滤和地址转发(所有的节点都执行)</h3>
|
||
<p>作用:调整内核网络参数,确保 Kubernetes 的 CNI(容器网络插件,如 Calico、Flannel) 和 Service 网络(如 kube-proxy 的 iptables/IPVS 模式) 正常工作,解决容器跨节点通信和流量转发问题(如图2.7-1所示)。</p>
|
||
<p>Ø执行命令(设置):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>cat > /etc/sysctl.d/kubernetes.conf << EOF
|
||
|
||
net.bridge.bridge-nf-call-ip6tables = 1
|
||
|
||
net.bridge.bridge-nf-call-iptables = 1
|
||
|
||
net.ipv4.ip_forward = 1
|
||
|
||
EOF
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>Ø 执行命令(执行生效):sysctl --system</p>
|
||
<p>Ø 执行命令(验证):sysctlnet.bridge.bridge-nf-call-iptables net.ipv4.ip_forward</p>
|
||
<p>注意:如果报错系统当前缺少 bridge-nf-call-iptables 相关的内核模块支持,需要加载 br_netfilter 内核模块,执行加载命令:sudo modprobe br_netfilter</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750298843959766873/cccdef88_15898786.png" alt="image.png"></p>
|
||
<p>图2.7-1 设置网桥过滤和地址转发说明图</p>
|
||
<h3>
|
||
<a id="9328-设置国内yum源非必须如需则所有的节点都执行" class="anchor" href="#9328-%E8%AE%BE%E7%BD%AE%E5%9B%BD%E5%86%85yum%E6%BA%90%E9%9D%9E%E5%BF%85%E9%A1%BB%E5%A6%82%E9%9C%80%E5%88%99%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.2.8 设置国内yum源(非必须,如需则所有的节点都执行)</h3>
|
||
<p>作用: 将默认的 CentOS Yum 源替换为国内镜像(如阿里云),加速软件包下载,解决官方源访问慢或不可用的问题,确保 Kubernetes 依赖的组件(如 docker-ce、kubeadm)能快速安装(如图2.8-1所示)。</p>
|
||
<p>Ø 执行命令(备份当前的yum源):mv /etc/yum.repos.d /etc/yum.repos.d.backup4comex</p>
|
||
<p>Ø 执行命令(新建空的yum源设置目录):mkdir /etc/yum.repos.d</p>
|
||
<p>Ø 执行命令(下载阿里云的yum源配置):curl -o /etc/yum.repos.d/CentOS-Base.repo <a href="https://mirrors.aliyun.com/repo/Centos-7.repo">https://mirrors.aliyun.com/repo/Centos-7.repo</a></p>
|
||
<p>Ø 执行命令(清除):yum clean all</p>
|
||
<p>Ø 执行命令(重建):yum makecache</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750298963000833485/b4aca6b6_15898786.png" alt="image.png"></p>
|
||
<p>图2.8-1 设置国内yum源说明图</p>
|
||
<h2>
|
||
<a id="933-安装docker" class="anchor" href="#933-%E5%AE%89%E8%A3%85docker"></a>9.3.3 安装Docker</h2>
|
||
<h3>
|
||
<a id="9331-设置国内docker源非必须如需则所有的节点都执行" class="anchor" href="#9331-%E8%AE%BE%E7%BD%AE%E5%9B%BD%E5%86%85docker%E6%BA%90%E9%9D%9E%E5%BF%85%E9%A1%BB%E5%A6%82%E9%9C%80%E5%88%99%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.3.1 设置国内docker源(非必须,如需则所有的节点都执行)</h3>
|
||
<p>作用: 将 Docker 官方 Yum 仓库(download.docker.com)替换为阿里云镜像源,解决国内下载 Docker 组件(如 docker-ce、containerd.io)速度慢或无法访问的问题,确保容器运行时环境能快速安装(如图3.1-1所示)</p>
|
||
<p>Ø 执行命令(配置): curl -o /etc/yum.repos.d/docker-ce.repo <a href="https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo">https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</a></p>
|
||
<p>Ø 执行命令(清除):yum clean all</p>
|
||
<p>Ø 执行命令(重建):yum makecache</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750302432693786988/e081af48_15898786.png" alt="image.png"></p>
|
||
<p>图3.1-1 设置国内docker源说明图</p>
|
||
<h3>
|
||
<a id="9332-下载docker所有的节点都执行" class="anchor" href="#9332-%E4%B8%8B%E8%BD%BDdocker%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.3.2 下载docker(所有的节点都执行)</h3>
|
||
<p>作用: Docker 作为容器运行时(Container Runtime)为 Kubernetes 提供底层容器管理能力(创建、运行容器),但新版 K8s 已转向更轻量的 containerd 或 CRI-O,不再强制依赖 Docker(如图3.2-1所示)。</p>
|
||
<p>Ø执行命令(下载):yum install -y docker-ce-20.10.9-3.el7 docker-ce-cli-20.10.9-3.el7 containerd.io-1.6.6-3.1.el7 docker-compose-plugin-2.6.0-3.el7</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750302498627805959/ba05aed9_15898786.png" alt="image.png"></p>
|
||
<p>图3.2-1 下载docker说明图</p>
|
||
<h3>
|
||
<a id="9333-设置daemonjson所有的节点都执行" class="anchor" href="#9333-%E8%AE%BE%E7%BD%AEdaemonjson%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.3.3 设置daemon.json(所有的节点都执行)</h3>
|
||
<p>作用: 通过 daemon.json 配置 Docker 守护进程(dockerd)的核心参数,包括镜像加速、存储驱动、日志选项、网络设置等,以优化容器运行环境并适配 Kubernetes 需求。</p>
|
||
<p>Ø执行命令(创建目录):mkdir /etc/docker</p>
|
||
<p>Ø执行命令(编辑文件):vi /etc/docker/daemon.json</p>
|
||
<p>将daemon.json内容替换至如下内容并保存(如图3.3-1所示):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>{
|
||
"exec-opts": [
|
||
"native.cgroupdriver=systemd"
|
||
],
|
||
"log-driver": "json-file",
|
||
"log-opts": {
|
||
"max-size": "100m"
|
||
},
|
||
"storage-driver": "overlay2",
|
||
"storage-opts": [
|
||
"overlay2.override_kernel_check=true"
|
||
]
|
||
}
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p><img src="https://foruda.gitee.com/images/1750302724486133303/8753a727_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-1 配置daemon.json文件说明图</p>
|
||
<h3>
|
||
<a id="9334-启动docker所有的节点都执行" class="anchor" href="#9334-%E5%90%AF%E5%8A%A8docker%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.3.4 启动docker(所有的节点都执行)</h3>
|
||
<p>Ø 执行命令(启动):systemctl restart docker</p>
|
||
<p>Ø 执行命令(开机自启):systemctl enable docker</p>
|
||
<p>Ø 执行命令(验证如图3.4-1所示):systemctl status docker</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750302986119269159/ac42949f_15898786.png" alt="image.png"></p>
|
||
<p>图3.4-1 启动docker说明图</p>
|
||
<h2>
|
||
<a id="934-安装kubernetes" class="anchor" href="#934-%E5%AE%89%E8%A3%85kubernetes"></a>9.3.4 安装Kubernetes</h2>
|
||
<h3>
|
||
<a id="9341-设置国内kubernetes源所有的节点都执行" class="anchor" href="#9341-%E8%AE%BE%E7%BD%AE%E5%9B%BD%E5%86%85kubernetes%E6%BA%90%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.4.1 设置国内Kubernetes源(所有的节点都执行)</h3>
|
||
<p>作用: 将 Kubernetes 官方 Yum 仓库(<a href="https://packages.cloud.google.com%EF%BC%89%E6%9B%BF%E6%8D%A2%E4%B8%BA%E9%98%BF%E9%87%8C%E4%BA%91%E9%95%9C%E5%83%8F%E6%BA%90%EF%BC%8C%E8%A7%A3%E5%86%B3%E5%9B%BD%E5%86%85%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E6%88%96%E4%B8%8B%E8%BD%BD%E9%80%9F%E5%BA%A6%E6%85%A2%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%8C%E7%A1%AE%E4%BF%9Dkubeadm%E3%80%81kubelet%E3%80%81kubectl">https://packages.cloud.google.com)替换为阿里云镜像源,解决国内无法访问或下载速度慢的问题,确保kubeadm、kubelet、kubectl</a> 等组件能够快速、稳定安装(如图4.1-1所示)。</p>
|
||
<p>Ø执行命令:</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>cat <<EOF > /etc/yum.repos.d/kubernetes.repo
|
||
[kubernetes]
|
||
name=Kubernetes
|
||
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
|
||
enabled=1
|
||
gpgcheck=0
|
||
repo_gpgcheck=0
|
||
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
|
||
EOF
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>Ø 执行命令(清除):yum clean all</p>
|
||
<p>Ø 执行命令(重建):yum makecache</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750314888297212352/8fed9cec_15898786.png" alt="image.png"></p>
|
||
<p>图4.1-1设置国内Kubernetes源示意图</p>
|
||
<h3>
|
||
<a id="9342-下载kubeadmkubelet-kubectl所有的节点都执行" class="anchor" href="#9342-%E4%B8%8B%E8%BD%BDkubeadmkubelet-kubectl%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.4.2 下载kubeadm/kubelet /kubectl(所有的节点都执行)</h3>
|
||
<p>Ø 执行命令(下载,如图4.2-1所示): yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0</p>
|
||
<p>Ø 执行命令(启动):systemctl status kubelet</p>
|
||
<p>Ø 执行命令(开机自启,非必须):systemctl enable kubelet</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750314977666110382/4f698039_15898786.png" alt="image.png"></p>
|
||
<p>图4.2-1安装K8S组件示意图</p>
|
||
<h2>
|
||
<a id="935-部署kubernetes集群" class="anchor" href="#935-%E9%83%A8%E7%BD%B2kubernetes%E9%9B%86%E7%BE%A4"></a>9.3.5 部署Kubernetes集群</h2>
|
||
<h3>
|
||
<a id="9351-预下载镜像在master节点执行" class="anchor" href="#9351-%E9%A2%84%E4%B8%8B%E8%BD%BD%E9%95%9C%E5%83%8F%E5%9C%A8master%E8%8A%82%E7%82%B9%E6%89%A7%E8%A1%8C"></a>9.3.5.1 预下载镜像(在master节点执行)</h3>
|
||
<p>作用:预先从阿里云镜像仓库下载 Kubernetes 控制平面所需的所有容器镜像,确保 kubeadm init 初始化 master 节点时能快速顺利完成,避免因网络问题导致安装失败(如图5.1-1所示)。</p>
|
||
<p>Ø 执行命令(拉取):kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750315161061559421/618b5c33_15898786.png" alt="image.png"></p>
|
||
<p>图5.1-1预下载镜像示意图</p>
|
||
<h3>
|
||
<a id="9352-初始化kubernetes在master节点执行" class="anchor" href="#9352-%E5%88%9D%E5%A7%8B%E5%8C%96kubernetes%E5%9C%A8master%E8%8A%82%E7%82%B9%E6%89%A7%E8%A1%8C"></a>9.3.5.2 初始化kubernetes(在master节点执行)</h3>
|
||
<p>Ø 执行命令:</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>kubeadm init \
|
||
--apiserver-advertise-address=192.168.133.137 \
|
||
--image-repository registry.aliyuncs.com/google_containers \
|
||
--kubernetes-version v1.23.0 \
|
||
--service-cidr=10.96.0.0/12 \
|
||
--pod-network-cidr=10.244.0.0/16 \
|
||
--ignore-preflight-errors=all
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>备注:</p>
|
||
<p>–apiserver-advertise-address # 集群通告地址(master 机器IP)</p>
|
||
<p>–image-repository # 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址</p>
|
||
<p>–kubernetes-version #K8s版本,与上面安装的一致</p>
|
||
<p>–service-cidr #集群内部虚拟网络,Pod统一访问入口,可以不用更改,直接用上面的参数</p>
|
||
<p>–pod-network-cidr #Pod网络,与下面部署的CNI网络组件yaml中保持一致,可以不用更改,直接用上面的参数</p>
|
||
<p>Ø上述命令执行完之后控制台末尾有加入集群的join命令,需要复制记录下来,子节点加入集群需要用到该命令(如图5.2-1所示)示例:</p>
|
||
<p>kubeadm join 192.168.133.137:6443 --token gx38zz.iokskhaa4uehb9nr--discovery-token-ca-cert-hash sha256:5e84b16ac4c5c52da4225162b1574316797e518d26e8dd0c26a2aa6a3253038c</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750315656320689437/465ab745_15898786.png" alt="image.png"></p>
|
||
<p>图5.2-1初始化K8S示意图</p>
|
||
<h3>
|
||
<a id="9353-设置kubectl命令行工具环境在master节点执行" class="anchor" href="#9353-%E8%AE%BE%E7%BD%AEkubectl%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7%E7%8E%AF%E5%A2%83%E5%9C%A8master%E8%8A%82%E7%82%B9%E6%89%A7%E8%A1%8C"></a>9.3.5.3 设置kubectl命令行工具环境(在master节点执行)</h3>
|
||
<p>作用:配置 kubectl 的访问权限、设置环境变量、优化命令行体验,确保能顺利使用 kubectl管理 Kubernetes 集群(如图5-3.1所示)。</p>
|
||
<p>Ø执行命令(创建目录):mkdir -p $HOME/.kube</p>
|
||
<p>Ø 执行命令(复制文件):sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config</p>
|
||
<p>Ø执行命令(修改权限):sudo chown $(id -u):$(id -g) $HOME/.kube/config</p>
|
||
<p>Ø执行命令(修改环境变量):vim /root/.bash_profile</p>
|
||
<p>将.bash_profile内容末尾追加如下内容并保存:</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code># 超级用户变量
|
||
export KUBECONFIG=/etc/kubernetes/admin.conf
|
||
# 设置别名
|
||
alias k=kubectl
|
||
# 设置kubectl命令补齐功能
|
||
source <(kubectl completion bash)
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>Ø 执行命令(环境变量生效):source /root/.bash_profile</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750315829480536871/4bac21e2_15898786.png" alt="image.png"></p>
|
||
<p>图5.3-1配置kubectl示意图</p>
|
||
<h3>
|
||
<a id="9354-设置kubernetes网络在master节点执行" class="anchor" href="#9354-%E8%AE%BE%E7%BD%AEkubernetes%E7%BD%91%E7%BB%9C%E5%9C%A8master%E8%8A%82%E7%82%B9%E6%89%A7%E8%A1%8C"></a>9.3.5.4 设置kubernetes网络(在master节点执行)</h3>
|
||
<p>作用:安装 Flannel CNI 插件,为Kubernetes 集群提供 Pod 网络,使节点状态变为 Ready 并支持跨节点 Pod 通信。</p>
|
||
<p>Ø 执行命令(安装插件):wget <a href="https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml">https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml</a></p>
|
||
<p>Ø 执行命令(修改配置):vim kube-flannel.yml</p>
|
||
<p>将kube-flannel.yml对应内容替换至如下内容并保存(如图5.4-1所示):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>net-conf.json: |
|
||
{
|
||
"Network": "10.244.0.0/16",
|
||
"Backend"": {
|
||
"Type": "vxlan"
|
||
}
|
||
}
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p><img src="https://foruda.gitee.com/images/1750316017928004449/44bd8802_15898786.png" alt="image.png"></p>
|
||
<p>图5.4-1配置kube-flannel.yml文件示意图</p>
|
||
<p>Ø 执行命令(配置生效):kubectl apply -f kube-flannel.yml</p>
|
||
<p>Ø 执行命令(查看pod状态):kubectl get pod --all-namespaces</p>
|
||
<p>注意:全部服务必须要为Running状态才行(如图5.4-2所示)。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750316104673410905/f9079021_15898786.png" alt="image.png"></p>
|
||
<p>图5.4-2验证pod状态示意图</p>
|
||
<h3>
|
||
<a id="9355-子节点加入集群在所有子节点执行" class="anchor" href="#9355-%E5%AD%90%E8%8A%82%E7%82%B9%E5%8A%A0%E5%85%A5%E9%9B%86%E7%BE%A4%E5%9C%A8%E6%89%80%E6%9C%89%E5%AD%90%E8%8A%82%E7%82%B9%E6%89%A7%E8%A1%8C"></a>9.3.5.5 子节点加入集群(在所有子节点执行)</h3>
|
||
<p>Ø 执行命令(9.3.5.2步骤执行完初始化之后控制台末尾的加入集群的join命令,如图5.5-1所示):kubeadm join 192.168.133.137:6443 --token gx38zz.iokskhaa4uehb9nr--discovery-token-ca-cert-hash sha256:5e84b16ac4c5c52da4225162b1574316797e518d26e8dd0c26a2aa6a3253038c</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750316240265279778/86dea769_15898786.png" alt="image.png"></p>
|
||
<p>图5.5-1子节点加入集群示意图</p>
|
||
<p>注意:默认的kubeadm join Token有效期为24小时。如果子节点加入集群失败,请在Master节点执行以下命令重新生成Token,并在所有子节点重新加入集群指令(如图5.5-2所示):kubeadm token create --print-join-command</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750316275543725383/984e06be_15898786.png" alt="image.png"></p>
|
||
<p>图5.5-2子节点加入集群示意图</p>
|
||
<p>Ø 执行命令(在master节点执行,验证):kubectl get nodes</p>
|
||
<p>所有节点状态显示 Ready(如图5.5-3所示),表示子节点已成功加入集群,部署完成!</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750316309760944718/b1c9c3cb_15898786.png" alt="image.png"></p>
|
||
<p>图5.5-3集群节点状态验证示意图</p>
|
||
<h2>
|
||
<a id="936-arm64架构使用二进制离线的方式安装集群" class="anchor" href="#936-arm64%E6%9E%B6%E6%9E%84%E4%BD%BF%E7%94%A8%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%A6%BB%E7%BA%BF%E7%9A%84%E6%96%B9%E5%BC%8F%E5%AE%89%E8%A3%85%E9%9B%86%E7%BE%A4"></a>9.3.6 ARM64架构使用二进制离线的方式安装集群</h2>
|
||
<h3>
|
||
<a id="9361-准备离线包" class="anchor" href="#9361-%E5%87%86%E5%A4%87%E7%A6%BB%E7%BA%BF%E5%8C%85"></a>9.3.6.1 准备离线包</h3>
|
||
<p>在联网环境准备离线包(需要安装docker),或者让实施人员直接提供离线包(跳过本章直接从9.3.6.2章节开始)。</p>
|
||
<p>离线包文件结构如下表所示:</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>k8s-offline-arm64-20250630.tar.gz</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>scripts<br>images<br>------quay.io_coreos_flannel_v0.14.0-arm64.tar<br>------registry.aliyuncs.com_google_containers_etcd_3.5.1-0.tar<br>------registry.aliyuncs.com_google_containers_kube-apiserver_v1.23.0.tar<br>------registry.aliyuncs.com_google_containers_kube-controller-manager_v1.23.0.tar<br>------registry.aliyuncs.com_google_containers_kube-proxy_v1.23.0.tar<br>------registry.aliyuncs.com_google_containers_kube-scheduler_v1.23.0.tar<br>------registry.aliyuncs.com_google_containers_pause_3.6.tar<br>configs<br>------daemon.json<br>binaries<br>------cni-plugins-linux-arm64-v1.1.1.tgz<br>------containerd-1.6.6-linux-arm64.tar.gz<br>------docker-20.10.9.tgz<br>------kubernetes-server-linux-arm64.tar.gz<br>kube-flannel.yml<br>image-list.txt</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>Ø 执行命令(创建离线包目录):mkdir -p /root/offline-pkg/{binaries,images,scripts,configs}</p>
|
||
<p>Ø 执行命令(下载Docker CE):wget -P /root/offline-pkg/binaries \ <a href="https://download.docker.com/linux/static/stable/aarch64/docker-20.10.9.tgz">https://download.docker.com/linux/static/stable/aarch64/docker-20.10.9.tgz</a></p>
|
||
<p>Ø 执行命令(设置版本变量):K8S_VER="v1.23.0"</p>
|
||
<p>Ø 执行命令(下载Kubernetes组件):wget -P /root/offline-pkg/binaries \ <a href="https://dl.k8s.io/%24K8S_VER/kubernetes-server-linux-arm64.tar.gz">https://dl.k8s.io/$K8S_VER/kubernetes-server-linux-arm64.tar.gz</a></p>
|
||
<p>Ø 执行命令(下载依赖工具):wget -P /root/offline-pkg/binaries \ <a href="https://github.com/containerd/containerd/releases/download/v1.6.6/containerd-1.6.6-linux-arm64.tar.gz">https://github.com/containerd/containerd/releases/download/v1.6.6/containerd-1.6.6-linux-arm64.tar.gz</a></p>
|
||
<p>Ø 执行命令(下载CNI插件):wget -P /root/offline-pkg/binaries \ <a href="https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-arm64-v1.1.1.tgz">https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-arm64-v1.1.1.tgz</a></p>
|
||
<p>注意:TAR包也可以直接在浏览器打开直接下载(下载好手动拉到指定目录/root/offline-pkg/binaries),例如浏览器打开:<a href="https://download.docker.com/linux/static/stable/aarch64/docker-20.10.9.tgz">https://download.docker.com/linux/static/stable/aarch64/docker-20.10.9.tgz</a></p>
|
||
<p>Ø 执行命令(创建镜像列表文件):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>cat > /root/offline-pkg/image-list.txt <<EOF
|
||
registry.aliyuncs.com/google_containers/kube-apiserver-arm64:$K8S_VER
|
||
registry.aliyuncs.com/google_containers/kube-controller-manager-arm64:$K8S_VER
|
||
registry.aliyuncs.com/google_containers/kube-scheduler-arm64:$K8S_VER
|
||
registry.aliyuncs.com/google_containers/kube-proxy-arm64:$K8S_VER
|
||
registry.aliyuncs.com/google_containers/pause:3.6
|
||
registry.aliyuncs.com/google_containers/etcd:3.5.1-0
|
||
quay.io/coreos/flannel:v0.14.0-arm64
|
||
EOF
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>Ø 执行命令(拉取并保存镜像):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>while read img; do
|
||
docker pull $img
|
||
save_name=$(echo $img | sed 's|/|_|g; s|:|_|g')
|
||
docker save $img -o "/root/offline-pkg/images/${save_name}.tar"
|
||
done < /root/offline-pkg/image-list.txt
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>Ø 执行命令(准备Docker配置文件):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>cat > /root/offline-pkg/configs/daemon.json <<EOF
|
||
{
|
||
"exec-opts": [
|
||
"native.cgroupdriver=systemd"
|
||
],
|
||
"log-driver": "json-file",
|
||
"log-opts": {
|
||
"max-size": "100m"
|
||
},
|
||
"storage-driver": "overlay2",
|
||
"storage-opts": [
|
||
"overlay2.override_kernel_check=true"
|
||
]
|
||
}
|
||
EOF
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>Ø 执行命令(Flannel配置):wget -O /root/offline-pkg/kube-flannel.yml \ <a href="https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml">https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml</a></p>
|
||
<p><a href="https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml">sed -i's#10.244.0.0/16#10.244.0.0/16#g' /root/offline-pkg/kube-flannel.yml</a></p>
|
||
<p>Ø执行命令(打包为离线文件):tar -czvf k8s-offline-arm64-$(date +%Y%m%d).tar.gz -C /root/offline-pkg .</p>
|
||
<h3>
|
||
<a id="9362-离线包分别复制到目标服务所有的节点都执行" class="anchor" href="#9362-%E7%A6%BB%E7%BA%BF%E5%8C%85%E5%88%86%E5%88%AB%E5%A4%8D%E5%88%B6%E5%88%B0%E7%9B%AE%E6%A0%87%E6%9C%8D%E5%8A%A1%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.6.2 离线包分别复制到目标服务(所有的节点都执行)</h3>
|
||
<p><img src="https://foruda.gitee.com/images/1751359786127490355/8da06e48_15898786.png" alt="image.png"></p>
|
||
<p>图6.2-1服务器离线包文件示意图</p>
|
||
<p>Ø 执行命令(创建目录):mkdir -p /root/offline-pkg/</p>
|
||
<p>Ø 执行命令(解压):bsdtar -xzf k8s-offline-arm64-*.tar.gz -C /root/offline-pkg/</p>
|
||
<h3>
|
||
<a id="9363-执行文档步骤9321至9327设置基础环境所有的节点都执行" class="anchor" href="#9363-%E6%89%A7%E8%A1%8C%E6%96%87%E6%A1%A3%E6%AD%A5%E9%AA%A49321%E8%87%B39327%E8%AE%BE%E7%BD%AE%E5%9F%BA%E7%A1%80%E7%8E%AF%E5%A2%83%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.6.3 执行文档步骤9.3.2.1至9.3.2.7设置基础环境(所有的节点都执行)</h3>
|
||
<p><img src="https://foruda.gitee.com/images/1751359875810571345/b2ff13d7_15898786.png" alt="image.png"></p>
|
||
<p>图6.3-1服务器设置基础环境示意图</p>
|
||
<h3>
|
||
<a id="9364-安装docker所有的节点都执行" class="anchor" href="#9364-%E5%AE%89%E8%A3%85docker%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.6.4 安装docker(所有的节点都执行)</h3>
|
||
<p>Ø 执行命令:cd /root/offline-pkg</p>
|
||
<p>Ø 执行命令(解压):bsdtar -xzf docker-20.10.9.tgz -C /tmp</p>
|
||
<p>Ø 执行命令(复制):sudo cp -v /tmp/docker/* /usr/bin/</p>
|
||
<p>Ø 执行命令(设置执行权限): sudo chmod 755 /usr/bin/{dockerd,docker,containerd,containerd-shim,containerd-shim-runc-v2,ctr,runc,docker-init,docker-proxy}</p>
|
||
<p>Ø 执行命令(创建systemd服务):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>cat > /etc/systemd/system/docker.service <<EOF
|
||
[Unit]
|
||
Description=Docker Application Container Engine
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=notify
|
||
ExecStart=/usr/bin/dockerd
|
||
ExecReload=/bin/kill -s HUP $MAINPID
|
||
LimitNOFILE=infinity
|
||
LimitNPROC=infinity
|
||
TimeoutStartSec=0
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>Ø 执行命令(配置Docker):mkdir /etc/docker</p>
|
||
<p>Ø 执行命令(复制Docker配置):cp configs/daemon.json /etc/docker/</p>
|
||
<p>Ø 执行命令(自启Docker):systemctl enable docker</p>
|
||
<p>Ø 执行命令(启动Docker):systemctl start docker</p>
|
||
<p><img src="https://foruda.gitee.com/images/1751360049253721470/f90ff21d_15898786.png" alt="image.png"></p>
|
||
<p>图6.4-1离线安装docker示意图</p>
|
||
<h3>
|
||
<a id="9365-安装k8s所有的节点都执行" class="anchor" href="#9365-%E5%AE%89%E8%A3%85k8s%E6%89%80%E6%9C%89%E7%9A%84%E8%8A%82%E7%82%B9%E9%83%BD%E6%89%A7%E8%A1%8C"></a>9.3.6.5 安装K8S(所有的节点都执行)</h3>
|
||
<p>Ø 执行命令:cd /root/offline-pkg</p>
|
||
<p>Ø 执行命令(解压K8S):tar -xzf binaries/kubernetes-server-linux-arm64.tar.gz -C /usr/local</p>
|
||
<p>Ø 执行命令:cd /usr/local/kubernetes/server/bin</p>
|
||
<p>Ø 执行命令(复制):cp kubeadm kubelet kubectl /usr/local/bin/</p>
|
||
<p>Ø 执行命令:cd /root/offline-pkg</p>
|
||
<p>Ø 执行命令:mkdir -p /opt/cni/bin</p>
|
||
<p>Ø 执行命令(解压CNI插件):tar -xzf binaries/cni-plugins-linux-arm64-v1.1.1.tgz -C /opt/cni/bin</p>
|
||
<p>Ø 执行命令(配置kubelet服务):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>cat > /etc/systemd/system/kubelet.service <<EOF
|
||
[Unit]
|
||
Description=Kubernetes Kubelet
|
||
After=docker.service
|
||
|
||
[Service]
|
||
ExecStart=/usr/local/bin/kubelet \
|
||
--container-runtime=remote \
|
||
--container-runtime-endpoint=unix:///run/containerd/containerd.sock \
|
||
--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.6
|
||
Restart=always
|
||
StartLimitInterval=0
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>Ø执行命令(启动):systemctl enable kubelet</p>
|
||
<p>Ø执行命令(加载容器镜像):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>for img in images/*.tar; do
|
||
docker load -i $img
|
||
done
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>图6.5-1加载镜像示意图</p>
|
||
<h3>
|
||
<a id="9366-执行文档步骤9352和9353设置主节点环境在master节点执行" class="anchor" href="#9366-%E6%89%A7%E8%A1%8C%E6%96%87%E6%A1%A3%E6%AD%A5%E9%AA%A49352%E5%92%8C9353%E8%AE%BE%E7%BD%AE%E4%B8%BB%E8%8A%82%E7%82%B9%E7%8E%AF%E5%A2%83%E5%9C%A8master%E8%8A%82%E7%82%B9%E6%89%A7%E8%A1%8C"></a>9.3.6.6 执行文档步骤9.3.5.2和9.3.5.3设置主节点环境(在master节点执行)</h3>
|
||
<p><img src="https://foruda.gitee.com/images/1751360256701285141/255c6f08_15898786.png" alt="image.png"></p>
|
||
<p>图6.6-1设置主节点环境示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1751360269379932427/1db79a48_15898786.png" alt="image.png"></p>
|
||
<p>图6.6-2设置主节点环境示意图</p>
|
||
<h3>
|
||
<a id="9367-设置kubernetes网络在master节点执行" class="anchor" href="#9367-%E8%AE%BE%E7%BD%AEkubernetes%E7%BD%91%E7%BB%9C%E5%9C%A8master%E8%8A%82%E7%82%B9%E6%89%A7%E8%A1%8C"></a>9.3.6.7 设置kubernetes网络(在master节点执行)</h3>
|
||
<p>Ø 执行命令(加载):kubectl apply -f /root/offline-pkg/kube-flannel.yml</p>
|
||
<h3>
|
||
<a id="9368-执行文档步骤9355加入集群在所有子节点执行" class="anchor" href="#9368-%E6%89%A7%E8%A1%8C%E6%96%87%E6%A1%A3%E6%AD%A5%E9%AA%A49355%E5%8A%A0%E5%85%A5%E9%9B%86%E7%BE%A4%E5%9C%A8%E6%89%80%E6%9C%89%E5%AD%90%E8%8A%82%E7%82%B9%E6%89%A7%E8%A1%8C"></a>9.3.6.8 执行文档步骤9.3.5.5加入集群(在所有子节点执行)</h3>
|
||
<h2>
|
||
<a id="937-结语" class="anchor" href="#937-%E7%BB%93%E8%AF%AD"></a>9.3.7 结语</h2>
|
||
<p>当前 Kubernetes 集群已完成标准化部署,系统将按以下机制运行:</p>
|
||
<p>Ø高可用保障:Master 节点采用多实例部署,默认启用 kubelet 自动恢复机制</p>
|
||
<p>Ø网络就绪:Flannel CNI 已配置 10.244.0.0/16 Pod 网段(VXLAN 后端模式)</p>
|
||
<p>Ø证书管理:kubeadm 自动生成证书有效期 1 年,到期前需执行 kubeadm certs renew</p>
|
||
<p>后续运维人员可通过以下方式管理集群:</p>
|
||
<p>Ø使用 kubectl 命令行工具或部署 Kubernetes Dashboard 进行可视化操作</p>
|
||
<p>Ø通过 kubeadm upgrade 进行集群版本升级(需遵循版本迭代规范)</p>
|
||
<p>Ø按需扩展 Node 节点(join token 有效期 24h,需及时更新)</p>
|
||
<p>如需调整网络插件、存储方案或安全策略,请联系基础设施团队评估变更影响。</p></div><div class='title'>9.4 流水线部署</div><div class='content'><p><strong>文档背景</strong></p>
|
||
<p>随着 DevOps 理念的深入实践,我司已实现开发人员提交代码后的全自动化构建部署流程。为帮助开发团队更清晰地理解 CI/CD 自动化机制,特修订此文档,重点说明:</p>
|
||
<p><strong>职责边界明确化</strong></p>
|
||
<p>·开发人员仅需关注代码提交至 Git 仓库</p>
|
||
<p>·后续构建、测试、部署全流程由 Jenkins 自动完成</p>
|
||
<p><strong>流程透明化</strong></p>
|
||
<p>·详细解析从代码提交到应用上线的完整链路</p>
|
||
<p>·说明各环节的触发条件、执行逻辑和预期结果</p>
|
||
<p><strong>问题定位标准化</strong></p>
|
||
<p>·提供构建失败时的关键检查点和日志分析指引</p>
|
||
<p>·建立统一的异常处理流程</p>
|
||
<p>本次修订旨在提升团队对自动化流水线的认知度,确保开发与运维的高效协作。</p>
|
||
<h2>
|
||
<a id="941-图示以及说明" class="anchor" href="#941-%E5%9B%BE%E7%A4%BA%E4%BB%A5%E5%8F%8A%E8%AF%B4%E6%98%8E"></a>9.4.1 图示以及说明</h2>
|
||
<h3>
|
||
<a id="9411-uml流程图" class="anchor" href="#9411-uml%E6%B5%81%E7%A8%8B%E5%9B%BE"></a>9.4.1.1 UML流程图</h3>
|
||
<p><img src="https://foruda.gitee.com/images/1749544901832427034/f490ea29_15898786.png" alt="image.png"></p>
|
||
<p>图1.1-1 流程参考图</p>
|
||
<h3>
|
||
<a id="9412-基础建设服务说明" class="anchor" href="#9412-%E5%9F%BA%E7%A1%80%E5%BB%BA%E8%AE%BE%E6%9C%8D%E5%8A%A1%E8%AF%B4%E6%98%8E"></a>9.4.1.2 基础建设服务说明</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>服务</th>
|
||
<th>IP和端口</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>Java</td>
|
||
<td>10.4.126.62</td>
|
||
</tr>
|
||
<tr>
|
||
<td>数据库(金仓数据库)</td>
|
||
<td>10.0.252.76:54321</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Redis</td>
|
||
<td>10.0.250.17:6379</td>
|
||
</tr>
|
||
<tr>
|
||
<td>文件服务器(Minio)</td>
|
||
<td>10.0.252.28:9000</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Nacos</td>
|
||
<td>10.0.252.1:8849</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>表1.2-1 部署服务说明表</p>
|
||
<p>注:本文档不再详细展开基础建设服务的部署细节(如Mysql,Redis,Minio等),相关内容可参考组织过程资产库相关开发文档。</p>
|
||
<h2>
|
||
<a id="942-jenkins的搭建及初始配置" class="anchor" href="#942-jenkins%E7%9A%84%E6%90%AD%E5%BB%BA%E5%8F%8A%E5%88%9D%E5%A7%8B%E9%85%8D%E7%BD%AE"></a>9.4.2 Jenkins的搭建及初始配置</h2>
|
||
<h3>
|
||
<a id="9421-jenkins服务器配置" class="anchor" href="#9421-jenkins%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE"></a>9.4.2.1 Jenkins服务器配置</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>服务器</th>
|
||
<th></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>IP地址</td>
|
||
<td>10.0.252.12</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td>操作系统</td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td>名称</td>
|
||
<td>Kylin Linux Advanced Server</td>
|
||
</tr>
|
||
<tr>
|
||
<td>版本</td>
|
||
<td>V10 (Halberd)</td>
|
||
</tr>
|
||
<tr>
|
||
<td></td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td>资源配置</td>
|
||
<td></td>
|
||
</tr>
|
||
<tr>
|
||
<td>CPU核心数</td>
|
||
<td>32核</td>
|
||
</tr>
|
||
<tr>
|
||
<td>内存</td>
|
||
<td>32GB</td>
|
||
</tr>
|
||
<tr>
|
||
<td>磁盘</td>
|
||
<td>300GB</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>表2.1-1 服务器配置说明表</p>
|
||
<h3>
|
||
<a id="9422-下载及安装jenkins" class="anchor" href="#9422-%E4%B8%8B%E8%BD%BD%E5%8F%8A%E5%AE%89%E8%A3%85jenkins"></a>9.4.2.2 下载及安装Jenkins</h3>
|
||
<p>Ø 打开服务器界面(如图2.2-1所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749545695839041637/80b22f7f_15898786.png" alt="image.png"></p>
|
||
<p>图2.2-1服务器界面示意图</p>
|
||
<p>Ø 输入docker下载Jenkins命令(docker基础建设这里不赘述(可参考<a href="https://e.gitee.com/gdyditc/projects/725584/docs/2954258/file/6682560?sub_id=14389000">9.3.3章节</a>)):</p>
|
||
<p>docker run -p 8080:8080 -p 50000:50000 --name jenkins- -v /usr/docker/jenkins_data:/var/jenkins_home
|
||
-d jenkins/jenkins:lts</p>
|
||
<p>指令解析:</p>
|
||
<p>-p:端口映射, 左边是本地端口,右边是docker容器端口 ,8080是Jenkins Web 界面的工作端口,50000是JNLP(Java Network Launch Protocol)工作端口。这个端口用于 Jenkins 节点和主控节点之间的通信。</p>
|
||
<p>-v:目录挂载,将主机上的 /usr/docker/jenkins_data 目录挂载到容器内的
|
||
/var/jenkins_home 目录,用于持久化 Jenkins 的数据。</p>
|
||
<p>Ø安装成功输入命令检查:docker ps(如图2.2-2所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749545760923191883/b98c1893_15898786.png" alt="image.png"></p>
|
||
<p>图2.2-2 docker安装jenkins并启动容器示意图</p>
|
||
<h3>
|
||
<a id="9423-初始配置" class="anchor" href="#9423-%E5%88%9D%E5%A7%8B%E9%85%8D%E7%BD%AE"></a>9.4.2.3 初始配置</h3>
|
||
<p>Ø进入Web页面,浏览器打开:<a href="http://10.0.252.12:8080/">http://10.0.252.12:8080/</a></p>
|
||
<p>Ø按照页面提示打开初始密码文件进行复制,输入密码(如图2.3-1所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749545819973260965/5916e442_15898786.png" alt="image.png"></p>
|
||
<p>图2.3-1Jenkins打开web页面并输入初始密码示意图</p>
|
||
<p>Ø选择安装推荐的插件(如图2.3-2所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749545850424016350/9c21ca02_15898786.png" alt="image.png"></p>
|
||
<p>图2.3-2Jenkins安装推荐的插件示意图</p>
|
||
<p>Ø随后让我们创建一个管理员账户,正常创建即可(后续可手动创建Jenkins用户)如图2.3-3所示。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749545874965561062/3ec2d5a7_15898786.png" alt="image.png"></p>
|
||
<p>图2.3-3Jenkins创建用户示意图</p>
|
||
<p>Ø成功进入Jenkins页面(如图2.3-4所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749545896844834927/99c9d42b_15898786.png" alt="image.png"></p>
|
||
<p>图2.3-4Jenkins进入主界面示意图</p>
|
||
<h3>
|
||
<a id="9424-配置插件环境" class="anchor" href="#9424-%E9%85%8D%E7%BD%AE%E6%8F%92%E4%BB%B6%E7%8E%AF%E5%A2%83"></a>9.4.2.4 配置插件环境</h3>
|
||
<p>由于Jenkins标准安装未包含Maven项目所需的完整支持,需通过以下插件实现自动化构建能力:</p>
|
||
<p><strong>核心插件清单</strong></p>
|
||
<p><strong>·Maven Integration</strong> :提供POM解析、生命周期控制等Maven原生支持</p>
|
||
<p><strong>·Git Plugin</strong> :实现代码仓库的版本控制与触发构建</p>
|
||
<p><strong>·JDK Tool</strong> :管理Java环境隔离与版本切换</p>
|
||
<p><strong>部署策略</strong></p>
|
||
<p>(二选一)使用<strong>服务器级</strong>插件部署(这里系统基础建设这里不赘述)如图2.4-1(非Jenkins页面安装),优势包括:</p>
|
||
<p>·统一版本管控(与运维规范对齐)</p>
|
||
<p>·避免Jenkins重启导致的插件依赖中断</p>
|
||
<p>·支持离线环境下的稳定运行</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546506523239905/9e881a24_15898786.png" alt="image.png"></p>
|
||
<p>图2.4-1插件安装成功示意图</p>
|
||
<p>(二选一)也可使用 <strong>Jenkins页面</strong>安装:</p>
|
||
<p>Ø点击(如图2.4-2所示):系统管理</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546527546946760/9afeed28_15898786.png" alt="image.png"></p>
|
||
<p>图2.4-2Jenkins插件管理示意图</p>
|
||
<p>Ø点击:插件管理</p>
|
||
<p>Ø依次搜索并下载核心插件, 如图2.4-3所示</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546538567906109/f205a86c_15898786.png" alt="image.png"></p>
|
||
<p>图2.4-3Jenkins插件安装示意图</p>
|
||
<p><strong>配置验证</strong></p>
|
||
<p>需确保:</p>
|
||
<p>·插件已正确注册至Jenkins运行时环境</p>
|
||
<p>·Jenkins全局工具配置中绑定对应二进制路径</p>
|
||
<p>Ø点击:系统管理</p>
|
||
<p>Ø点击:全局工具配置</p>
|
||
<p>Ø填写配置项:maven和java以及git(如图2.4-4至2.4-6所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546558645284447/f05eab1b_15898786.png" alt="image.png"></p>
|
||
<p>图2.4-4配置Maven插件环境示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546607641027971/eac48283_15898786.png" alt="image.png"></p>
|
||
<p>图2.4-5配置JAVA插件环境示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546626039905897/581224be_15898786.png" alt="image.png"></p>
|
||
<p>图2.4-6配置Git插件环境示意图</p>
|
||
<h3>
|
||
<a id="9425-节点配置" class="anchor" href="#9425-%E8%8A%82%E7%82%B9%E9%85%8D%E7%BD%AE"></a>9.4.2.5 节点配置</h3>
|
||
<p>Ø点击:系统管理(如图2.5-1所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546729502084871/27894b90_15898786.png" alt="image.png"></p>
|
||
<p>图2.5-1系统节点示意图</p>
|
||
<p>Ø点击:节点和云管理</p>
|
||
<p>Ø点击新增节点:New Node(如图2.5-2所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546740447186091/be907b7a_15898786.png" alt="image.png"></p>
|
||
<p>图2.5-2添加节点示意图</p>
|
||
<p>Ø依次添加集群节点信息(如图2.5-3至2.5-4所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546751440052413/19f5064e_15898786.png" alt="image.png"></p>
|
||
<p>图2.5-3系统节点配置示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546771091584697/4e9c8f53_15898786.png" alt="image.png"></p>
|
||
<p>图2.5-4系统节点配置示意图</p>
|
||
<p>Ø点击:保存</p>
|
||
<p>最终节点列表效果如图2.5-5所示</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546780400417508/df2dac34_15898786.png" alt="image.png"></p>
|
||
<p>图2.5-5系统节点列表示意图</p>
|
||
<h3>
|
||
<a id="9426-服务器ssh配置" class="anchor" href="#9426-%E6%9C%8D%E5%8A%A1%E5%99%A8ssh%E9%85%8D%E7%BD%AE"></a>9.4.2.6 服务器SSH配置</h3>
|
||
<p>Jenkins将通过SSH私钥的方式链接远程服务器。</p>
|
||
<p>Ø点击:系统管理(如图2.6-1所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749546960175838930/f5893cf4_15898786.png" alt="image.png"></p>
|
||
<p>图2.6-1系统配置示意图</p>
|
||
<p>Ø点击:系统配置</p>
|
||
<p>找到Publish over SSH</p>
|
||
<p>Ø输入Passphrase(私钥key,如图2.6-2所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749690398190242654/a7533448_15898786.png" alt="image.png"></p>
|
||
<p>图2.6-2服务器私钥配置示意图</p>
|
||
<p>Ø输入Path to key(私钥文件的服务器路径):.ssh/id_rsa</p>
|
||
<p>Ø输key(私钥的完整文本内容)</p>
|
||
<p>找到SSH Servers</p>
|
||
<p>Ø依次添加服务器信息(如图2.6-3所示)</p>
|
||
<p>例如:</p>
|
||
<p>Name: 10.0.252.12</p>
|
||
<p>Hostname: 10.0.252.12</p>
|
||
<p>Username: root</p>
|
||
<p>Ø点击:保存</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750320936031608586/d8d270ed_15898786.png" alt="image.png"></p>
|
||
<p>图2.6-3服务器ssh配置示意图</p>
|
||
<h3>
|
||
<a id="9427-凭据配置" class="anchor" href="#9427-%E5%87%AD%E6%8D%AE%E9%85%8D%E7%BD%AE"></a>9.4.2.7 凭据配置</h3>
|
||
<p>凭据配置是Jenkins用于访问远程链接所需要的凭据。</p>
|
||
<p>Ø点击:系统管理-凭据管理-System-全局凭据 (unrestricted)-Add Credentials(如图2.7-1)</p>
|
||
<p>Ø填写:用户名-密码-描述</p>
|
||
<p>Ø点击:保存(如图2.7-2)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749690575060067596/06948efa_15898786.png" alt="image.png"></p>
|
||
<p>图2.7-1添加系统凭据示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749690588745374311/9dfdab75_15898786.png" alt="image.png"></p>
|
||
<p>图2.7-2系统凭据配置示意图</p>
|
||
<h2>
|
||
<a id="943-构建自由风格任务二选一" class="anchor" href="#943-%E6%9E%84%E5%BB%BA%E8%87%AA%E7%94%B1%E9%A3%8E%E6%A0%BC%E4%BB%BB%E5%8A%A1%E4%BA%8C%E9%80%89%E4%B8%80"></a>9.4.3 构建自由风格任务(二选一)</h2>
|
||
<h3>
|
||
<a id="9431-新建文件夹管理" class="anchor" href="#9431-%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%AE%A1%E7%90%86"></a>9.4.3.1 新建文件夹管理</h3>
|
||
<p>该步骤是为了以项目的维度分类管理所有构建任务,包括前端项目后端的项目等等,提升运维效率。</p>
|
||
<p>Ø点击:新建任务(如图3.1-1所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547127782960389/cfa464dc_15898786.png" alt="image.png"></p>
|
||
<p>图3.1-1创建文件夹管理示意图</p>
|
||
<p>Ø输入任务名称:智慧审计-test(如图3.1-2所示)</p>
|
||
<p>Ø类型选择:文件夹</p>
|
||
<p>Ø点击:确定</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547135818388113/c8f60c80_15898786.png" alt="image.png"></p>
|
||
<p>图3.1-2创建文件夹任务示意图</p>
|
||
<h3>
|
||
<a id="9432-创建自由风格后端任务" class="anchor" href="#9432-%E5%88%9B%E5%BB%BA%E8%87%AA%E7%94%B1%E9%A3%8E%E6%A0%BC%E5%90%8E%E7%AB%AF%E4%BB%BB%E5%8A%A1"></a>9.4.3.2 创建自由风格后端任务</h3>
|
||
<p>Ø在新建的文件夹目录里左上角点击:新建Item(如图3.2-1所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547235559307671/df8d23f4_15898786.png" alt="image.png"></p>
|
||
<p>图3.2-1创建后台项目示意图</p>
|
||
<p>Ø输入任务名称:audit-back-sit(如图3.2-2所示)</p>
|
||
<p>Ø类型选择:构建一个自由风格的软件项目</p>
|
||
<p>Ø点击:确定</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547241796633457/f0351745_15898786.png" alt="image.png"></p>
|
||
<p>图3.2-2创建后台项目示意图</p>
|
||
<h3>
|
||
<a id="9433-任务配置" class="anchor" href="#9433-%E4%BB%BB%E5%8A%A1%E9%85%8D%E7%BD%AE"></a>9.4.3.3 任务配置</h3>
|
||
<p>Ø输入项目描述(如图3.3-1所示):构建智慧审计后端SIT环境</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547289065017660/e7e93cd1_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-1任务描述配置示意图</p>
|
||
<p>Ø勾选:丢弃旧的构建(如图3.3-2所示)</p>
|
||
<p>Ø填写保持构建的最大个数(此项的目的是只保留构建的三个版本):3</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547334025469631/e6cdfeca_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-2任务配置示意图</p>
|
||
<p>ØJDK选择:jdk-8(如图3.3-3所示)</p>
|
||
<p>Ø勾选:限制项目的运行节点(作用是控制项目构建任务在指定的 Jenkins 节点(Node)上执行,如图3.3-4所示)</p>
|
||
<p>Ø标签表达式输入并选中:agent_amd64_1</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547401560594221/7ae22df2_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-3构建配置示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547422080270900/96f781bc_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-4构建节点配置示意图</p>
|
||
<p>Ø源码管理选择:Git(如图3.3-5所示)</p>
|
||
<p>Ø Repository URL输入代码仓库地址:<a href="https://fcd.gdyditc.com/itc/ZHSJ/back.git">https://fcd.gdyditc.com/itc/ZHSJ/back.git</a></p>
|
||
<p>Ø Credentials资格证明(选择拥有该仓库权限的用户,点击“+”号可手动添加用户):如yangjiewei</p>
|
||
<p>Ø 指定分支输入:*/dev</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547461135567847/e2248484_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-5 Git配置示意图</p>
|
||
<p>Ø 触发器选择:轮询SCM(如图3.3-6所示)</p>
|
||
<p>Ø 输入Cron表达式:H(0-29) 12,18 * * *</p>
|
||
<p>(每天12:00和18:00之间的随机时间点执行(0-29分))</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547481232188863/3e6d044e_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-6 触发器配置示意图</p>
|
||
<p>添加构建步骤,这里总共有两个类型步骤。</p>
|
||
<p>Ø 步骤1点击:增加构建步骤(如图3.3-7所示)</p>
|
||
<p>Ø 选择步骤类型:调用顶层Maven目标</p>
|
||
<p>Ø 选择Maven版本:maven-3.9.9(如图3.3-8所示)</p>
|
||
<p>Ø 填写目标:clean install -U -Dmaven.test.skip=true</p>
|
||
<p>(主要用于清理项目并安装依赖,同时跳过测试)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547506031492265/3711067c_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-7 添加maven步骤示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547516815794270/894adc32_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-8 maven步骤配置示意图</p>
|
||
<p>Ø 步骤2点击:增加构建步骤(如图3.3-9所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547665568603391/5c9cb2fa_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-9 SSH步骤配置示意图</p>
|
||
<p>Ø 选择步骤类型:Send files or execute commands over SSH</p>
|
||
<p>Ø 选择Name:10.4.126.62(如图3.3-10所示)</p>
|
||
<p>(部署的远程服务器地址)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547680261588320/cc12db44_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-10 服务步骤配置示意图</p>
|
||
<p>Ø 填写Source files:target/audit-0.0.1-SNAPSHOT.jar</p>
|
||
<p>(指定需要传输到远程服务器的本地文件路径)</p>
|
||
<p>Ø 填写Remove prefix:target</p>
|
||
<p>(移除指定的前缀路径)</p>
|
||
<p>Ø 填写Remote directory:/data/apps/audit-ma-sit</p>
|
||
<p>(文件传输到远程服务器的目标目录)</p>
|
||
<p>Ø 填写Exec command(文件传输完成后,在远程服务器上执行的Shell 命令,如图3.3-11所示),命令如下:</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>mkdir -p /data/apps/audit-ma-sit
|
||
cd /data/apps/audit-ma-sit
|
||
cat <<\EOF | tee deploy.sh
|
||
#!/usr/bin/env bash
|
||
source /etc/profile
|
||
DIR_PATH="/data/apps/audit-ma-sit"
|
||
SOURCE_JAR="audit-0.0.1-SNAPSHOT.jar"
|
||
TARGET_JAR="audit-ma-sit.jar"
|
||
PROJECT_ARGS="--spring.profiles.active=test --server.port=8080"
|
||
LOG_NAME="audit-ma-sit.log"
|
||
stop_process() {
|
||
echo "将结束 $TARGET_JAR 的进程"
|
||
pkill -9 -f $TARGET_JAR
|
||
if [ $? -eq 0 ];then
|
||
echo "$TARGET_JAR 关闭成功"
|
||
else
|
||
echo "$TARGET_JAR 未启动"
|
||
fi
|
||
}
|
||
post_process() {
|
||
if [ -e $TARGET_JAR ];then
|
||
echo "备份原包 $TARGET_JAR"
|
||
# mv $TARGET_JAR $TARGET_JAR$(date "+%Y%m%d%H%M%S")
|
||
rm ${TARGET_JAR}.bak
|
||
mv $TARGET_JAR ${TARGET_JAR}.bak
|
||
fi
|
||
mv $SOURCE_JAR $TARGET_JAR
|
||
}
|
||
start_process() {
|
||
nohup java -jar $TARGET_JAR $PROJECT_ARGS &>/dev/null &
|
||
if [ $? -eq 0 ];then
|
||
echo "$TARGET_JAR 启动成功"
|
||
else
|
||
echo "$TAR_NAME 启动失败"
|
||
fi
|
||
}
|
||
checkout() {
|
||
if [ ! -e $SOURCE_JAR ];then
|
||
echo "没找到 $SOURCE_JAR"
|
||
exit
|
||
fi
|
||
}
|
||
cd $DIR_PATH
|
||
checkout
|
||
stop_process
|
||
post_process
|
||
start_process
|
||
EOF
|
||
chmod +x deploy.sh
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>上述命令的执行效果如下:</p>
|
||
<p>·创建 /data/apps/audit-ma-sit 目录(如果不存在)。</p>
|
||
<p>·生成 deploy.sh 部署脚本,实现:</p>
|
||
<p>·检查新构建的 audit-0.0.1-SNAPSHOT.jar 是否存在。</p>
|
||
<p>·停止当前运行的 audit-ma-sit.jar 进程。</p>
|
||
<p>·备份旧jar 包(重命名为 .bak)。</p>
|
||
<p>·替换新jar 包并启动。</p>
|
||
<p>·赋予 deploy.sh 可执行权限,方便后续直接运行。</p>
|
||
<p>这样,每次 Jenkins 构建完成后,只需执行 ./deploy.sh 即可完成自动化部署。</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547696999030963/1be72dc5_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-11 Shell脚本配置示意图</p>
|
||
<p>Ø 在该步骤下方继续点击: Add Server(如图3.3-12所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547759895097547/c7c1f8a5_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-12 步骤配置示意图</p>
|
||
<p>Ø 选择Name(远程服务器地址):10.4.126.62(如图3.3-13所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547769637542057/68fa6a82_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-13 服务配置示意图</p>
|
||
<p>Ø 填写Exec command(在远程服务器上执行的Shell 命令):</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>cd /data/apps/audit-ma-sit
|
||
./deploy.sh
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>上述命令的执行效果如下:</p>
|
||
<p>·进入指定目录</p>
|
||
<p>·执行deploy.sh脚本命令</p>
|
||
<p>Ø 最后点击:保存(如图3.3-14所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547793032343061/5d3e0bc9_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-14 保存配置示意图</p>
|
||
<p>Ø(可选)可手动点击:启动构建(如图3.3-15所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547822694666792/3f45c6ee_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-15 启动构建任务示意图</p>
|
||
<p>Ø (可选)点击查看项目的启动日志:控制台输出(如图3.3-16至3.3-17所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547843104329253/d615c11a_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-16 任务日志查看示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749547853369485593/2a0a0644_15898786.png" alt="image.png"></p>
|
||
<p>图3.3-17 任务日志查看示意图</p>
|
||
<h2>
|
||
<a id="944-构建流水线任务二选一" class="anchor" href="#944-%E6%9E%84%E5%BB%BA%E6%B5%81%E6%B0%B4%E7%BA%BF%E4%BB%BB%E5%8A%A1%E4%BA%8C%E9%80%89%E4%B8%80"></a>9.4.4 构建流水线任务(二选一)</h2>
|
||
<p>Jenkins 流水线构建(Pipeline)和自由风格构建(Freestyle)的区别</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>维度</th>
|
||
<th>流水线构建(Pipeline)</th>
|
||
<th>自由风格构建(Freestyle)</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>配置存储位置</td>
|
||
<td>Jenkinsfile存储在代码仓库(如Git)</td>
|
||
<td>配置保存在Jenkins服务器本地</td>
|
||
</tr>
|
||
<tr>
|
||
<td>灵活性</td>
|
||
<td>高(支持复杂逻辑、条件判断、并行任务)</td>
|
||
<td>低(仅支持简单线性步骤)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>版本控制</td>
|
||
<td>与代码同仓库,追溯变更历史,进行控制、审核和迭代</td>
|
||
<td>无版本控制,需手动备份</td>
|
||
</tr>
|
||
<tr>
|
||
<td>适用场景</td>
|
||
<td>复杂CI/CD流程(多环境、微服务)</td>
|
||
<td>简单任务(单次构建、定时执行)</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<p>表4-1 Pipeline和Freestyle区别说明表</p>
|
||
<h3>
|
||
<a id="9441-新建文件夹管理" class="anchor" href="#9441-%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9%E7%AE%A1%E7%90%86"></a>9.4.4.1 新建文件夹管理</h3>
|
||
<p>该步骤是为了以项目的维度分类管理所有构建任务,包括前端项目后端的项目等等,提升运维效率。</p>
|
||
<p>Ø点击:新建任务(如图4.1-1所示)</p>
|
||
<p>Ø输入任务名称:智慧审计-test(如图4.1-2所示)</p>
|
||
<p>Ø类型选择:文件夹</p>
|
||
<p>Ø点击:确定</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720085131882445/fa449a28_15898786.png" alt="image.png"></p>
|
||
<p>图4.1-1创建文件夹管理示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720092476897756/68ced72e_15898786.png" alt="image.png"></p>
|
||
<p>图4.1-2创建文件夹任务示意图</p>
|
||
<h3>
|
||
<a id="9442-创建流水线后端任务" class="anchor" href="#9442-%E5%88%9B%E5%BB%BA%E6%B5%81%E6%B0%B4%E7%BA%BF%E5%90%8E%E7%AB%AF%E4%BB%BB%E5%8A%A1"></a>9.4.4.2 创建流水线后端任务</h3>
|
||
<p>Ø在新建的文件夹目录里左上角点击:新建Item(如图4.2-1所示)</p>
|
||
<p>Ø输入任务名称:audit-back-sit(如图4.2-2所示)</p>
|
||
<p>Ø类型选择:流水线</p>
|
||
<p>Ø点击:确定</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720156882998140/3e4ee8a9_15898786.png" alt="image.png"></p>
|
||
<p>图4.2-1创建后台项目示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720163428208756/d8bbaa8c_15898786.png" alt="image.png"></p>
|
||
<p>图4.2-2创建后台项目示意图</p>
|
||
<h3>
|
||
<a id="9443-任务配置" class="anchor" href="#9443-%E4%BB%BB%E5%8A%A1%E9%85%8D%E7%BD%AE"></a>9.4.4.3 任务配置</h3>
|
||
<p>Ø输入项目描述(如图4.3-1所示):构建智慧审计后端SIT环境</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720236307593277/65e8b75f_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-1任务配置示意图</p>
|
||
<p>Ø勾选:丢弃旧的构建(如图4.3-2所示)</p>
|
||
<p>Ø填写保持构建的最大个数(此项的目的是只保留构建的三个版本):3</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720260196557335/f6d6c3ee_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-2任务配置示意图</p>
|
||
<p>Ø 触发器选择:轮询SCM(如图4.3-3所示)</p>
|
||
<p>Ø 输入Cron表达式:H(0-29) 12,18 * * *</p>
|
||
<p>(每天12:00和18:00之间的随机时间点执行(0-29分))</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720287847347066/526de9df_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-3任务配置示意图</p>
|
||
<p>(流水线定义选择 Pipline script from SCM是指定一个代码仓库(如Git、SVN)中的脚本文件路径, 如果选择Pipline script则是直接在文本框中编写Pipeline脚本(Groovy代码)。这里Pipeline script from SCM 支持两种方式加载 Jenkinsfile:</p>
|
||
<p>1、Jenkinsfile
|
||
与项目代码同仓库:可以将Jenkinsfile放在项目的根目录(如图4.3-8所示)</p>
|
||
<p>2、Jenkinsfile
|
||
与项目代码不同仓库:页面配置 Jenkinsfile 所在的 Git 仓库地址,并在 Jenkinsfile 内容里通过
|
||
checkout scm 或 git 命令拉取项目代码。这里我们选择第二种)</p>
|
||
<p>Ø 流水线定义选择(如图4.3-4所示):Pipline script from SCM</p>
|
||
<p>Ø SCM选择(如图所示):Git</p>
|
||
<p>Ø Repository URL输入Jenkinsfile的仓库地址(需要创建对应的Jenkinsfile仓库,如图4.3-5至4.3-7所示):<a href="https://fcd.gdyditc.com/practice/jenkins-pipeline.git">https://fcd.gdyditc.com/practice/jenkins-pipeline.git</a></p>
|
||
<p>Ø Credentials资格证明(选择拥有该仓库权限的用户,点击“+”号可手动添加用户):如18565418931</p>
|
||
<p>Ø 指定分支输入(Jenkinsfile的仓库的分支):*/dev</p>
|
||
<p>Ø 脚本路径(Jenkinsfile的仓库内的相对路径):sit/audit-back/Jenkinsfile-sit</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720442217125252/7b80f310_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-4任务配置示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720450875255129/73502f46_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-5任务配置示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720461649722615/a9d1bb02_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-6Jenkinsfile所在Git目录示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720469022940024/f8066c15_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-7Jenkinsfile所在Git目录示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1750322468339883638/cf8fad95_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-8Jenkinsfile所在项目目录示意图</p>
|
||
<p>Ø最后点击:保存(如图4.3-9所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720501294726132/0835248a_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-9保存示意图</p>
|
||
<p>Ø(可选)可手动点击:启动构建(如图4.3-10所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720526306401432/a69db612_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-10 启动构建任务示意图</p>
|
||
<p>Ø (可选)点击查看项目的启动日志:控制台输出(如图4.3-11至4.3-12所示)</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720550206214136/a84804ec_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-11任务日志查看示意图</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749720556729140993/c5aef073_15898786.png" alt="image.png"></p>
|
||
<p>图4.3-12 任务日志查看示意图</p>
|
||
<p>Ø至此流水线的配置已经完成,接下来就是调试Jenkinsfile脚本文件。</p>
|
||
<h3>
|
||
<a id="9444-构建脚本说明" class="anchor" href="#9444-%E6%9E%84%E5%BB%BA%E8%84%9A%E6%9C%AC%E8%AF%B4%E6%98%8E"></a>9.4.4.4 构建脚本说明</h3>
|
||
<p>这里提供两种Jenkinsfile构建方案设计</p>
|
||
<ol>
|
||
<li>一体化构建方案</li>
|
||
</ol>
|
||
<p>将所有构建流程(如创建目录、生成部署脚本、检查、停止、备份、替换、赋权及执行脚本等)集中编写在Jenkinsfile中,实现全流程自动化管控。</p>
|
||
<p>Jenkinsfile脚本示例:</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>pipeline {
|
||
agent any
|
||
|
||
// 环境变量定义
|
||
environment {
|
||
DEPLOY_DIR = "/data/apps/audit-ma-sit"
|
||
SOURCE_JAR = "audit-0.0.1-SNAPSHOT.jar"
|
||
TARGET_JAR = "audit-ma-sit.jar"
|
||
JAVA_ARGS = "--spring.profiles.active=test --server.port=8080"
|
||
DEPLOY_USER = "deploy-user" //目标服务器用户名
|
||
DEPLOY_SERVER = "10.4.126.62" //目标服务器IP
|
||
SSH_CREDENTIALS = "deploy-ssh-key" // Jenkins中配置的SSH凭据ID
|
||
}
|
||
|
||
triggers {
|
||
pollSCM('H * * * *')
|
||
}
|
||
|
||
options {
|
||
gitConnection('https://fcd.gdyditc.com/itc/ZHSJ/back.git')
|
||
timeout(time: 15, unit: 'MINUTES') // 构建超时设置
|
||
}
|
||
|
||
stages {
|
||
stage('初始化部署环境') {
|
||
steps {
|
||
// 本地生成部署脚本(同原逻辑)
|
||
sh """
|
||
mkdir -p ${DEPLOY_DIR}
|
||
cd ${DEPLOY_DIR}
|
||
cat <<'EOF' > deploy.sh
|
||
#!/bin/bash
|
||
DIR_PATH="${DEPLOY_DIR}"
|
||
SOURCE_JAR="${SOURCE_JAR}"
|
||
TARGET_JAR="${TARGET_JAR}"
|
||
PROJECT_ARGS="${JAVA_ARGS}"
|
||
|
||
stop_process() {
|
||
echo "[$(date)] Stopping \${TARGET_JAR}..."
|
||
pkill -9 -f \${TARGET_JAR} || echo "Service not running"
|
||
}
|
||
post_process() {
|
||
[ -f \${TARGET_JAR} ] && \
|
||
mv \${TARGET_JAR} \${TARGET_JAR}.bak && \
|
||
echo "Backup created: \${TARGET_JAR}.bak"
|
||
}
|
||
start_process() {
|
||
nohup java -jar \${TARGET_JAR} \${PROJECT_ARGS} > console.log 2>&1 &
|
||
[ \$? -eq 0 ] && \
|
||
echo "Started! PID: \$(pgrep -f \${TARGET_JAR})" || \
|
||
echo "Failed!"
|
||
}
|
||
cd \${DIR_PATH}
|
||
[ ! -f \${SOURCE_JAR} ] && { echo "Error: \${SOURCE_JAR} missing"; exit 1; }
|
||
stop_process
|
||
post_process
|
||
mv \${SOURCE_JAR} \${TARGET_JAR}
|
||
start_process
|
||
EOF
|
||
chmod +x deploy.sh
|
||
"""
|
||
}
|
||
}
|
||
|
||
stage('传输部署包') {
|
||
steps {
|
||
// 使用SSH Agent插件安全传输
|
||
sshagent(credentials: [SSH_CREDENTIALS]) {
|
||
sh """
|
||
# 打包本地文件
|
||
tar -czf ${TARGET_JAR}.tar.gz -C ${DEPLOY_DIR} .
|
||
|
||
# 传输到目标服务器
|
||
scp -o StrictHostKeyChecking=no \
|
||
${TARGET_JAR}.tar.gz \
|
||
${DEPLOY_USER}@${DEPLOY_SERVER}:/tmp/
|
||
|
||
# 远程解压并执行
|
||
ssh -o StrictHostKeyChecking=no \
|
||
${DEPLOY_USER}@${DEPLOY_SERVER} "
|
||
mkdir -p ${DEPLOY_DIR}
|
||
tar -xzf /tmp/${TARGET_JAR}.tar.gz -C ${DEPLOY_DIR}
|
||
cd ${DEPLOY_DIR} && ./deploy.sh
|
||
rm -f /tmp/${TARGET_JAR}.tar.gz
|
||
"
|
||
"""
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
post {
|
||
success {
|
||
slackSend(color: 'good',
|
||
message: "SUCCESS: ${JOB_NAME} deployed to ${DEPLOY_SERVER}")
|
||
sh """
|
||
echo "Deployment validated:"
|
||
ssh ${DEPLOY_USER}@${DEPLOY_SERVER} \
|
||
\"pgrep -f ${TARGET_JAR} && curl -s http://localhost:8080/health\"
|
||
"""
|
||
}
|
||
failure {
|
||
slackSend(color: 'danger',
|
||
message: "FAILED: ${JOB_NAME} - Check ${BUILD_URL}")
|
||
}
|
||
always {
|
||
// 清理临时文件
|
||
sh "rm -f ${DEPLOY_DIR}/${TARGET_JAR}.tar.gz"
|
||
}
|
||
}
|
||
}
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>2.模块化构建方案</p>
|
||
<p>将启动脚本独立拆分至项目代码库,支持按服务粒度定制或参数化调用,Jenkinsfile仅负责调度执行,提升灵活性与可维护性。</p>
|
||
<p>Ø这里Jenkinsfile的脚本命令将通过远程执行命令,所以Jenkins服务器需要下载相应插件,下载命令:sudo yum install sshpass</p>
|
||
<p>Jenkinsfile脚本示例:</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>node("agent_amd64_1"){
|
||
// 构建前清理工作空间
|
||
step([$class: 'WsCleanup'])
|
||
|
||
// 1工程名(服务名)
|
||
def project_name='audit-back'
|
||
// 2工程部署目标服务器ip(自己linux机器地址)
|
||
def deploy_ip='10.4.126.63'
|
||
// 3工程启动端口
|
||
def port='8080'
|
||
// 4环境标识
|
||
def env='dev'
|
||
|
||
|
||
//5这里要改标识码和仓库路径
|
||
stage('Checkout') {
|
||
checkout([$class: 'GitSCM', branches: [[name: '*/dev']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'f0c86da7-7d54-4f77-aedf-31fe43b51fbe',url: 'https://fcd.gdyditc.com/itc/ZHSJ/back.git']]])
|
||
}
|
||
// 跳过测试打包
|
||
stage('Archive Artefact') {
|
||
sh "mvn package -Dmaven.test.skip=true"
|
||
|
||
//6 这里要改服务器的标识码
|
||
withCredentials([usernamePassword(credentialsId:'7d49d98-8e4a-4e5b-acb4-6e0bb5010e7', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]){
|
||
stage("Deploy to $env") {
|
||
// 清理目标服务器旧文件
|
||
sh "sshpass -p $PASSWORD ssh $USERNAME@$deploy_ip \" rm -rf /home/$USERNAME/$project_name \" "
|
||
// 本地打包
|
||
sh "mkdir $project_name"
|
||
sh "cp ./target/*.jar $project_name"
|
||
sh "cp ./script/startup.sh $project_name"
|
||
sh "tar -cvf $project_name'.tar' $project_name "
|
||
// 传输并解压
|
||
sh "sshpass -p $PASSWORD scp $project_name*.tar $USERNAME@$deploy_ip:/home/$USERNAME/ "
|
||
sh "sshpass -p $PASSWORD ssh $USERNAME@$deploy_ip \"cd /home/$USERNAME;tar -xvf $project_name*.tar \" "
|
||
sh "sshpass -p $PASSWORD ssh $USERNAME@$deploy_ip \"cd /home/$USERNAME;rm -f $project_name*.tar \" "
|
||
// 启动服务(防止Jenkins杀死进程)
|
||
withEnv(['JENKINS_NODE_COOKIE=dontKillMe']) {
|
||
//这里调用启动脚本传入两个参数
|
||
sh "sshpass -p $PASSWORD ssh $USERNAME@$deploy_ip \"cd /home/$USERNAME/$project_name; chmod +x startup.sh;/bin/bash -l startup.sh $env $port \" "
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>Ø上述的Jenkinsfile调用了一个启动脚本(startup.sh),启动脚本所在的项目位置参考下图4.4-1所示</p>
|
||
<p><img src="https://foruda.gitee.com/images/1749721579461150319/ba616128_15898786.png" alt="image.png"></p>
|
||
<p>图4.4-1 startup.sh脚本所在目录示意图</p>
|
||
<p>startup.sh启动脚本示例:</p>
|
||
<div class="markdown-code-block">
|
||
<pre><code>#!/usr/bin/env bash
|
||
|
||
projectName=audit-back
|
||
target=$1
|
||
port=$2
|
||
|
||
health_url="http://127.0.0.1:$port/actuator/health"
|
||
|
||
echo "target = "$target
|
||
|
||
pid=`ps -ef |grep 'java' |grep $projectName |grep $port |awk '{print $2}'`
|
||
if [ -n "$pid" ]; then
|
||
kill -9 $pid
|
||
sleep 3
|
||
fi
|
||
|
||
case $target in
|
||
dev)
|
||
JAVA_OPTS="-Xms512m -Xmx512m -Xss256k -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:SurvivorRatio=8"
|
||
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:../logs/$projectName/gc.log"
|
||
JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs/$projectName/dump"
|
||
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=$target -Dserver.port=$port "
|
||
nohup java -jar $JAVA_OPTS $projectName*.jar > /dev/null &
|
||
;;
|
||
sit | tag)
|
||
JAVA_OPTS="-Xms512m -Xmx512m -Xss256k -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:SurvivorRatio=8"
|
||
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:../logs/$projectName/gc.log"
|
||
JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs/$projectName/dump"
|
||
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=$target -Dserver.port=$port "
|
||
nohup java -jar $JAVA_OPTS $projectName*.jar > /dev/null &
|
||
;;
|
||
uat)
|
||
JAVA_OPTS="-Xms1024m -Xmx1024m -Xss256k -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m -XX:SurvivorRatio=8"
|
||
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/logs/$projectName/gc.log"
|
||
JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=..logs/$projectName/dump"
|
||
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=uat -Dserver.port=$port "
|
||
nohup java -jar $JAVA_OPTS $projectName*.jar > /dev/null &
|
||
;;
|
||
prod)
|
||
JAVA_OPTS="-Xms2048m -Xmx2048m -Xss256k -Xmn256m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=384m -XX:SurvivorRatio=8"
|
||
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:../logs/$projectName/gc.log"
|
||
JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs/$projectName/dump"
|
||
JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=$target -Dserver.port=$port "
|
||
nohup java -jar $JAVA_OPTS $projectName*.jar > /dev/null &
|
||
;;
|
||
*)
|
||
echo "No this ENV:$target."
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
|
||
sleep 20
|
||
for ((i=0;i<20;i++))
|
||
do
|
||
curl -s ${health_url} > health
|
||
state=`cat health |grep status |grep UP`
|
||
if [ ${#state} -gt 10 ]; then
|
||
break
|
||
else
|
||
echo "Waiting for start ..."
|
||
sleep 5
|
||
fi
|
||
done
|
||
if [ ${#state} -gt 10 ]; then
|
||
echo "Deploy Success"
|
||
exit 0
|
||
else
|
||
echo "Deploy Fail"
|
||
exit 1
|
||
fi
|
||
|
||
</code></pre>
|
||
<div class="markdown-code-block-copy-btn"></div>
|
||
</div>
|
||
<p>上述startup.sh启动脚本内容如下:</p>
|
||
<ol>
|
||
<li>基本参数设置</li>
|
||
</ol>
|
||
<p>projectName: 项目名称,这里是 audit-back。</p>
|
||
<p>target: 第一个参数,表示部署的目标环境(如 dev、sit、uat、prod 等)。</p>
|
||
<p>port: 第二个参数,表示项目启动的端口号。</p>
|
||
<p>health_url: 健康检查的 URL,用于检测项目是否成功启动(基于 Spring Boot Actuator 的 /health 端点)</p>
|
||
<ol start="2">
|
||
<li>停止已有进程</li>
|
||
<li>根据环境启动项目</li>
|
||
</ol>
|
||
<p>JVM 配置:</p>
|
||
<p>堆内存:-Xms512m -Xmx512m(初始和最大堆内存均为 512MB)。</p>
|
||
<p>线程栈:-Xss256k。</p>
|
||
<p>年轻代:-Xmn256m。</p>
|
||
<p>元空间:-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=384m。</p>
|
||
<p>垃圾回收:使用 CMS 收集器(-XX:+UseConcMarkSweepGC),并打印 GC 日志。</p>
|
||
<p>OOM 时生成堆转储文件。</p>
|
||
<p>Spring 配置:</p>
|
||
<p>激活指定的 Profile(-Dspring.profiles.active=$target)。</p>
|
||
<p>设置服务端口(-Dserver.port=$port)。</p>
|
||
<p>通过 nohup 后台启动项目,并将日志输出到 /dev/null(丢弃日志)</p>
|
||
<ol start="4">
|
||
<li>健康检查</li>
|
||
</ol>
|
||
<p>等待 20 秒后,开始检查健康状态。</p>
|
||
<p>循环最多 20 次,每次间隔 5 秒,通过 curl 访问 health_url。</p>
|
||
<p>如果响应中包含 UP 状态,则认为启动成功,退出循环。</p>
|
||
<ol start="5">
|
||
<li>结果判断。</li>
|
||
</ol>
|
||
<p>startup.sh启动脚本功能总结</p>
|
||
<p>停止旧进程:确保端口和项目无冲突。</p>
|
||
<p>动态配置:根据环境(dev/sit/uat/prod)调整 JVM 参数。</p>
|
||
<p>启动项目:后台运行 Java 服务。</p>
|
||
<p>健康检查:通过 Actuator 接口验证服务是否就绪。</p>
|
||
<h2>
|
||
<a id="945-结语" class="anchor" href="#945-%E7%BB%93%E8%AF%AD"></a>9.4.5 结语</h2>
|
||
<p>当前 Jenkins 自动化部署流水线已完成全链 路配置,系统将按以下机制运行:</p>
|
||
<p>Ø 定时构建:每日通过 Poll SCM 自动轮询代码仓库变更(配置频率:H(0-29) 12,18 * * *)</p>
|
||
<p>Ø 事件触发:支持 Git Webhook 实时触发代码更新部署</p>
|
||
<p>Ø 版本追溯:每次构建关联 Git Commit ID 与制品版本</p>
|
||
<p>后续开发人员可基于此环境:</p>
|
||
<p>Ø 按需创建微服务/前后端构建任务</p>
|
||
<p>Ø 参考本文档的权限管理及流水线设计规范</p>
|
||
<p>如需扩展部署场景或调整流程,请联系 DevOps 团队协同优化。</p></div><div class='title'>10. 常见问题</div><div class='content'><h3>
|
||
<a id="101-权限问题" class="anchor" href="#101-%E6%9D%83%E9%99%90%E9%97%AE%E9%A2%98"></a>10.1 权限问题</h3>
|
||
<p>Q: 如何配置接口权限?
|
||
A: 在Controller方法上添加@SaCheckPermission注解</p>
|
||
<h3>
|
||
<a id="102-数据源问题" class="anchor" href="#102-%E6%95%B0%E6%8D%AE%E6%BA%90%E9%97%AE%E9%A2%98"></a>10.2 数据源问题</h3>
|
||
<p>Q: 如何配置多数据源?
|
||
A: 在application.yml中配置多数据源,并在Service上使用@DS注解</p>
|
||
<h3>
|
||
<a id="103-缓存问题" class="anchor" href="#103-%E7%BC%93%E5%AD%98%E9%97%AE%E9%A2%98"></a>10.3 缓存问题</h3>
|
||
<p>Q: 如何使用Redis缓存?
|
||
A: 使用@Cacheable注解或RedisTemplate</p></div><div class='title'>11. 常见业务场景开发示例</div><div class='content'><p>.keep</p></div><div class='title'>12. 更新日志</div><div class='content'><h3>
|
||
<a id="v201-2024-03-31" class="anchor" href="#v201-2024-03-31"></a>v2.0.1 (2024-03-31)</h3>
|
||
<ul>
|
||
<li>新增ChatGPT集成</li>
|
||
<li>优化代码生成器</li>
|
||
<li>修复已知问题</li>
|
||
</ul>
|
||
<h3>
|
||
<a id="v200-2024-02-26" class="anchor" href="#v200-2024-02-26"></a>v2.0.0 (2024-02-26)</h3>
|
||
<ul>
|
||
<li>升级Spring Boot到2.7.5</li>
|
||
<li>升级MyBatis-Plus到3.5.1</li>
|
||
<li>新增工作流引擎</li>
|
||
</ul></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</body>
|
||
</html> |