目标
在Windows操作系统上使用Jenkins完成代码的自动拉取、编译、打包、发布工作。
实施
1.安装Java开发工具包(JDK)
Jenkins是基于Java的应用程序,因此需要先安装JDK。可以从Oracle官网或OpenJDK下载适合的JDK版本。推荐java17版本,因为Jenkins依赖高版本的jdk。
安装包下载地址:
2.下载并安装Jenkins
访问Jenkins官方网站,下载最新的Windows安装包。运行安装程序,按照提示完成安装。
安装包下载地址:
安装教程(文章内容比较多,看安装部分的内容):
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>
项目整体文件解构,如下图:
