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用户名和密码 

排序规则选择

配置代码来源 

 配置打包命令

clean package -Dmaven.test.skip=true -Ptest

test 所在位置如下图所示,用来在打包时动态替换配置文件的,比如测试环境需要测试的配置文件,开发环境需要开发的配置文件,那么在发布测试版本时,就用如下的配置方式来激活测试配置文件。 在文章末尾,有完整的pom文件内容,供参考。

maven打包完成后,把war包放到Tomcat对应的webapps目录中,完成项目部署,这个步骤用脚本实现。

编写脚本,完成部署

脚本的内容根据实际需要进行编写,需要做什么操作,就写对应操作的shell脚本。

以上配置完成,进行项目构建。

6.构建项目

找到前面已经创建的任务,点击参数化构建

此时就可以看到所有的branch版本,选择需要的版本,然后点击构建。 

剩下的就是等着就可以了,等待构建完毕,整个部署动作就完成了。

点击对应的构建编号,可以看具体执行过程。

当看到success,表示构建完成。 

通过以上步骤,可以在Windows平台上成功搭建并配置Jenkins,实现自动化构建和部署。

7.特殊情况处理

我要处理的这个项目情况是一个PC端程序,一个移动端程序。一共两个war包,这两个war包需要部署在同一个Tomcat的webapps目录下面。

首先我创建了两个Jenkins工程,一个用来生成PC端程序的war包,一个用来生成移动端程序的war包。

war包生成好之后,不会直接更新到Tomcat的webapps目录中,因为无法得知这两个程序的war包哪个优先生成好。所以把war包推送到Tomcat的webapps目录的操作,单独拎出来,新建了一个工程。

这个工程就是用来把前面两个工程生成的war包,以热部署的方式,推送到Tomcat的webapps目录中,完成版本发布的操作。

这个工程的具体配置方式如下:

7.1新建pipline工程

7.2配置流水线脚本

这个工程,只是为了完成war包的部署,所以只需要配置pipline脚本即可。

脚本中的内容,是用流水线语法生成的,具体操作如下:

点击‘流水线语法’

选择deploy这个,如果没有这个选项,在Jenkins中安装插件:Deploy to container

下面是需要填写的内容

点击生成流水线脚本,将流水线脚本拷贝到pipline的配置页面上。

点击 应用、保存。这个工程就创建好了。

7.3Tomcat用户配置说明

Tomcat用户需要在Tomcat的conf目录中,调整tomcat-users.xml文件。

tomcat-users.xml内容如下,可以做个参考:

<?xml version="1.0" encoding="UTF-8"?>

<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">

<role rolename="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="tomcat" password="s3cret" roles="manager-gui,manager-script,manager-jmx,manager-status"/>
<user username="admin" password="123456" roles="manager-gui,manager-script"/>
</tomcat-users>

这里创建了两个Tomcat用户:tomcat、admin,根据需要创建即可。

7.4Tomcat管理页面

以上方式创建的工程,需要确保Tomcat的webapps目录中,有manage文件夹,这个文件夹是在下载Tomcat时自带的,用来显示Tomcat的管理页面。

通过ip:端口//manager/html 进行访问

如果能看到这个页面,说明配置没有问题,如果看不到这个页面。则需要修改webapps\manager\META-INF路径下面context.xml文件。

把配置项中的Valve整个去掉。

参考文章:

Jenkins的Deploy war/ear to a container插件发布项目到tomcat容器-阿里云开发者社区

8.整体操作说明

到目前为止,已经完成了两个项目的war包构建和Tomcat部署。

在Jenkins中现在就有个三个工程。

如果要完成PC和移动端两个项目的发布,分别对PC和移动端的工程进行构建。

等两个工程构建完毕,再构建Tomcat部署工程。

最终就完成了将PC项目和移动端项目,发布到Tomcat容器中。

问题及其处理方案:

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服务。

如果上面的操作还是不管用,尝试在执行批处理脚本之前,提升批处理脚本执行的权限,在执行脚本之前,先执行这样的一段命令:

%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

以pipline工程为例,在配置中添加如下配置:

stage('Elevate Privileges') {
            steps {
                script {
                    bat '%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit'
                }
            }
        }

另外,检查下服务器上是否有杀毒软件之类的软件,可能会阻止相关操作。

参考文章:

windows系统中jenkins构建报错提示“拒绝访问”_jenkins执行命令拒绝访问-CSDN博客

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.mzph.cn/web/79760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 异常捕获 try 和 __try的区别笔记

最近碰到了try 和 __try的区别的问题&#xff0c;经过实测与验证&#xff0c;发现在vs2019下&#xff0c;确实存在try无法捕获特定异常的问题&#xff0c;比如下面的代码&#xff1a; //以空格作为分割符的符号个数 //内存复制功能 // test1.cpp : 定义控制台应用程序的入口点…

Spark基础介绍

1. Spark 核心概念 1.1 RDD&#xff08;弹性分布式数据集&#xff09; 定义&#xff1a;RDD&#xff08;Resilient Distributed Dataset&#xff09;是 Spark 的核心抽象&#xff0c;是不可变、可分区、容错的分布式数据集合。特性&#xff1a; 弹性&#xff1a;自动进行内存…

采用SqlSugarClient创建数据库实例引发的异步调用问题

基于SqlSugar编写的多个WebApi接口&#xff0c;项目初始化时采用单例模式注册SqlSugarClient实例对象&#xff0c;前端页面采用layui布局&#xff0c;并在一个按钮事件中通过Ajax连续调用多个WebApi接口获取数据。实际运行时点击按钮会随机报下面几种错误&#xff1a; Execute…

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取当前用户主目录(即:~波浪符号目录)?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…

pdf url 转 图片

背景&#xff1a;vue2.0需要把pdf转成图片&#xff0c;显示在url里面&#xff0c;使用pdfjs-dist来解决 步骤&#xff1a; 1、安装依赖包(我的项目是node12&#xff0c;安装太高版本会报错) npm i pdfjs-dist2.16.105 2、vue代码 <template><div class"main…

理解 Open vSwitch (OVS)

Open vSwitch&#xff08;简称 OVS&#xff09;是一个开源的 虚拟交换机&#xff0c;主要用于 虚拟化环境&#xff08;如 KVM、Xen、Docker&#xff09;和 软件定义网络&#xff08;SDN&#xff09;。它类似于物理交换机&#xff0c;但在软件层面实现&#xff0c;可以灵活地管理…

S7-1500——零基础入门1、工业编程基本概念

工业编程基本概念 一,数制与基本数据类型二,数字量信号三,模拟量信号一,数制与基本数据类型 本节主要内容 类别内容主题数制与基本数据类型数制讲解十进制、十六进制、二进制及其进位规则;基数、位权概念数据类型介绍PLC 使用的数据类型:未序列数据类型(bit、byte、wor…

kotlin-协程(什么是一个协程)

1.什么指一个协程对于线程来说一个thread就是就是指一个线程&#xff0c;thread为什么成为线程呢&#xff1f;因为他实现了对线程的一个抽象管理&#xff0c;可以管理这个线程&#xff0c;启动&#xff0c;可以查看各种信息 那么协程呢&#xff1f; public fun CoroutineScop…

七、深入 Hive DDL:管理表、分区与洞察元数据

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月13日 专栏&#xff1a;Hive教程 内容导航 一、表的 DDL 操作 (非创建)二、分区的 DDL 操作三、洞察元数据&#xff1a;SHOW 命令的威力结语&#xff1a;DDL 与 SHOW&#xff0c;Hive 管理的双翼练习题一、选择题二、代码题…

【 Redis | 实战篇 短信登录 】

前言&#xff1a; 主要完成了基于Session实现登录&#xff0c;解决集群的Session共享问题&#xff0c;从而实现了基于Redis来实现共享Session登录 1.基于Session实现登录 1.1.发送短信验证码 步骤&#xff1a; 前端提交手机号 》校验手机号 》不符合返回错误信息&#xff0…

蓝桥杯14届国赛 合并数列

问题描述 小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案&#xff0c;分别将他们列为两个数组 {a1,a2,...,an} 和 {b1,b2,...,bm}。两个数组的和相同。 定义一次合并操作可以将某数组内相邻的两个数合并为一个新数&#xff0c;新数的值是…

Doris和Clickhouse对比

目录 一、Doris和Clickhouse对比1. 底层架构**DorisClickHouse** 2. 运行原理DorisClickHouse 3. 使用场景DorisClickHouse 4. 优缺点对比总结 二、MPP架构和Shared-Nothing 架构对比1. 什么是 MPP 架构&#xff1f;定义特点典型代表 2. 什么是 Shared-Nothing 架构&#xff1f…

niushop单商户V5多门店版V5.5.0全插件+商品称重、商家手机端+搭建环境教程

一.系统介绍 【全开源】niushop单商户V5多门店版V5.5.0版本&#xff0c;我看很多人都想要 商品称重、商家手机端等插件这套是全插件版本&#xff0c;整合起来本博主也花了不少啦~ Niushop系统是应用thinkphp6开发的完善的电商系统&#xff0c;拥有完善的商品机制&#xff0c;…

内存、磁盘、CPU区别,Hadoop/Spark与哪个联系密切

1. 内存、磁盘、CPU的区别和作用 1.1 内存&#xff08;Memory&#xff09; 作用&#xff1a; 内存是计算机的短期存储器&#xff0c;用于存储正在运行的程序和数据。它的访问速度非常快&#xff0c;比磁盘快几个数量级。在分布式计算中&#xff0c;内存用于缓存中间结果、存储…

Jenkins linux安装

jenkins启动 service jenkins start 重启 service jenkins restart 停止 service jenkins stop jenkins安装 命令切换到自己的下载目录 直接用命令下载 wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.190.3-1.1.noarch.rpm 下载直接安装 rpm -ivh jenkins-2.190.3-…

RabbitMQ ②-工作模式

RabbitMQ 工作模式 官方提供了七种工作模式 Simple&#xff08;简单模式&#xff09; P&#xff1a;生产者&#xff0c;发布消息到队列C&#xff1a;消费者&#xff0c;从队列中获取消息并消费Queue&#xff1a;消息队列&#xff0c;存储消息。 一个生产者&#xff0c;一个…

(2)python开发经验

文章目录 1 pyside6加载ui文件2 使用pyinstaller打包 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 pyside6加载ui文件 方法1&#xff1a; 直接加载ui文件 from PySide6.QtWidgets import QAp…

【C++】互斥锁(Mutex)

在C中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是用于线程同步的重要工具&#xff0c;用于保护共享资源&#xff0c;防止多线程同时访问导致的数据竞争&#xff08;Data Race&#xff09;问题。 以下是C中互斥锁的核心用法和示例&#xff1a; 一、基本互斥锁 std::mut…

Jsoup与HtmlUnit:两大Java爬虫工具对比解析

Jsoup&#xff1a;HTML解析利器 定位&#xff1a;专注HTML解析的轻量级库&#xff08;也就是快&#xff0c;但动态页面无法抓取&#xff09; 核心能力&#xff1a; DOM树解析与CSS选择器查询 HTML净化与格式化 支持元素遍历与属性提取 应用场景&#xff1a;静态页面数据抽…

小白成长之路-vim编辑

文章目录 Vim一、命令模式二、插入模式3.a:进入插入模式&#xff0c;在当前光标的后一个字符插入![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fd293c3832ed49e2974abfbb63eeb5bb.png)4.o: 在当前光标的下一行插入5.i:在当前光标所在字符插入&#xff0c;返回命令模…