Windows系统Jenkins企业级实战
目标
在Windows操作系统上使用Jenkins完成代码的自动拉取、编译、打包、发布工作。
实施
1.安装Java开发工具包(JDK)
Jenkins是基于Java的应用程序,因此需要先安装JDK。可以从Oracle官网或OpenJDK下载适合的JDK版本。推荐java17版本,因为Jenkins依赖高版本的jdk。
安装包下载地址:
Java Downloads | Oracle 中国
2.下载并安装Jenkins
访问Jenkins官方网站,下载最新的Windows安装包。运行安装程序,按照提示完成安装。
安装包下载地址:
Jenkins 的安装和设置
安装教程(文章内容比较多,看安装部分的内容):
Windows下Jenkins软件安装说明及配置_windows jenkins配置文件在哪里-CSDN博客
3.访问Jenkins
访问地址:服务器ip+配置的端口(安装过程中自己配置的端口号)
4.配置Jenkins
配置maven,用于程序打包
配置jdk,Jenkins依赖jdk运行(版本不能太低,最好是jdk17)
配置maven安装路径
基础配置完成。
5新建任务
创建maven项目
保存后,自动跳转到配置页面。
选择参数化构建,本地使用的是SVN源码管理工具,用branch分支作为参数,选择List XXX
配置参数化数据源(branch列表)
配置svn账号
配置svn用户名和密码
排序规则选择
配置代码来源
test 所在位置如下图所示,用来在打包时动态替换配置文件的,比如测试环境需要测试的配置文件,开发环境需要开发的配置文件,那么在发布测试版本时,就用如下的配置方式来激活测试配置文件。 在文章末尾,有完整的pom文件内容,供参考。
maven打包完成后,把war包放到Tomcat对应的webapps目录中,完成项目部署,这个步骤用脚本实现。
编写脚本,完成部署
脚本的内容根据实际需要进行编写,需要做什么操作,就写对应操作的shell脚本。
以上配置完成,进行项目构建。
6.构建项目
找打前面已经创建的任务,点击参数化构建
此时就可以看到所有的branch版本,选择需要的版本,然后点击构建。
剩下的就是等着就可以了,等待构建完毕,整个部署动作就完成了。
点击对应的构建编号,可以看具体执行过程。
当看到success,表示构建完成。
通过以上步骤,可以在Windows平台上成功搭建并配置Jenkins,实现自动化构建和部署。
问题及其处理方案:
1.本地包的引用
Jenkins构建时,出现如下报错:
包缺失问题,这些是本地jar包(jar包文件放在项目的lib目录中,项目结构如下图),不是从maven仓库拉取。解决方法是在pom文件中加载本地文件。
修改pom.xml,把缺失的包都引用上。
<dependency><groupId>com.sheca</groupId><artifactId>words</artifactId><version>1.6</version><scope>system</scope><systemPath>${project.basedir}/web/WEB-INF/lib/aspose-words-15.8.0-jdk16.jar</systemPath> </dependency>
${project.basedir} 表示项目的根目录。
2.版本冲突
Jenkins构建时,报错:程序包javax.xml.bind.annotation不存在
AI给出的错误原因:这些错误表明你的项目在编译时找不到 javax.xml.bind 包中的类。这通常是因为在 Java 9 及更高版本中,javax.xml.bind(JAXB)不再是 Java SE 的一部分,需要手动添加依赖。
因为Jenkins配置的jdk版本为jdk17。maven打包时,当前java项目依赖的jdk版本为jdk8,两个版本会冲突,解决方法:
修改pom.xml文件,在进行maven打包时,使用jdk8:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target><fork>true</fork><executable>C:\Program Files\Java\jdk1.8.0_191\bin\javac</executable> <!-- 指定JDK路径--></configuration> </plugin>
3.权限问题
Jenkins构建时,出现如下报错:
解决方法:Jenkins服务配置为管理员账号运行
在服务中找到Jenkins,然后找到‘登录’,选择‘此账号’,点击浏览,输入administrator,自动会加载管理员账号,然后输入密码,点击确定。
重启一下Jenkins服务。
4.开发和测试环境配置文件不同的问题
情况一:整个文件替换
在打包时,利用maven的profiles配置,可以做到动态引用配置文件,假如当前需要在打包时,动态引用测试配置文件,具体操作如下:
a.先在系统的resources/test目录中,把测试配置文件放进去。如下图:
项目中放置两份配置文件,pom.xml中添加如下配置:
<!--Jenkins打测试war包时使用测试的配置文件-->
<profiles>
<profile>
<id>test</id>
<build>
<resources>
<resource>
<directory>resources/test</directory>
<filtering>true</filtering> <!-- 关键配置 -->
<includes>
<include>properties.config</include>
<include>log4j2.xml</include>
<include>quartz_jobs.xml</include>
</includes>
</resource>
</resources>
</build>
</profile>
</profiles>
Jenkins的任务配置中,在执行打包命令时,激活上面ID为test的配置,如下图:
-Ptest 表示激活pom.xml中ID=test的配置。
情况二:文件中局部内容替换
如果只是想在打包时,替换文件中的部分内容,比如数据库链接。
在pom.xml文件中引入专门替换字符串的打包插件replacer,完整配置如下:
<!-- jenkins 在maven打包时 动态替换数据库连接 --> <plugin><groupId>com.google.code.maven-replacer-plugin</groupId><artifactId>replacer</artifactId><version>1.5.0</version><executions><execution><phase>prepare-package</phase><goals><goal>replace</goal></goals></execution></executions><configuration><file>resources/data.config</file><replacements><replacement><token>aaa</token><value>bbb</value></replacement></replacements></configuration> </plugin>
上面的这段配置,表示将resources/data.config文件中的字符串aaa,在打包时,替换为字符串bbb。
通过以上两种方式,可以做到动态替换不同环境的配置。
5.pom.xml文件示例
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>groupId</groupId><artifactId>MBXM</artifactId><version>1.2-RELEASE</version><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><skipTests>true</skipTests><tomcat.version>8.5.75</tomcat.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><log4j2.version>2.17.1</log4j2.version></properties><dependencies><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>3.0.0</version></dependency><!--本地包--><dependency><groupId>com.sheca</groupId><artifactId>pdf</artifactId><version>1.6</version><scope>system</scope><systemPath>${project.basedir}/web/WEB-INF/lib/aspose.pdf-17.3.0.jar</systemPath></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>${java.version}</source><target>${java.version}</target><fork>true</fork><executable>C:\Program Files\Java\jdk1.8.0_191\bin\javac</executable> <!-- 指定JDK路径--></configuration></plugin><!-- war包的信息--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.1</version><configuration><warName>ZJZF</warName><webXml>web/WEB-INF/web.xml</webXml><!--<packagingExcludes>web/WEB-INF/web.xml,WEB-INF/lib/javax.servlet-api-3.1.0.jar</packagingExcludes>--><warSourceDirectory>web</warSourceDirectory></configuration></plugin><!-- jenkins 在maven打包时 动态替换数据库连接 --><plugin><groupId>com.google.code.maven-replacer-plugin</groupId><artifactId>replacer</artifactId><version>1.5.0</version><executions><execution><phase>prepare-package</phase><goals><goal>replace</goal></goals></execution></executions><configuration><file>resources/Inter.HTTPHandler.Core.URLMapSetting.config</file><replacements><replacement><token>Data Source=jdbc:oracle:thin:@123/orcl;User ID=a;Password=a;</token><value>Data Source=jdbc:oracle:thin:@456/orcl;User ID=b;Password=b;</value></replacement></replacements></configuration></plugin></plugins><sourceDirectory>src</sourceDirectory><resources><resource><directory>resources</directory><filtering>false</filtering><excludes><exclude>test/**</exclude> <!-- 排除测试配置 --></excludes></resource></resources><testResources><testResource><directory>src/Test</directory></testResource></testResources></build><!--Jenkins打测试war包时使用测试的配置文件--><profiles><profile><id>test</id><build><resources><resource><directory>resources/test</directory><filtering>true</filtering> <!-- 关键配置 --><includes><include>properties.config</include><include>log4j2.xml</include><include>quartz_jobs.xml</include></includes></resource></resources></build></profile></profiles></project>
项目整体文件解构,如下图:
相关文章:

Windows系统Jenkins企业级实战
目标 在Windows操作系统上使用Jenkins完成代码的自动拉取、编译、打包、发布工作。 实施 1.安装Java开发工具包(JDK) Jenkins是基于Java的应用程序,因此需要先安装JDK。可以从Oracle官网或OpenJDK下载适合的JDK版本。推荐java17版本&#x…...

C# 方法(ref局部变量和ref返回)
>本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 ref局部变量和ref返回 …...
C# 引用类型作为值参数与引用参数的区别
在编程中,我们常常需要处理引用类型对象,而将引用类型对象作为参数传递给方法时,有值参数和引用参数这两种方式,它们在方法内部操作时会产生不同的结果。下面就来详细分析这两种情况。 引用类型对象作为值参数传递 当我们把引用…...

滑动窗口,438找出字符串中所有字母的异位词
1.题目 2.解析 这道题我们用滑动窗口来实现,加上哈希表和vector容器的使用来实现这道题目,每次滑动之后我们都对其和答案进行比较,如果全部相等我们返回left,不相等继续滑动即可。 本质就是我们把p中相同数量的字母框起来&#…...

「国产嵌入式仿真平台:高精度虚实融合如何终结Proteus时代?」——从教学实验到低空经济,揭秘新一代AI赋能的产业级教学工具
引言:从Proteus到国产平台的范式革新 在高校嵌入式实验教学中,仿真工具的选择直接影响学生的工程能力培养与创新思维发展。长期以来,Proteus作为经典工具占据主导地位,但其设计理念已难以满足现代复杂系统教学与国产化技术需求。…...

《Python星球日记》 第52天:反向传播与优化器
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、引言二、反向传播算法原理简述1. 什么是反向传播?2. 从数学角度…...

Java常用类概述
Java常用类概述 一、字符串三剑客1. String(不可变字符串)2. StringBuilder(可变,线程不安全)3. StringBuffer(可变,线程安全) 二、日期时间类(重点掌握新版APIÿ…...
在现代Web应用中集成 PDF.js (pdfjs-dist 5.2 ESM): 通过 jsdelivr 实现动态加载与批注功能的思考
PDF 文档在现代 Web 应用中越来越常见,无论是作为文档预览、报告展示还是在线编辑的载体。Mozilla 的 PDF.js 是一个功能强大的 JavaScript 库,它使得在浏览器端渲染和显示 PDF 文件成为可能,无需依赖原生插件。 本文将深入探讨如何在你的项…...

C++STL——priority_queue
优先队列 前言优先队列仿函数头文件 前言 本篇主要讲解优先队列及其底层实现。 优先队列 优先队列的本质就是个堆,其与queue一样,都是容器适配器,不过优先队列是默认为vector实现的。priority_queue的接口优先队列默认为大根堆。 仿函数 …...
没有 Mac,如何把 iOS App 成功上架?
开发者的 iOS 上架折腾记:没有 Mac,也能搞定? 最近在帮朋友把一个跨平台 Flutter 项目上架到 App Store,结果被 iOS 上架的那套流程卡得头都大了。其实这也不是第一次碰壁了——每次到“申请证书 打包 上传”的时候,…...
C++ Vector深度易错点指南(临时抱佛脚)(基础用法;进阶;高级;实战)
Vector 1. Vector 基础概念1.1 内存结构1.2 初始化方法2.1 访问方式对比2.2 遍历流程3.1 扩容流程3.2 迭代器失效3.2.1 插入操作导致迭代器失效3.2.2 删除操作导致迭代器失效3.2.3 避免迭代器失效的建议4.1 排序与去重排序去重性能分析4.2 查找与条件删除查找条件删除性能分析5…...

深入解析WPF中的3D图形编程:材质与光照
引言 在Windows Presentation Foundation (WPF) 中创建三维(3D)图形是一项既有趣又具有挑战性的任务。为了帮助开发者更好地理解如何使用WPF进行3D图形的渲染,本文将深入探讨GeometryModel3D类及其相关的材质和光源设置。 1、GeometryModel3D类简介 GeometryMode…...

SolidWork-2023 鼠標工程
地址 https://github.com/MartinxMax/SW2023-Project/tree/main/mouse 鼠標...

vscode预览模式(点击文件时默认覆盖当前标签,标签名称显示为斜体,可通过双击该标签取消)覆盖标签、新窗打开
文章目录 VS Code 预览模式如何取消预览模式(即“固定”标签页)?预览模式有什么用? VS Code 预览模式 在 VS Code 中,当你单击文件浏览器(例如,资源管理器侧边栏)中的某个文件时&am…...

记录踩过的坑-金蝶云苍穹平台-轻分析和轻报表(慢慢更新)
未发现AppIdName(qing rpt)服务或访问服务网络异常 前提是有许可和权限。 去console(云基础平台控制台),点击服务管理,编辑mservice-更新升级-环境变量,在appIds里增加qing_rpt 查看数据库 如果是采用公共数据源连接…...

每日一题洛谷T534125 合数c++
字符串输入,看所有位数加起来的数是不是3的倍数 是,直接输出,不是,删除1或2 特判全是1和全是2的情况 直接检测末尾数字可以特判2 特判1时,还要特判11和111,其他数字,k是奇数时是质数&#x…...

数据链共享:从印巴空战到工业控制的跨越性应用
摘要 本文通过对印巴空战中数据链共享发挥关键作用的分析,引出数据链共享在工业控制领域同样具有重大价值的观点。深入阐述 DIOS 工业控制操作系统作为工业数据链共享基础技术的特点、架构及应用优势,对比空战场景与工业控制场景下数据链共享的相…...
Go多服务项目结构优化:为何每个服务单独设置internal目录?
文章目录 Go多服务项目结构优化:为何每个服务单独设置internal目录?背景什么是 Go 的 internal 机制?传统根 internal 目录的局限为什么要每个服务单独设置 internal ?推荐结构示例 总结 Go多服务项目结构优化:为何每个…...

图解gpt之Seq2Seq架构与序列到序列模型
今天深入探讨如何构建更强大的序列到序列模型,特别是Seq2Seq架构。序列到序列模型,顾名思义,它的核心任务就是将一个序列映射到另一个序列。这个序列可以是文本,也可以是其他符号序列。最早,人们尝试用一个单一的RNN来…...

Linux--JsonCpp
1.JsonCpp 简介 JsonCpp 是一个用于 C 的 JSON 解析和生成库,支持 JSON 数据的读写、解析和序列化。它提供了简单的 API 来操作 JSON 对象、数组、字符串、数字等类型,是 C 开发中处理 JSON 数据的常用工具。 核心功能与类 JsonCpp 主要包含以下核心类…...
程序代码篇---Python视频流
文章目录 前言一、OpenCV 视频流处理1. 视频捕获基础2. 视频流属性设置与获取3. 视频写入 二、高级视频流操作1. 多摄像头处理2. 视频流帧处理3. 视频流分析与统计 三、其他视频处理库1. PyAV (FFmpeg 的 Python 绑定)2. imageio 四、视频流处理优化技巧1. 多线程视频处理2. 视…...

如何利用 QuickAPI 生成 PostgreSQL 样本测试数据:全面解析与实用指南
目录 一、什么是 QuickAPI? 二、为什么需要生成样本测试数据? 三、如何在 QuickAPI 中生成 PostgreSQL 样本测试数据? 1. 登录 QuickAPI 平台 2. 选择 PostgreSQL 数据库和目标表 3. 配置样本数据生成规则 4. 导出或直接插入数据 四、…...

DeepSeek API接口调用示例(开发语言C#,替换其中key值为自己的key值即可)
示例: DeepSeek官方接口说明文档:对话补全 | DeepSeek API Docs 官网暂未提供C#代码实现:(以下为根据CURL接口C#代码调用) using System; using System.Collections.Generic; using System.Linq; using System.Text; …...

远程调试---在电脑上devtools调试运行在手机上的应用
1、启动项目–以vite项目为例:先ipconfig查看ip地址 ,然后在vite中配置host为ip地址 2、手机上查看项目:保证手机和电脑在同一局域网, 在手机浏览器打开我们vite启动的项目地址, 3、使用chii进行远程调试 (1) 安装 npm install chii -g (2)启动 chii start -p 8080 (3)在…...

[git]如何关联本地分支和远程分支
主题 本文总结如何关联git本地分支和远程分支的相关知识点。 详情 查看本地分支 git branch 查看远程分支 git branch -r 查看所有分支(本地远程) git branch -a 查看本地分支及其关联的远程分支(如有) git branch -vv 关联本地分支到远程分支: git branch …...
集群/微服务/分布式
目录 介绍 集群 微服务 优点 缺点 如何管理和监控微服务架构中的多个微服务? 服务治理 配置管理 监控与告警 容器化与编排 安全管理 分布式 三者关系 分布式和集群的区别是什么? 概念 工作方式 节点角色 应用场景 故障处理 微服务 微…...
红黑树删除的实现与四种情况的证明
🧭 学习重点 删除节点的三种情况红黑树如何恢复性质四种修复情况完整可运行的 C 实现 一、红黑树删除的基础理解 红黑树删除比插入复杂得多,因为: 删除的是黑节点可能会破坏“从根到叶子黑节点数相等”的性质。删除红节点无需修复…...
【Spring AI 实战】基于 Docker Model Runner 构建本地化 AI 聊天服务:从配置到函数调用全解析
【Spring AI 实战】基于 Docker Model Runner 构建本地化 AI 聊天服务:从配置到函数调用全解析 前沿:本地化 AI 推理的新范式 随着大语言模型(LLM)应用的普及,本地化部署与灵活扩展成为企业级 AI 开发的核心需求。Do…...
前台--Android开发
在 Android 开发中,“前台(Foreground)” 是一个非常重要的概念,它用于描述当前用户正在与之交互的组件或应用状态。理解“前台”的含义有助于更好地管理资源、生命周期和用户体验。 ✅ 一、什么是前台? 简单定义&…...

跨境电商生死局:动态IP如何重塑数据生态与运营效率
凌晨三点的深圳跨境电商产业园,某品牌独立站运营总监李明(化名)正盯着突然中断的广告投放系统。后台日志显示,过去24小时内遭遇了17次IP封禁,直接导致黑五促销期间损失23%的预期流量。这并非个案——2023年跨境电商行业…...