Files
2025-10-10 11:35:02 +08:00

2468 lines
140 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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&amp;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&amp;characterEncoding=utf8&amp;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>点击左侧菜单:在线开发-&gt;代码生成
<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>点击菜单 工作流程-&gt;流程设计 点击新增流程按钮
1、从左侧拖入需要的用户节点、网关、结束节点等
2、填写右侧流程属性信息选择默认表单为之前创建的工单
3、选择某个节点设置节点审批人
4、选择关联功能tab-&gt;勾选是否启用按钮-&gt;选择功能表单-&gt;流程已添加表单-&gt;勾选工单点击确认-&gt;最后选择更新表单按钮-&gt;保存模版
注:后续表单有字段调整也需要在此处更新表单并保存</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>点击左侧菜单:在线开发-&gt;代码生成
<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>点击菜单 工作流程-&gt;流程设计 点击新增流程按钮
1、从左侧拖入需要的用户节点、网关、结束节点等
2、填写右侧流程属性信息选择默认表单为之前创建的工单
3、选择某个节点设置节点审批人
4、选择关联功能tab-&gt;勾选是否启用按钮-&gt;选择功能表单-&gt;流程已添加表单-&gt;勾选工单点击确认-&gt;最后选择更新表单按钮-&gt;保存模版
注:后续表单有字段调整也需要在此处更新表单并保存</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 的身份登录系统,在“表单设计”模块的“完整配置--&gt; 渲染覆盖配置”中,可以根据租户需求,对表单详情页字段的名称和显隐、列表页展示字段、列表查询栏进行个性化配置。</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 &gt; app.log 2&gt;&amp;1 &amp;
</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 &gt; $LOG_FILE 2&gt;&amp;1 &amp;
# 显示启动状态
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 &gt;= 2核心 / 内存&gt;= 2GB / 能连接网络</td>
</tr>
<tr>
<td>192.168.133.138 node2</td>
<td>CPU &gt;= 2核心 / 内存&gt;= 2GB / 能连接网络</td>
</tr>
<tr>
<td>192.168.133.139 node3</td>
<td>CPU &gt;= 2核心 / 内存&gt;= 2GB / 能连接网络</td>
</tr>
<tr>
<td>192.168.133.140 node4</td>
<td>CPU &gt;= 2核心 / 内存&gt;= 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" &gt;&gt; /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/node4hostnamectl 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>/#&amp;/" /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 &gt; /etc/sysctl.d/kubernetes.conf &lt;&lt; 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 &lt;&lt;EOF &gt; /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 &lt;(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 CEwget -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 &gt; /root/offline-pkg/image-list.txt &lt;&lt;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 &lt; /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 &gt; /root/offline-pkg/configs/daemon.json &lt;&lt;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 &gt; /etc/systemd/system/docker.service &lt;&lt;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>Ø 执行命令配置Dockermkdir /etc/docker</p>
<p>Ø 执行命令复制Docker配置cp configs/daemon.json /etc/docker/</p>
<p>Ø 执行命令自启Dockersystemctl enable docker</p>
<p>Ø 执行命令启动Dockersystemctl 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>Ø 执行命令解压K8Star -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 &gt; /etc/systemd/system/kubelet.service &lt;&lt;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是JNLPJava 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>Ø 选择Name10.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 filestarget/audit-0.0.1-SNAPSHOT.jar</p>
<p>(指定需要传输到远程服务器的本地文件路径)</p>
<p>Ø 填写Remove prefixtarget</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 &lt;&lt;\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 &amp;&gt;/dev/null &amp;
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 &lt;&lt;'EOF' &gt; 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} ] &amp;&amp; \
mv \${TARGET_JAR} \${TARGET_JAR}.bak &amp;&amp; \
echo "Backup created: \${TARGET_JAR}.bak"
}
start_process() {
nohup java -jar \${TARGET_JAR} \${PROJECT_ARGS} &gt; console.log 2&gt;&amp;1 &amp;
[ \$? -eq 0 ] &amp;&amp; \
echo "Started! PID: \$(pgrep -f \${TARGET_JAR})" || \
echo "Failed!"
}
cd \${DIR_PATH}
[ ! -f \${SOURCE_JAR} ] &amp;&amp; { 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} &amp;&amp; ./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} &amp;&amp; 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 &gt; /dev/null &amp;
;;
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 &gt; /dev/null &amp;
;;
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 &gt; /dev/null &amp;
;;
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 &gt; /dev/null &amp;
;;
*)
echo "No this ENV:$target."
exit 1
;;
esac
sleep 20
for ((i=0;i&lt;20;i++))
do
curl -s ${health_url} &gt; 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>