Jenkins 最佳实践
1. 在Jenkins中避免调度过载
过载Jenkins以同时运行多个作业可能导致资源竞争、构建速度变慢和系统性能问题。分配作业启动时间可以防止瓶颈,并确保更顺畅的执行。如何实现?
- 在Cron表达式中使用H:引入抖动(jitter),使用H来错开作业启动时间,避免同时执行多个作业。
H/3 * * * * // 每隔3分钟运行
2. 在cron表达式中正确使用时区。
验证:
Jenkins 还有一组别名,可以使使用常见的时间间隔更容易。
2. 使用环境变量来配置管道
硬编码像API密钥或部署URL这样的值会使管道的灵活性降低,并且更难维护。环境变量允许你将这些值外部化,使你的管道能够适应不同的环境(开发、测试、生产)。
如何实现?
在Jenkinsfile中定义环境变量:
environment {ENV_NAME = 'production'API_KEY = credentials('api-key-id')}
这使得你的管道在不同环境中更加动态和易于管理。
3. 设置构建保留策略以管理磁盘空间
随着Jenkins构建的积累,它们会占用大量的磁盘空间。设置保留策略可以帮助您丢弃旧的、不必要的构建,防止Jenkins变慢。
如何实施?
在每个作业的配置中,启用丢弃旧构建,并指定要保留的构建数量或构建的天数。这样可以确保Jenkins仅保留相关构建,减少存储开销。
4. 参数化构建
有时,拥有多个“参数”的构建是有用的/必要的。考虑以下使用情况:
- 您在Jenkins上设置了一个测试作业,它接受一个分发包作为参数并对其进行测试。您希望开发人员进行本地构建,并让他们提交构建以在Jenkins上执行测试。在这种情况下,您的参数是一个包含分发的zip文件。
- 您的测试套件运行时间很长,以至于在正常执行中您无法承受运行整个测试周期的费用。因此,您希望控制要执行的测试部分。
在这种情况下,您的参数可能是一个字符串令牌,指示要运行的测试套件。这些参数可作为环境变量使用。因此,例如,shell($FOO,%FOO%)或Ant(${env.FOO})可以访问这些值。
定义参数:env和jdk_version:
在pipeline中使用该参数
验证:
5. 使用共享库来简化流水线
创建共享库:要在Jenkins中创建共享库,请按照以下步骤操作:
1. 创建一个Git仓库:首先创建一个Git仓库来托管您的共享库代码。该仓库应具有Jenkins能理解的特定结构。
2. 创建‘vars’目录:在您的仓库中创建一个‘vars’目录。该目录将包含您的可重用函数。
3. 定义函数:在‘vars’目录中,将您的函数定义为Groovy文件。每个文件应包含一个函数,文件名将作为函数名。例如,如果您有一个名为‘sayHello’的函数,请创建一个名为`sayHello.groovy`的文件,其中包含该函数。
#!/usr/bin/env groovydef call(String name = 'human') {echo "Hello, ${name}."
}
4. 提交并推送:将您的更改提交到Git仓库并推送到远程仓库。在Jenkins Pipeline中使用共享库:现在您已创建了一个共享库,可以在您的Jenkins Pipeline脚本中使用它。以下是一个示例:
@Library('pipeline-library-demo')_stage('Demo') {echo 'Hello world'sayHello 'Alex'}
构建管道并检查控制台输出表明共享库正确加载并与用户输入交互。
在上面的例子中,我们使用 `@Library` 加载共享库,并导入我们想用的函数。然后,我们可以在我们的流水线脚本中调用这些函数。
现实世界示例:使用共享库进行 Kubernetes 部署假设你有一个简化 Kubernetes 部署的共享库。以下是你如何在 Jenkins 流水线中使用它的示例:
@Library('k8s-deploy-library') // Load the Kubernetes deployment library
import com.example.kubernetes.*pipeline {agent anyenvironment {DOCKER_IMAGE = 'myapp:latest'}stages {stage('Build and Push Docker Image') {steps {script {buildAndPushDockerImage(image: DOCKER_IMAGE)}}}stage('Deploy to Kubernetes') {steps {script {// Deploy to Kubernetes using the shared library functiondeployToKubernetes(deploymentName: 'myapp', image: DOCKER_IMAGE)}}}}
}
在这个例子中,我们使用共享库来构建并推送 Docker 镜像,然后将其部署到 Kubernetes 集群中。共享库抽象了这些任务的复杂性,使管道脚本更具可读性和可维护性。
6. 在流水线中执行安全扫描
将安全检查融入您的流水线可以尽早发现漏洞,确保在代码进入生产环境之前是更安全的。自动化的安全扫描将减少漏洞被引入代码库的风险。如何实施?
将安全工具,如SonarQube或OWASP依赖检查,集成到您的流水线中:
stage('SonarCloud') {environment {SCANNER_HOME = tool 'SonarQubeScanner'ORGANIZATION = "rock-github"PROJECT_NAME = "java_jenkins-pipeline-as-code"}steps {withSonarQubeEnv('SonarCloudOne') {sh '''$SCANNER_HOME/bin/sonar-scanner -Dsonar.organization=$ORGANIZATION \-Dsonar.java.binaries=build/classes/java/ \-Dsonar.projectKey=$PROJECT_NAME \-Dsonar.sources=.'''}}
}
7. 使用角色来管理用户的权限
企业有这样的需求,开发部门的员工不能访问生产环境的release pipeline。只能看到测试环境的CI pipeline,要实现这样的需求,需要用到基于角色的权限管理。
首先需要安装下面的plug-in。
创建用户,在系统管理-安全-管理用户
点击创建用户
然后创建角色,并指定权限,使用表达式来匹配jenkins-ci开头的job。
然后分配角色给用户
使用该用户登录后,发现只能看到jenkins-ci开头的pipeline。
7. 将您的流水线作为代码
建议使用该功能将Jenkinsfile存储在源代码管理(SCM)中,然后进行版本控制和测试。将您的流水线视为代码可以打开一系列新的功能和能力,如多分支、拉取请求检测以及对GitHub和BitBucket的组织扫描。使用Jenkinsfile调用流水线作为代码使用其默认名称Jenkinsfile调用流水线脚本,并开始遵循脚本头部。这有助于您的IDE、GitHub和其他工具将其识别为Groovy,并启用所需的代码高亮显示。
8. 不要使用 Maven 作业类型
Jenkins 多年来一直提供 Maven 集成插件,允许用户通过 Jenkins 的“新建项目”菜单选择“Maven 项目”来创建 Maven 项目。虽然 Maven 作业类型提供了与 Maven 构建的更高水平集成,但有时由于这种深度集成,可能会引入不必要的复杂性。
考虑使用组织文件夹、多分支管道或管道作业,而不是 Maven 作业类型。这些替代方案在管理您的 Jenkins 作业和工作流程时提供了更多灵活性和简便性。
Jenkins 项目使用组织文件夹在 ci.jenkins.io 上构建 Jenkins 核心和 Jenkins 插件。Jenkins 管道可以轻松构建 Maven 项目,并为 Maven 用户提供更好的控制。
9. 避免资源冲突
可锁定资源
这个插件允许定义可锁定的资源(例如打印机、电话、计算机等),这些资源可以被构建使用。如果一个构建需要一个已经被锁定的资源,它将等待该资源释放。
当多个作业同时运行时,特别是当它们需要对某些资源或设置服务进行独占访问时,可能会发生冲突。为了防止干扰并确保顺利执行,有效管理资源访问至关重要。对于涉及数据库或网络服务的构建,实施防止冲突的措施是至关重要的。可锁定资源插件为Jenkins作业提供了细粒度的资源锁定功能。通过使用此插件,您可以确保在任何时候只有一个作业能够访问特定资源,从而避免冲突并确保正确的同步。在可锁定资源插件的资源锁定不足以解决问题的情况下,您可以使用限制并发构建插件进一步控制并发构建。该插件允许您限制可以同时运行的构建数量,提供额外的控制并防止对共享资源的过载。
通过利用这些插件,您可以有效管理资源冲突和并发性,确保Jenkins作业的顺利和可靠执行。
下面是一个使用资源锁的pipeline
echo 'Starting'
lock('SH_Printer_ColorA3_2342') {echo 'Do something here that requires unique access to the resource'// any other build will wait until the one locking the resource leaves this block
}
echo 'Finish'
10. 报告构建结果
图表和图形为项目状态和进展提供了有价值的见解,展示了趋势和模式。自动化测试结果,包括单元测试、集成测试和端到端测试,可以揭示脆弱性或不稳定性。覆盖率报告帮助识别没有执行自动化测试的领域。编译器警告消息通常是问题的第一指示。静态分析工具在报告有风险的代码或潜在安全风险的代码方面非常有效。性能测试结果帮助识别延迟或关注区域。
下一代警告插件提供了方便访问许多报告的途径,包括:
- 编译器警告和错误(如gcc、clang、javac或golang)
- 静态分析警告和错误(如spotbugs、checkstyle、pmd、lint、cpd或Simian)
- 代码覆盖报告
相关文章:
Jenkins 最佳实践
1. 在Jenkins中避免调度过载 过载Jenkins以同时运行多个作业可能导致资源竞争、构建速度变慢和系统性能问题。分配作业启动时间可以防止瓶颈,并确保更顺畅的执行。如何实现? 在Cron表达式中使用H:引入抖动(jitter)&a…...
如何查询Ubuntu系统中最大的几个目录以G单位显示大小,从大到小排列?
环境: Ubuntu 20,04 问题描述: 如何查询系统中最大的几个目录以G单位显示大小,从大到小排列? 解决方案: 想查看整个系统(单一文件系统内)最大的20个目录,结果按大小从大到小排序…...
深入浅出拆分学习,图神经网络拆分学习,混合联邦学习
深入浅出解析拆分学习(Split Learning)、图神经网络拆分学习(Split Learning for Graph Neural Networks)以及混合联邦学习(Hybrid Federated Learning),这三者都体现了在分布式数据环境下进行机…...
DDD领域驱动介绍
📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…...
ubuntu22鼠键失灵恢复记录笔记chatgpt解决
ChatGPT 说: 你提到“Ubuntu 22 鼠键失灵”,这个问题可能涉及以下几方面: 🧭 先确认问题 是鼠标问题还是键盘问题,还是触控板? “鼠键”一般理解为“鼠标键”,请确认你是指鼠标左键/右键失灵&a…...
在服务器上安装AlphaFold2遇到的问题(1)
犯了错误,轻信deepseek,误将cuDNN8.9.7删掉 [rootlocalhost ~]# cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 #define CUDNN_MAJOR 8 #define CUDNN_MINOR 9 #define CUDNN_PATCHLEVEL 7 -- #define CUDNN_VERSION (CUDNN_MA…...
ch10 题目参考思路
ch10 - 最小生成树 有线通讯网 知识点:Prim 算法思路: 该题要求对 n 座城市铺设 n - 1 条光缆,并要求所有城市连通,那本质上是一棵树,又要求铺设光缆的费用最低,即要求选取的 n - 1 条光缆的长度最小&…...
Hudi、Iceberg 、 Paimon 数据湖选型对比
Hudi、Iceberg 和 Paimon 是当前数据湖领域的三大主流开源框架,均致力于解决数据湖场景下的增量更新、事务支持、元数据管理、流批统一等核心问题,但设计理念和适用场景存在差异。以下从技术特性、适用场景和选型建议三方面对比分析: 一、核心技术特性对比 维度HudiIceberg…...
2025认证杯数学建模第二阶段A题完整论文(代码齐全):小行星轨迹预测思路
2025认证杯数学建模第二阶段A题完整论文(代码齐全):小行星轨迹预测思路,详细内容见文末名片 第二阶段问题 1 分析 问题起源与相关性:为了更全面地评估近地小行星对地球的潜在威胁,需要对其轨道进行长期预测。三个月内的观测数据为…...
信息安全基础知识
信息系统 信息系统能进行(数据)的采集、传输、存储、加工,使用和维护的计算机应用系统 例如:办公自动化、CRM/ERP、HRM、12306火车订票系统等。 信息安全 信息安全是指保护信息系统中的计算机硬件、软件、数据不因偶然或者恶意…...
UE RPG游戏开发练手 第二十六课 普通攻击1
UE RPG游戏开发练手 第二十六课 普通攻击1 1.定义攻击的InputTag MyGameplayTags.h代码 RPGGAMETEST_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_LightAttack_Axe);MyGameplayTag.cpp代码 UE_DEFINE_GAMEPLAY_TAG(InputTag_LightAttack_Axe, "InputTag.LightAttack.Ax…...
SAP ABAP 程序中归档数据读取方式
上一篇文章记录了字段目录,归档信息结构,这篇文章记录如何通过字段目录,归档信息结构,归档对象读取归档数据。未归档数据是从数据库表直接抽取,本样例是通过归档读取方式复写sql。 发布时间:2025.05.16 示…...
每周资讯 | 腾讯Q1财报:国内游戏业务收入同比增长24%;Tripledot 8亿美元收购AppLovin游戏业务
内容速览: 广州“服务贸易和数字贸易22条”助推游戏产业发展Tripledot Studios 8亿美元收购AppLovin游戏业务苹果紧急申请暂停执行AppStore新规4月中国手游出海收入下载榜,点点互动《Kingshot》收入激增 腾讯Q1财报:国内游戏业务收入同比增长…...
iOS SwiftUI的具体运用实例(SwiftUI库的运用)
最近接触到一个 SwiftUI的第三方框架,它非常的好用。以下是 具体运用实例,结合其核心功能与开发场景,分多个维度进行详细解析: 一、基础 UI 组件开发 登录界面 SwiftUI 的 VStack、TextField 和 Button 可快速构建用户登录表单。例…...
杰理ac696配置sd卡随机播放
#define FCYCLE_LIST 0 // 列表循环(按顺序播放文件列表) #define FCYCLE_ALL 1 // 全部循环(播放完所有文件后重新开始) #define FCYCLE_ONE 2 // 单曲循环(重复播放当前文件) #define …...
MCP协议的核心机制和交互过程
MCP的核心是JSON-RPC 2.0 MCP使用了 JSON-RPC 2.0 作为client和server端的消息传输。JSON-RPC 2.0是一个用JSON编码的轻量级远程过程调用协议。它的优越性如下: 易读,易调试与编程语言无关,环境无关技术成熟,规范清晰且应用广泛JSON-NPC 2.0定义了request、response、noti…...
论信息系统项目的范围管理
论信息系统项目的范围管理 前言一、规划范围管理,收集需求二、定义范围三、创建工作分解结构四、确认范围五、控制范围 前言 为了应对烟草零售客户数量大幅度增长所带来的问题,切实履行控烟履约的相关要求,同时也为了响应国务院“放管服”政策…...
米勒电容补偿的理解
米勒电容补偿是使运放放大器稳定的重要手法,可以使两级运放的两个极点分离,从而可以得到更好的相位裕度。 Miller 电容补偿的本质是增加一条通路流电流,流电流才是miller效应的本质。给定一个相同的输入,Miller 电容吃掉的电流比…...
力扣654题:最大二叉树(递归)
小学生一枚,自学信奥中,没参加培训机构,所以命名不规范、代码不优美是在所难免的,欢迎指正。 标签: 二叉树、递归 语言: C 题目: 给定一个不重复的整数数组 nums 。最大二叉树可以用下面的算…...
Go语言实现生产者-消费者问题的多种方法
Go语言实现生产者-消费者问题的多种方法 生产者-消费者问题是并发编程中的经典问题,涉及多个生产者生成数据,多个消费者消费数据,二者通过缓冲区(队列)进行协调,保证数据的正确传递和同步。本文将从简单到…...
深度学习驱动下的目标检测技术:原理、算法与应用创新(二)
三、主流深度学习目标检测算法剖析 3.1 R - CNN 系列算法 3.1.1 R - CNN 算法详解 R - CNN(Region - based Convolutional Neural Networks)是将卷积神经网络(CNN)应用于目标检测领域的开创性算法,其在目标检测发展历…...
提权脚本Powerup命令备忘单
1. 获取与加载 从 GitHub 下载:(New-Object Net.WebClient).DownloadFile("https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Privesc/PowerUp.ps1", "C:\Temp\PowerUp.ps1")本地加载:Import-Module .\Power…...
人工智能 (AI) 在无线接入网络 (RAN) 中的变革性作用
随着电信行业向更智能、更高效的系统迈进,将 AI 集成到 RAN 中已不再是可有可无,而是至关重要。 随着 6G 时代的到来,人工智能 (AI) 有望降低运营成本,并带来更大的盈利机会。AI-RAN 正处于这一变革的前沿,在 RAN 环境…...
从硬件角度理解“Linux下一切皆文件“,详解用户级缓冲区
目录 前言 一、从硬件角度理解"Linux下一切皆文件" 从理解硬件是种“文件”到其他系统资源的抽象 二、缓冲区 1.缓冲区介绍 2.缓冲区的刷新策略 3.用户级缓冲区 这个用户级缓冲区在哪呢? 解释关于fork再加重定向“>”后数据会打印两份的原因 4.内核缓冲…...
Python-感知机以及实现感知机
感知机定义 如果有一个算法,具有1个或者多个入参,但是返回值要么是0,要么是1,那么这个算法就叫做感知机,也就是说,感知机是个算法 感知机有什么用 感知机是用来表示可能性的大小的,我们可以认…...
根据台账批量制作个人表
1. 前期材料准备 1)要有 人员总的信息台账 2)要有 个人明白卡模板 2. 开始操作 1)打开 人员总的信息台账,选择所需要的数据模块; 2)点击插入,选择数据透视表,按流程操作&…...
ohttps开启群晖ssl证书自动更新
开启群晖ssl证书自动更新OHTTPS ohttps是一个免费自动签发ssl证书、管理、部署的项目。 https://ohttps.com 本文举例以ohttps项目自动部署、更新群晖的ssl证书。 部署 签发证书 打开ohttps-证书管理-创建证书-按你实际情况创建证书。创建部署节点 打开Ohttps-部署节点-添加…...
【Elasticsearch】flattened`类型在查询嵌套数组时可能返回不准确结果的情况
好的!为了更清楚地说明flattened类型在查询嵌套数组时可能返回不准确结果的情况,我们可以通过一个具体的例子来展示。这个例子将展示如何在文档中没有完全匹配的嵌套对象时,flattened类型仍然可能返回该文档。 示例文档结构 假设你有以下文…...
【知识点】语义分割任务中有哪些损失函数?
在语义分割任务中,模型需要对图像中的每个像素进行分类。因此,损失函数的设计不仅要关注整体精度,还需要特别注意目标物体的边界区域。以下是一些常用的损失函数及其适用场景,包括数学公式、PyTorch 实现和是否适合处理边界问题。 📌 一、交叉熵损失 Cross-Entropy Loss …...
Node.js 同步加载问题详解:原理、危害与优化策略
文章目录 一、什么是同步加载?二、同步加载的危害场景三、检测同步加载问题四、解决方案与代码优化 一、什么是同步加载? 1.核心概念 在 Node.js 的 CommonJS 模块系统中,require() 是同步操作: // 模块加载会阻塞后续代码执行 …...
linux下tcp/ip网络通信笔记1,
本文章主要为博主在学习网络通信的笔记一个Udp_echo_server,和client的代码实现 1,网络发展,网络协议,意识到网络通信——不同主机的进程间通信, 2,学习如何在应用层调用系统提供的接口进行通信,echo_Udp…...
网络攻防模拟:城市安全 “数字预演”
在当今数字化快速发展的时代,网络安全和城市安全面临着前所未有的挑战。为有效应对这些挑战,利用先进的技术搭建模拟演练平台至关重要。图扑软件的 HT for Web 技术,为网络攻防模拟与城市安全演练提供了全面且高效的解决方案。 三维场景搭建&…...
在 Ubuntu 20.04 中使用 init.d 或者systemd实现开机自动执行脚本
Ubuntu 20 默认使用的是 systemd 系统管理器,但传统的 SysV Init(/etc/init.d/)脚本依然兼容并可用。本文将介绍如何通过 init.d 写脚本来在开机时自动设置某个 GPIO(如 GPIO407)为高电平,适用于嵌入式系统…...
2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家
前言 题解 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)。 国赛比省赛难一些,做得汗流浃背,T_T. RC-u1 大家一起查作弊 分值: 15分 这题真的太有意思,看看描述 在今年的睿抗比赛上,有同学的提交代码如下࿱…...
【生成式AI文本生成实战】从GPT原理到企业级应用开发
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选…...
【目标检测】RT-DETR
DETRs Beat YOLOs on Real-time Object Detection DETR在实时目标检测任务中超越YOLO CVPR 2024 代码地址 论文地址 0.论文摘要 YOLO系列因其在速度与精度间的均衡权衡,已成为实时目标检测领域最受欢迎的框架。然而我们观察到,非极大值抑制…...
数据库行业竞争加剧,MySQL 9.3.0 企业版开始支持个人下载
最新发现,Oracle 官方网站放开了 MySQL 9.3.0 企业版下载链接,个人用户也可以免费下载,不过只能用于学习、开发或者原型测试,不能用于生产环境。 通常我们都是下载 MySQL 社区版,不过 MySQL 企业版可以支持更多高级功能…...
QMK宏全面实战教程:从入门到精通(附17个实用案例)(理论部分)
🎯 QMK宏全面实战教程:从入门到精通(附17个实用案例) 大家好!作为一名机械键盘DIY爱好者和QMK固件深度玩家,今天我要带大家彻底掌握QMK宏的使用技巧!无论你是刚接触机械键盘的新手,还是想提升定制化水平的老玩家,这篇包含17个实战案例的教程都能满足你的需求! 🔍…...
H3C网络设备(交换机、路由器、防火墙)常用命令整理
H3C网络设备(交换机、路由器、防火墙)的常用命令整理。 一、H3C交换机常用命令 1. 基础操作 命令说明system-view进入系统视图quit返回上一级视图save保存配置display current-configuration查看当前配置(类似 show run)display…...
从前序与中序遍历序列构造二叉树(中等)
先从前序遍历列表取出第一个元素,这个元素就是根节点,然后从中序遍历中找到这个根节点,节点左侧就是该节点的左子树的节点集合,右侧就是该节点的右侧节点集合,然后递归构建左右子树。 /*** Definition for a binary t…...
ASP.NET/IIS New StreamContent(context.Request.InputStream) 不会立即复制整个请求流的内容到内存
StreamContent 的工作原理与内存占用 New StreamContent(context.Request.InputStream) 不会立即复制整个请求流的内容到内存。这个操作只是创建一个包装器,将原始的请求流(context.Request.InputStream)封装在 StreamContent 对象中&#x…...
Java大师成长计划之第24天:Spring生态与微服务架构之分布式配置与API网关
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在微服务架构中,如何管理…...
Spring Security vs Shiro vs Sa-Token
一句话总结: Spring Security:大公司专业保安队,功能全面但配置复杂Shiro:轻便灵活的安保工具包,上手简单但功能有限Sa-Token:国产智能门禁系统,开箱即用,代码极简 对比表格&#x…...
MongoTemplate 基础使用帮助手册
前言 MongoDB 是一种流行的 NoSQL 数据库,适合存储大量的非结构化数据。MongoTemplate 是 Spring Data MongoDB 中的一个核心组件,它提供了一组丰富的 API 来与 MongoDB 进行交互。它封装了许多常见的数据库操作,使开发者能够轻松执行 CRUD 操…...
CCIE与HCIE哪个考试难度更大?
CCIE(思科认证互联网专家)与HCIE(华为认证ICT专家)的考试难度差异体现在技术体系、实验要求及评分标准。2023年全球数据显示,CCIE通过率约25%,HCIE通过率32%,但通过率不能完全反映实际挑战。 C…...
子查询对多层join优化记录
需求背景 查询某个用户是否具有某个角色 表 CREATE TABLE mdm_platform_role_user (ID bigint NOT NULL AUTO_INCREMENT,ROLE_ID varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,USER_ID varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci …...
容器编排利器-k8s入门指南
Kubernetes(K8s)入门指南:容器编排利器 什么是 Kubernetes? Kubernetes(常简称为K8s)是一个开源的容器编排平台,由 Google 开源并交由云原生计算基金会(CNCF)管理。它可以帮助我们自动化部署、扩展和管理容器化应用程序。 为什么需要 Kubernetes? 在微服务架构盛行的今…...
MyBatis—动态 SQL
MyBatis—动态 SQL 一、动态 SQL 的核心作用 动态 SQL 主要解决以下问题: 灵活性:根据不同的输入参数生成不同的 SQL 语句(如条件查询、批量操作)。 可维护性:减少重复代码,通过标签化逻辑提高 SQL 可读…...
解决“VMware另一个程序已锁定文件的一部分,进程无法访问“
问题描述 打开VMware里的虚拟机时,弹出"另一个程序已锁定文件的一部分,进程无法访问"如图所示: 这是VM虚拟机的保护机制。虚拟机运行时,为防止数据被篡改,会将所运行的文件保护起来。当虚拟机崩溃或者强制…...
如何创建一个不可变类
写在前面 如果对象在构造后无法更改,则该对象是不可变的。不可变对象不会以任何方式暴露其他对象来修改其状态; 对象的字段仅在构造函数内初始化一次,并且永远不会再次更改。 1.不可变类的用法 如今,每个软件应用程序的*“必备”规范都是分…...