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主页,会发现构建正在进行