当前位置: 首页 > backend >正文

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>

项目整体文件解构,如下图:

http://www.xdnf.cn/news/5196.html

相关文章:

  • Redis经典面试题
  • 数据库实验10
  • 【经验总结】Ubuntu 22.04.5 LTS 将内核从5.15.0-140 升级到6.8.0-60后纽曼无线网卡无法使用解决措施
  • C++ 命令模式详解
  • R 语言科研绘图 --- 桑基图-汇总
  • Python网络爬虫:从入门到实践
  • uniapp-商城-51-后台 商家信息(logo处理)
  • 33号远征队 - SDKDump
  • Spring 必会之微服务篇(2)
  • 前端进化论·JavaScript 篇 · 数据类型
  • [学习]RTKLib详解:sbas.c与rtcm.c
  • Linux 阻塞和非阻塞 I/O 简明指南
  • [架构之美]linux常见故障问题解决方案(十九)
  • 数据结构与算法分析实验11 实现顺序查找表
  • vue注册用户使用v-model实现数据双向绑定
  • 202536 | KafKa生产者分区写入策略+消费者分区分配策略
  • 0.环境初始化
  • 基于Spring Boot + Vue的高校心理教育辅导系统
  • uniapp小程序中实现无缝衔接滚动效果
  • Mysql中in和exists的区别?
  • 神经网络极简入门技术分享
  • JavaScript基础-三元表达式
  • Nakama:让游戏与应用更具互动性和即时性
  • 用Python绘制动态彩色ASCII爱心:技术深度与创意结合
  • Ajax基础
  • ui组件二次封装(vue)
  • PyTorch API 7 - TorchScript、hub、矩阵、打包、profile
  • 互联网大厂Java求职面试:基于RAG的智能问答系统设计与实现-2
  • 如何删除网上下载的资源后面的文字
  • AI生成视频推荐