Jenkins構建maven任務、allure測試報告等
Jenkins部署
一、 安裝啟動Jenkins
安裝jenkins需要jdk1.8環境
- 下載
方式1:離線war包
官網下載 https://www.jenkins.io/download/
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/2.274/jenkins.war
或wget https://updates.jenkins.io/download/war/2.274/jenkins.war
方式2:yum安裝(失敗)
yum -y install jenkins 報錯No Presto metadata available for jenkins
- 啟動
以linux平臺啟動離線jenkins.war為例
方式1:jar命令啟動
nohup java -jar /home/jenkins.war --httpPort=8080 > output 2>&1 &
output為輸出日誌
方式2:tomcat啟動
參考https://www.cnblogs.com/devtesters/p/4285967.html
- 登入
瀏覽器登入jenkins, http://ip:8080
jenkins相關檔案在/root/.jenkins
- 更換外掛源(可跳過)
sed -i 's#http://updates.jenkins-ci.org/download#https://mirrors.tuna.tsinghua.edu.cn/jenkins#g' /root/.jenkins /updates/default.json
sed -i 's#http://www.google.com#https://www.baidu.com#g' /root/.jenkins /updates/default.json
重啟jenkins生效
- 解鎖jenkins
瀏覽器登入jenkins, http://ip:8080
根據頁面提示解鎖jenkins
安裝推薦的外掛
等待安裝完成(某些外掛安裝失敗也沒關係)
建立管理員使用者並儲存
儲存jenkins url
開始使用jenkins!
注意:
如果登入管理員賬號提示密碼錯誤,可嘗試使用解鎖密碼/root/.jenkins/secrets/initialAdminPassword
二、
- 下載外掛
Manage Jenkins>Manage Plugins>可選外掛,下載Subversion
- 建立svn憑證
Manage Jenkins>Mange Credentials,此處需要svn賬號密碼
- 建立item
新建item,建立一個Freestyle project
- item配置
Discard old builds
如需要指定svn版本,則需給定引數
原始碼管理,需要svn地址、之前建立的svn憑證
構建觸發器、構建環境、構建、構建後操作內容
儲存
- 構建,拉取程式碼
檢視構建情況
構建成功,拉取的程式碼在jenkins的workspace下
三、 maven本地倉庫
下載apache-maven到/home/develop/apache-maven-3.6.3,配置settings.xml檔案,注意本地倉庫位置(自定義)
將目標maven下pom.xml放到伺服器上,同級目錄下執行
mvn install -X
拉取maven倉庫到本地倉庫。
四、 構建maven專案,打war包
需要maven環境,此處構建使用如下maven專案配置
- 下載外掛
Manage Jenkins>Manage Plugins>可選外掛,下載Maven、Config File Provider
- Maven配置
Manage Jenkins>Global Tool Configuration,此處的settings.xml是構建maven專案要用到的(開發提供)
注意:settings.xml中可定義倉庫地址
Global Tool Configuration中,還需要配置jdk、maven地址
- 新建config file
該檔案可替換svn內的配置檔案並編譯到war包中。
選擇Manage Jenkins>Managed files,新增配置檔案
- 建立item
新建item,建立一個Maven專案
- item配置
General配置:Discard old builds
原始碼管理
構建觸發器
構建環境,加入配置檔案
Add timestamps to the Console Output
構建前步驟
構建,Root POM注意pom.xml位置
Goals and options中填寫clean install -X,可檢視詳細日誌(-X)
儲存
- 構建,打war包
Build Now,檢視控制檯輸出
可以看到BUILD SUCCESS及相應構建內容
打war包成功,在item的target目錄中EMS_Finein/target/EMS_Finein.war
Q&A
- 報錯Could not find artifact xxx
如:
Failed to transfer Could not find artifact com.persagy:EMS_Finein_Parent:pom:1.0.0 in nexus (http://192.168.101.18:8081/repository/maven-public/)
ERROR: Failed to parse POMs
org.apache.maven.project.ProjectBuildingException: Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM for com.persagy:EMS_Finein:[unknown-version]: Could not find artifact com.persagy:EMS_Finein_Parent:pom:1.0.0 in nexus (http://192.168.101.18:8081/repository/maven-public/) and 'parent.relativePath' points at wrong local POM @ line 6, column 10
原因:EMS_Finein_parent下pom.xml中<artifactId>EMS_Finein_Parent</artifactId>首字母大寫,而資料夾名稱EMS_Finein_parent未大寫,導致找不到正確的jar包
如:
[ERROR] Failed to execute goal on project EMS_Finein_Communication: Could not resolve dependencies for project com.persagy:EMS_Finein_Communication:jar:1.0.0: Could not find artifact com.persagy:ems_Data:jar:1.0.0 in nexus (http://192.168.101.18:8081/repository/maven-public/) -> [Help 1]
Caused by: org.apache.maven.project.DependencyResolutionException: Could not resolve dependencies for project com.persagy:EMS_Finein_Communication:jar:1.0.0: Could not find artifact com.persagy:ems_Data:jar:1.0.0 in nexus (http://192.168.101.18:8081/repository/maven-public/)
原因:EMS_Finein_Communication下pom.xml中ems_Data與伺服器上http://192.168.101.18:8081/#browse/browse:maven-public的com.persagy.ems_data大小寫不一致,導致找不到正確的jar包
解決方案:讓開發更新svn,注意jar包名字
- tomcat啟動成功,但war包無法執行
- ERROR: No such settings file /root/.jenkins/workspace/DM/ /home/develop/apache-maven-3.6.3/conf/settings.xml exists
原環境jdk 1.7,maven 3.6.1
現環境 jdk1.8,maven3.6.3
原因:EMS_Finein.war中缺少web.xml檔案
解決方案:參考https://www.jianshu.com/p/de0177cac90a,讓開發修改pom.xml,或者使用jenkins的post steps強行把web.xml放進tomcat的webapps/EMS_Finein/WEB-INF中
檢視item配置-build-高階下面的maven settings file配置路徑
五、 部署war到tomcat容器(熱部署)
- 部署tomcat容器
下載tomcat並部署,注意保留tomcat下webapps/manager資料夾
修改tomcat下conf/tomcat-users.xml檔案(約第44行),新增tomcat user內容:
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="manager-script"/>
<user username="manager" password="manager" roles="manager-gui,manager-script"/>
修改tomcat下conf/server.xml,配置容器埠為8888
修改webapps/manager/META-INF/context.xml,設定(約第22行)allow="^.*$",即允許所有ip訪問
開啟tomcat,sh bin/ startup.sh
- 建立憑證
Manage Jenkins>Mange Credentials,此處需要填入上一步中tomcat user賬號密碼。
- 下載外掛
Manage Jenkins>Manage Plugins>可選外掛,下載Deploy to container
- 建立item及配置
參考第三章的item配置,部署到容器需要新增構建後操作
Tomcat URL填寫tomcat所在地址(如圖地址為jenkins本地ip)
- 構建,打war包並部署到tomcat中
Build Now,檢視控制檯輸出
檢視tomcat中webapps情況,可以看到war包和Context path均正確
Q&A
l 報錯No wars found
ERROR: Step ‘Deploy war/ear to a container’ aborted due to exception:
java.lang.InterruptedException: [DeployPublisher][WARN] No wars found. Deploy aborted. %n
參考https://blog.csdn.net/qq_39826207/article/details/108629850,
解決方案:確保svn程式碼中pom.xml有打war包
修改Jenkins部署WAR/EAR files引數為**/*.war
l 報錯java.io.FileNotFoundException: http://192.168.101.8:8888/manager/text/list
ERROR: Build step failed with exception
org.codehaus.cargo.container.ContainerException: Failed to redeploy [/root/.jenkins/workspace/EMS_Finein/EMS_Finein/target/EMS_Finein.war]
Caused by: java.io.FileNotFoundException: http://192.168.101.8:8888/manager/text/list
參考https://blog.csdn.net/qq_39826207/article/details/108635573
解決方案:修改tomcat下conf/tomcat-users.xml檔案,確保正確建立user
保留tomcat下webapps/manager資料夾
l 報錯The username you provided is not allowed to use the text-based Tomcat Manager
org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: The username you provided is not allowed to use the text-based Tomcat Manager (error 403)
參考https://blog.csdn.net/qq574280801/article/details/88667602
解決方案: 修改tomcat下conf/tomcat-users.xml檔案,確保正確建立user
確保憑證tomcat user的賬號密碼正確
修改webapps/manager/META-INF/context.xml,設定allow="^.*$"
l 報錯java.net.ConnectException: 拒絕連線 (Connection refused)
ERROR: Build step failed with exception
org.codehaus.cargo.container.ContainerException: Failed to redeploy [/root/.jenkins/workspace/EMS_Finein/EMS_Finein/target/EMS_Finein.war]
Caused by: java.net.ConnectException: 拒絕連線 (Connection refused)
解決方案:開啟tomcat
六、 ssh部署檔案到指定位置(推薦)
- 下載外掛
Manage Jenkins>Manage Plugins>可選外掛,下載Publish Over SSH
- 建立ssh server
Manage Jenkins>Configure System>Publish over SSH,新增SSH Server並填寫相關資訊,注意在SSH Server的高階中去掉“Disable exec”勾選
- 建立item(Finein_Sqlite)及配置
參考第三章的item配置(此處選擇freestyle專案),建立Finein_Sqlite,部署到指定位置需要新增構建操作。
- 建立item(EMS_Finein)及配置
參考第三章的item配置,部署到指定位置需要新增post steps
部署war到tomcat_Finein所在路徑並重啟Finein(此處不需要構建後操作部署war到tomcat 容器)
- 建立item(Web_Finein)及配置
參考第三章的item配置(此處選擇freestyle專案),建立Web_Finein,部署到指定位置需要新增構建操作。
部署Web_Finein到/home/develop/web所在路徑並重啟Web_Finein
- 構建,傳輸檔案
先後構建Finein_Sqlite、EMS_Finien、Web_Finein,檢視構建日誌(以EMS_Finein為例)
在遠端伺服器上確認部署是否成功。
七、 Q&A
- jenkins傳輸檔案卻不執行命令
原因:建立publish over ssh的ssh server時,未給予執行許可權
解決方案:Manage Jenkins>Configure System>Publish over SSH,在SSH Server的高階中去掉“Disable exec”勾選
解決方案:在Manage Jenkins>Configure System>Publish over SSH的SSH Server,高階資訊中去掉Disable exec勾選
- publish over ssh只傳輸檔案,不傳資料夾
解決方案:在item配置中,修改ssh傳輸的Source files引數為Web_Finein/**
- 構建出現UNSTABLE,需檢視日誌具體分析
ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]
Build step 'Send build artifacts over SSH' changed build result to UNSTABLE
原因:參考https://blog.csdn.net/wangfei0904306/article/details/72780617
檢視日誌發現ssh沒有傳輸檔案,直接執行命令
Source files引數有誤,不能用./ 開頭表示相對路徑
Remote directory可以用./ 開頭表示相對路徑
解決方案:在item配置中,修改ssh傳輸的Source files引數為Web_Finein/**
- 構建出現UNSTABLE,需檢視日誌具體分析
SSH: EXEC: STDOUT/STDERR from command [ll /home/develop/file/EMS_Finein] ...
SSH: EXEC: connected
bash: ll: command not found
可以看出jenkins遠端ssh部署不支援命令 ll(ls -l的alias命令)
還有可能是ssh執行的命令不成功,注意命令正確即可
- 關於前端包的編譯
- 報錯 ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,000 ms]
參考https://blog.csdn.net/fen_fen/article/details/114844160
- Caused by: org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: The Tomcat Manager responded "失敗 - 在上下文[/DM]下部署應用程式,但是上下文啟動失敗
原因:war包部署後,啟動失敗(war包更新了,專案配置檔案沒更新,tomcat啟動報錯)