最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Jenkins+git+maven+tomcat自動(dòng)打包部署全過(guò)程

 更新時(shí)間:2025年12月02日 10:16:13   作者:笑锝?jīng)]心沒肺  
文章介紹了如何在CentOS 7系統(tǒng)上配置網(wǎng)絡(luò)和防火墻,安裝和配置Jenkins、Git、Maven和Tomcat,以及如何進(jìn)行多分支構(gòu)建和配置Jenkins觸發(fā)器,文章還解決了在Spring Boot項(xiàng)目、Maven打包和Tomcat啟動(dòng)過(guò)程中遇到的一些常見問題

Centos7系統(tǒng) -->設(shè)置好網(wǎng)絡(luò)和防火墻  網(wǎng)絡(luò)需要能訪問外網(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ò)程中的問題總結(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.jar

linux (分隔符英文冒號(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

#這里我們只是為了解決問題,更深入的做法是應(yīng)該抽象出來(lái)該類問題的共性,然后固化腳本;

#找到頭文件路徑列表

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 "問題序號(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)建  成功后就可以訪問了

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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用javaMail實(shí)現(xiàn)發(fā)送郵件

    使用javaMail實(shí)現(xiàn)發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了使用javaMail實(shí)現(xiàn)發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 淺析Java中comparator接口與Comparable接口的區(qū)別

    淺析Java中comparator接口與Comparable接口的區(qū)別

    本文要來(lái)詳細(xì)分析一下Java中Comparable和Comparator接口的區(qū)別,兩者都有比較的功能,那么究竟有什么區(qū)別呢,感興趣的Java開發(fā)者繼續(xù)看下去吧
    2016-10-10
  • 詳解springboot WebTestClient的使用

    詳解springboot WebTestClient的使用

    WebClient是一個(gè)響應(yīng)式客戶端,它提供了RestTemplate的替代方法。這篇文章主要介紹了詳解springboot WebTestClient的使用, 具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Spring解決泛型擦除的思路詳解

    Spring解決泛型擦除的思路詳解

    這篇文章主要介紹了Spring解決泛型擦除的思路,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • PageHelper插件實(shí)現(xiàn)服務(wù)器端分頁(yè)功能

    PageHelper插件實(shí)現(xiàn)服務(wù)器端分頁(yè)功能

    這篇文章主要為大家詳細(xì)介紹了PageHelper插件實(shí)現(xiàn)服務(wù)器端分頁(yè)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • SpringBoot整合Drools規(guī)則引擎動(dòng)態(tài)生成業(yè)務(wù)規(guī)則的實(shí)現(xiàn)

    SpringBoot整合Drools規(guī)則引擎動(dòng)態(tài)生成業(yè)務(wù)規(guī)則的實(shí)現(xiàn)

    本文主要介紹了SpringBoot整合Drools規(guī)則引擎動(dòng)態(tài)生成業(yè)務(wù)規(guī)則的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • java和 javaw 及 javaws的區(qū)別解析

    java和 javaw 及 javaws的區(qū)別解析

    這篇文章主要介紹了java和 javaw 及 javaws的區(qū)別解析,本文通過(guò)實(shí)例給大家詳細(xì)介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • java實(shí)現(xiàn)航班信息查詢管理系統(tǒng)

    java實(shí)現(xiàn)航班信息查詢管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)航班信息查詢管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java對(duì)象的序列化與反序列化詳解

    Java對(duì)象的序列化與反序列化詳解

    這篇文章主要為大家詳細(xì)介紹了Java對(duì)象的序列化與反序列化的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • java并發(fā)編程實(shí)例分析

    java并發(fā)編程實(shí)例分析

    在本文里我們給大家分享了關(guān)于java并發(fā)編程實(shí)例分析以及相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-03-03

最新評(píng)論

泽库县| 扬州市| 南溪县| 柳河县| 嘉鱼县| 瓮安县| 渝北区| 安庆市| 栖霞市| 枣强县| 新龙县| 正镶白旗| 吕梁市| 团风县| 内江市| 淳安县| 巫山县| 平谷区| 宜兴市| 琼结县| 定边县| 彝良县| 敦煌市| 定西市| 屏边| 河北省| 东乌| 永胜县| 荣昌县| 灌南县| 鄂温| 巨野县| 于田县| 汶上县| 金门县| 通州区| 于都县| 泰兴市| 贺州市| 东台市| 金华市|