目標
在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>
項目整體文件解構,如下圖:
?