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.pswp.cn/web/79760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79760.shtml
英文地址,請注明出處:http://en.pswp.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;返回命令模…