Jenkins+git+maven+tomcat自動(dòng)打包部署全過(guò)程
Centos7系統(tǒng) -->設(shè)置好網(wǎng)絡(luò)和防火墻 網(wǎng)絡(luò)需要能訪問(wèn)外網(wǎng)
準(zhǔn)備工作
- ip 192.168.229.128
- apache-maven-3.3.9 git-2.33.0 a pache-tomcat-8.5.79(項(xiàng)目使用)
- jdk1.8.0_251(項(xiàng)目使用) jdk-17.0.4(jenkins使用) jenkins.war
關(guān)閉防火墻或者開放端口
關(guān)防火墻
setenforce 0 systemctl stop firewalld systemctl disable firewalld sed -i 's/enforcing/disabled/g' /etc/sysconfig/selinux
或者開放7070端口:
[root@SpringCloud java]# cat /etc/sysconfig/iptables # sample configuration for iptables service # you can edit this manually or use system-config-firewall # please do not ask us to add additional ports/services to this default configuration *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 7070 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
安裝JDK
安裝jenkins
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key yum install jenkins -y service jenkins start
安裝git
安裝maven
配置環(huán)境環(huán)境變量
[root@SpringCloud soft]# vi /etc/profile [root@SpringCloud soft]# source /etc/profile #maven export MAVEN_HOME=/app/apache-maven-3.3.9 export MAVEN_OPTS='-Xms512m -Xmx1024m' export PATH=$PATH:$MAVEN_OPTS:$MAVEN_HOME/bin #JAVA_HOME #export JAVA_HOME=/app/jdk-17.0.4 export JAVA_HOME=/app/jdk1.8.0_251 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export JAVA_PATH=$JAVA_HOME/bin:$JRE_HOME/bin export PATH=$JAVA_PATH:$PATH #git export PATH=$PATH:/app/git-2.33.0

查看版本

啟動(dòng)jenkins
nohup /app/jdk-17.0.4/bin/java -jar /app/jenkins.war --httpPort=8888 >/app/jenkins.log &
界面配置使用jenkins
打開http://192.168.229.128:8888/jenkins/
輸入密鑰
cat /root/.jenkins/secrets/initialAdminPassword 將密碼填入






配置Jenkins
系統(tǒng)管理--全局安全配置


系統(tǒng)管理---》插件管理
在可選插件中,maven ssh 相關(guān)插件安裝


添加Credentials憑據(jù)


系統(tǒng)管理--全局工具配置
配置maven

配置git

回主頁(yè) 新任務(wù) 創(chuàng)建maven 工程


然后保存 --立即構(gòu)建

打包過(guò)程中的問(wèn)題總結(jié)
1、springboot項(xiàng)目報(bào)錯(cuò)
SpringBoot發(fā)布WAR啟動(dòng)報(bào)錯(cuò):Error assembling WAR: webxml attribute is required
修改web model的pom.xml
<packaging>war</packaging>
SpringBoot默認(rèn)發(fā)布的都是jar,因此要修改默認(rèn)的打包方式j(luò)ar為war
修改web model的依賴(dependency)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除嵌入式tomcat插件,或者scope = provided
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>-->建議把依賴Spring-boot-starter-tomcat的scope設(shè)置為provided,原因很簡(jiǎn)單:
我們的項(xiàng)目中可能會(huì)使用Filter等Servlet的api;因此,不建議spring-boot-starter-web中移除嵌入式Spring-boot-starter-tomcat的依賴,因?yàn)檫@樣就必須再單獨(dú)添加servet-api的依賴。
2、maven打包報(bào)錯(cuò)Java heap space
- 命令符執(zhí)行 mvn install 報(bào)錯(cuò) java.lang.OutOfMemoryError: Java heap space
- 需要配置環(huán)境變量:MAVEN_OPTS = -Xms512m -Xmx1024m
- 然后在 path中加入%MAVEN_OPTS%
3、Tomcat啟動(dòng)報(bào)錯(cuò):One or more listeners failed to start
經(jīng)過(guò)排查和查詢:原來(lái)的maven是windows上跑的,現(xiàn)在是Linux上所以要將pom中的
Windows(分隔符英文分號(hào)):
${java.home}/lib/rt.jar;${java.home}/lib/jce.jarlinux (分隔符英文冒號(hào)):
${java.home}/lib/rt.jar:${java.home}/lib/jce.jar構(gòu)建后操作
然后 調(diào)整原maven項(xiàng)目的配置,增加下面配置--構(gòu)建后操作

其中的命令行如下
#!/bin/bash
source /etc/profile
JENKIN_HOME=/root/.jenkins/workspace
FROM_HOME=/app/apache-tomcat/webapps
PRD_HOME=/data/ndnwars/$(date +%Y%m%d)
PRD_SCRIPT=/app/weblogic12/script
DEV="origin/dev1"
QAS="origin/qas"
MOCK="origin/mock"
PRD="origin/master"
#new
DEV_HOME_NEW=/app/WARS/$(date +%Y%m%d)
DEV_SCRIPT_NEW=/app/script
QAS_HOME_NEW=/app/WARS/$(date +%Y%m%d)
QAS_SCRIPT_NEW=/app/script
MOCK_HOME_NEW=/app/WARS/$(date +%Y%m%d)
MOCK_SCRIPT_NEW=/app/script
PRD_HOME_NEW=/data/ndnwars/$(date +%Y%m%d)
PRD_SCRIPT_NEW=/app/script
shopt -s expand_aliases
alias rscp="rsync -P --rsh=ssh"
n=0
cd $JENKIN_HOME
./copy.sh
service tomcat restart &
cd $FROM_HOME
zip -rq $(date +%Y%m%d).zip *
if [ $GIT_BRANCH == $DEV ];then
ssh root@ndndev1 "mkdir -p $DEV_HOME_NEW" &&
until [ $n -ge 5 ]
do
rscp $(date +%Y%m%d).zip root@ndndev1:$DEV_HOME_NEW
break
n=$[$n+1]
echo "Replay again......"
done
ssh root@ndndev1 "$DEV_SCRIPT_NEW/update_all.sh"
echo "DEV update OK!"
elif [ $GIT_BRANCH == $QAS ];then
ssh root@ndnqas1 "mkdir -p $QAS_HOME_NEW" &&
until [ $n -ge 5 ]
do
rscp $(date +%Y%m%d).zip root@ndnqas1:$QAS_HOME_NEW && break
n=$[$n+1]
echo "Replay again......"
done
ssh root@ndnqas1 "$QAS_SCRIPT_NEW/update_all.sh"
echo "QAS update OK!"
elif [ $GIT_BRANCH == $MOCK ];then
ssh root@ndnmock1 "mkdir -p $MOCK_HOME_NEW" &&
until [ $n -ge 5 ]
do
rscp $(date +%Y%m%d).zip root@ndnmock1:$MOCK_HOME_NEW && break
n=$[$n+1]
echo "Replay again......"
done
ssh root@ndnmock1 "$MOCK_SCRIPT_NEW/update_all.sh"
echo "MOCK update OK!"
elif [ $GIT_BRANCH == $PRD ];then
ssh root@ndnapp2 "mkdir -p $PRD_HOME" &&
until [ $n -ge 5 ]
do
rscp $(date +%Y%m%d).zip root@ndnapp2:$PRD_HOME_NEW && break
n=$[$n+1]
echo "Replay again......"
done
ssh root@ndnapp2 "$PRD_SCRIPT_NEW/update6100.sh"
echo "PRD upload OK!"
else
echo "no server to copy,local is running! "
fi其中的copy.sh(/root/.jenkins/workspace),是把工程目錄下打包好的程序拷貝到tomcat的webapp目錄下
#!/bin/bash
source /etc/profile
#這里我們只是為了解決問(wèn)題,更深入的做法是應(yīng)該抽象出來(lái)該類問(wèn)題的共性,然后固化腳本;
#找到頭文件路徑列表
head_files=`find /root/.jenkins/workspace -name *-0.9.0-SNAPSHOT`
*****_jar=`find /root/.jenkins/workspace -name ndn-*****-0.9.0-SNAPSHOT-api.jar`
struts2_jar="/root/.jenkins/workspace/struts2-spring-plugin-2.5.33.jar"
work_dir="/root/.jenkins/workspace/ndn_test"
des_dir="/app/apache-tomcat/webapps"
rm -rf $des_dir/*
file_count=0
[ -d $des_dir ] || mkdir -p $des_dir &> /dev/null
#進(jìn)行拷貝過(guò)程
for file in $head_files
do
source_dir=${file%/*}
#判斷目標(biāo)目錄是否存在,不存在創(chuàng)建
[ -d $des_dir$source_dir ] || mkdir -p $des_dir
cp -rupv $file $des_dir
echo "$file has been copy."
((file_count++))
done
#拷貝dist
cp -r $work_dir/ndn-ui/dist $des_dir
((file_count++))
#重命名
cd $des_dir
mv i-bpm-0.9.0-SNAPSHOT bpm
mv i-core-0.9.0-SNAPSHOT icore
mv i-static-0.9.0-SNAPSHOT static
mv ndn-ireport-0.9.0-SNAPSHOT ireport
mv ndn-engine-0.9.0-SNAPSHOT engine
mv ndn-esb-0.9.0-SNAPSHOT esbmule
mv ndn-ndncode-0.9.0-SNAPSHOT ndncode
mv ndn-ndnclean-0.9.0-SNAPSHOT ndnclean
mv ndn-module-0.9.0-SNAPSHOT module
mv ndn-query-0.9.0-SNAPSHOT query
mv ndn-starter-0.9.0-SNAPSHOT starter
mv ndn-runqian-0.9.0-SNAPSHOT runqian
mv ndn-timers-0.9.0-SNAPSHOT timers
mv ndn-*****-0.9.0-SNAPSHOT *****
cp -r $*****_jar ndncode/WEB-INF/lib
#struts2-spring
rm -rf query/WEB-INF/lib/struts2-spring-plugin-2.5.30.jar
cp $struts2_jar query/WEB-INF/lib/
#加入readme.txt
cd $work_dir
#git show P202305_v1.0 > tt.txt &&
#sed -n '/Tagger/,/commit/p' tt.txt > ttt.txt &&
#sed -e '1d' -e '2d' -e '3d' -e '$d' ttt.txt > tt.txt
echo "問(wèn)題序號(hào): " > readme.txt
#cat tt.txt >> readme.txt
echo "更新文件來(lái)源:" >> readme.txt
echo "更新路徑:" >> readme.txt
echo "更新人:" >> readme.txt
echo "更新時(shí)間:$(date +%Y%m%d)" >> readme.txt
mv readme.txt $des_dir
#對(duì)拷貝結(jié)果進(jìn)行判斷
if [ $? != 0 ]; then
echo "copy files error!!!"
else
echo "copy files successfully!,total $file_count files."
fi成功展示
然后構(gòu)建 成功后就可以訪問(wèn)了

jenkins多分支構(gòu)建選擇
通常開發(fā)提交到git上的代碼會(huì)有多個(gè)分支,比如master分支、release分支等,少則1、2個(gè),多則10幾20幾個(gè);當(dāng)構(gòu)建的時(shí)候,如果不配置多分支構(gòu)建,每構(gòu)建一個(gè)新的分支,就需要修改配置,如果沒有給其他運(yùn)維人員開修改配置的權(quán)限,則需要管理員去修改配置再構(gòu)建,很麻煩;所以,這時(shí)候就用到了多分支構(gòu)建;
1、安裝 Git Parameter插件

2、配置參數(shù)化構(gòu)建過(guò)程


名稱自定義,這其實(shí)是個(gè)變量名,在選擇分支的時(shí)候要用到;參數(shù)類型選擇分支或標(biāo)簽;默認(rèn)值可以不用寫;
3、指定分支

指定分支寫上之前定義的名稱,前面加$符號(hào);($branch)

4、構(gòu)建時(shí)選擇對(duì)應(yīng)的分支

此時(shí),在構(gòu)建時(shí),就會(huì)展示該項(xiàng)目的所有分支,根據(jù)需求選擇構(gòu)建的分支即可;
優(yōu)化啟動(dòng)腳本,并加入開機(jī)自啟jenkins.sh
#!/bin/bash
###主要目的用于開機(jī)啟動(dòng)服務(wù),不然 啟動(dòng)jenkins.war包沒有java -jar的權(quán)限
JAVA_HOME=/app/jdk-17.0.4
pid=`ps -ef | grep jenkins.war | grep -v 'grep'| awk '{print $2}'| wc -l`
if [ "$1" = "start" ];then
if [ $pid -gt 0 ];then
echo 'jenkins is running...'
else
### java啟動(dòng)服務(wù) 配置java安裝根路徑,和啟動(dòng)war包存的根路徑
nohup $JAVA_HOME/bin/java -jar /app/jenkins.war --httpPort=8888 2>/app/jenkins.log &
fi
elif [ "$1" = "stop" ];then
exec ps -ef | grep jenkins | grep -v grep | awk '{print $2}'| xargs kill -9
echo 'jenkins is stop..'
else
echo "Please input like this:"./jenkins.sh start" or "./jenkins stop""
fi給權(quán)限
chmod +x jenkins.sh
腳本測(cè)試
#啟動(dòng)jenkins /app/jenkins.sh start #關(guān)閉jenkins /app/jenkins.sh stop
在/etc/rc.d/rc.local文件底部,添加內(nèi)容:
# jenkins /app/jenkins.sh start
給權(quán)限
chmod +x /etc/rc.d/rc.local
重啟計(jì)算機(jī)
reboot
構(gòu)建觸發(fā)器配置
1、需要勾選“build when a change is pushed to gitlab. GitLab CI Service URL:********”該項(xiàng)(注意:只有jenkins安裝了gitlab hook plugin插件后,才有該項(xiàng),不安裝是沒有該選項(xiàng)的)

2、在“構(gòu)建”配置如下:

至此,jenkins的配置已經(jīng)完成
接下來(lái)配置gitlab
(1)在gitlab該project界面點(diǎn)擊side bar最下面的settings圖標(biāo),如下圖

(2)然后再點(diǎn)擊側(cè)邊欄中的“web Hooks”,在“URL”一欄輸入U(xiǎn)RL:********,見下圖:

點(diǎn)擊確定
(3)點(diǎn)擊TEST HOOK按鈕,如果提示“Hook successfully executed”,說(shuō)明gitlab和jenkins關(guān)聯(lián)成功
接下來(lái)就開始驗(yàn)證了:
在本地的另一個(gè)目錄提交一個(gè)文件a.txt到gitlab并push后,回到j(luò)enkins主頁(yè),會(huì)發(fā)現(xiàn)構(gòu)建正在進(jìn)行
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 用Jenkins+Docker+Maven+Git實(shí)現(xiàn)持續(xù)集成(超詳細(xì))
- Docker+Jenkins+Gitee自動(dòng)化部署maven項(xiàng)目的實(shí)現(xiàn)
- Jenkins配置jdk、maven、git方式
- Jenkins+Git+Maven自動(dòng)化部署配置詳解
- 基于Jenkins+Maven+Gitea+Nexus搭建CICD環(huán)境的方式
- GitLab+Jenkins+Maven+Tomcat?實(shí)現(xiàn)自動(dòng)集成、打包、部署
- 使用Jenkins來(lái)構(gòu)建GIT+Maven項(xiàng)目的方法步驟
相關(guān)文章
java多線程編程之慎重使用volatile關(guān)鍵字
volatile關(guān)鍵字相信了解Java多線程的讀者都很清楚它的作用。volatile關(guān)鍵字用于聲明簡(jiǎn)單類型變量,下面看一下為什么要慎重使用volatile關(guān)鍵字2014-01-01
gson ajax 數(shù)字精度丟失問(wèn)題的解決方法
下面小編就為大家?guī)?lái)一篇gson ajax 數(shù)字精度丟失問(wèn)題的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
hashtable桶數(shù)通常會(huì)取一個(gè)素?cái)?shù)分析
這篇文章主要介紹了hashtable桶數(shù)通常會(huì)取一個(gè)素?cái)?shù)分析的相關(guān)資料,需要的朋友可以參考下2016-12-12
手把手帶你實(shí)現(xiàn)第一個(gè)Mybatis程序
這篇文章主要介紹了mybatis實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-07-07
String與XML互轉(zhuǎn)以及從XML取節(jié)點(diǎn)值并修改的方法
今天小編就為大家分享一篇String與XML互轉(zhuǎn)以及從XML取節(jié)點(diǎn)值并修改的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Java進(jìn)階學(xué)習(xí):網(wǎng)絡(luò)服務(wù)器編程
Java進(jìn)階學(xué)習(xí):網(wǎng)絡(luò)服務(wù)器編程...2006-12-12
Java實(shí)現(xiàn)的微信公眾號(hào)獲取微信用戶信息示例
這篇文章主要介紹了Java實(shí)現(xiàn)的微信公眾號(hào)獲取微信用戶信息,結(jié)合實(shí)例形式分析了Java微信公眾號(hào)獲取微信用戶信息相關(guān)原理、步驟與操作注意事項(xiàng),需要的朋友可以參考下2019-10-10

