Jenkins+git+maven+tomcat自动打包部署

Centos7系统 -->设置好网络和防火墙  网络需要能访问外网

准备工作

ip 192.168.229.128 

apache-maven-3.3.9         git-2.33.0 a        pache-tomcat-8.5.79(项目使用)

jdk1.8.0_251(项目使用) jdk-17.0.4(jenkins使用)        jenkins.war

关闭防火墙或者开放端口

关防火墙 

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

配置环境环境变量

[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

查看版本

启动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:

系统管理--全局安全配置

系统管理---》插件管理

在可选插件中,maven ssh  相关插件安装

添加Credentials凭据

 系统管理--全局工具配置

 配置maven

配置git

回主页   新任务  创建maven 工程 

 然后保存 --立即构建

打包过程中的问题总结

1、springboot项目报错 SpringBoot发布WAR启动报错:Error assembling WAR: webxml attribute is required

修改web model的pom.xml

<packaging>war</packaging>

SpringBoot默认发布的都是jar,因此要修改默认的打包方式jar为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设置为provided,原因很简单:我们的项目中可能会使用Filter等Servlet的api;因此,不建议spring-boot-starter-web中移除嵌入式Spring-boot-starter-tomcat的依赖,因为这样就必须再单独添加servet-api的依赖。

2、maven打包报错Java heap space

命令符执行 mvn install 报错 java.lang.OutOfMemoryError: Java heap space

需要配置环境变量:MAVEN_OPTS = -Xms512m -Xmx1024m

然后在 path中加入%MAVEN_OPTS%

3、Tomcat启动报错:One or more listeners failed to start

经过排查和查询:原来的maven是windows上跑的,现在是Linux上所以要将pom中的

Windows(分隔符英文分号);

${java.home}/lib/rt.jar;${java.home}/lib/jce.jar

linux (分隔符英文冒号):

${java.home}/lib/rt.jar:${java.home}/lib/jce.jar

构建后操作

然后 调整原maven项目的配置,增加下面配置--构建后操作

其中的命令行如下

#!/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

#这里我们只是为了解决问题,更深入的做法是应该抽象出来该类问题的共性,然后固化脚本;

#找到头文件路径列表

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

#进行拷贝过程

for file in $head_files

do

source_dir=${file%/*}

#判断目标目录是否存在,不存在创建

[ -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 "问题序号: " > readme.txt
#cat tt.txt  >> readme.txt
echo "更新文件来源:" >> readme.txt
echo "更新路径:" >> readme.txt
echo "更新人:" >> readme.txt
echo "更新时间:$(date +%Y%m%d)" >> readme.txt

mv readme.txt $des_dir 

#对拷贝结果进行判断
if [ $? != 0 ]; then

echo "copy files error!!!"

else

echo "copy files successfully!,total $file_count files."

fi

成功展示 

然后构建  成功后就可以访问了

jenkins多分支构建选择

通常开发提交到git上的代码会有多个分支,比如master分支、release分支等,少则1、2个,多则10几20几个;当构建的时候,如果不配置多分支构建,每构建一个新的分支,就需要修改配置,如果没有给其他运维人员开修改配置的权限,则需要管理员去修改配置再构建,很麻烦;所以,这时候就用到了多分支构建;

1、安装 Git Parameter插件

 2、配置参数化构建过程

   名称自定义,这其实是个变量名,在选择分支的时候要用到;参数类型选择分支或标签;默认值可以不用写;

3、指定分支

 指定分支写上之前定义的名称,前面加$符号;($branch)

4、构建时选择对应的分支

此时,在构建时,就会展示该项目的所有分支,根据需求选择构建的分支即可;

优化启动脚本,并加入开机自启jenkins.sh

#!/bin/bash
###主要目的用于开机启动服务,不然 启动jenkins.war包没有java -jar的权限
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启动服务 配置java安装根路径,和启动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

给权限

chmod +x jenkins.sh

脚本测试

#启动jenkins
/app/jenkins.sh start
#关闭jenkins
/app/jenkins.sh stop

在/etc/rc.d/rc.local文件底部,添加内容:

# jenkins

/app/jenkins.sh start

给权限

chmod +x /etc/rc.d/rc.local

重启计算机

reboot

构建触发器配置

1、需要勾选“build when a change is pushed to gitlab. GitLab CI Service URL:********”该项(注意:只有jenkins安装了gitlab hook plugin插件后,才有该项,不安装是没有该选项的)

2、在“构建”配置如下:

至此,jenkins的配置已经完成

接下来配置gitlab

(1)在gitlab该project界面点击side bar最下面的settings图标,如下图

(2)然后再点击侧边栏中的“web Hooks”,在“URL”一栏输入URL:********,见下图:

点击确定

(3)点击TEST HOOK按钮,如果提示“Hook successfully executed”,说明gitlab和jenkins关联成功

接下来就开始验证了:

在本地的另一个目录提交一个文件a.txt到gitlab并push后,回到jenkins主页,会发现构建正在进行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值