jenkins结合gitlab,实时更新部署网站代码
环境:四台centos7主机
172.31.225.242 ---> gitlab服务器
172.31.225.243 ---> jenkins服务器
172.31.225.245 ---> tomcat服务器
172.31.225.244 ---> mysql服务器(存储sonarQube扫描数据)
gitlab安装:https://bbs.cnblackhat.com/thread-2857-1-1.html
jenkins安装:https://bbs.cnblackhat.com/thread-2859-1-1.html
tomcat安装:这里就不做过多赘述,自行百度,很简单
逻辑流程:
本地开发代码--->推送新代码至gitlab--->通过jenkins拉取代码--->sonarQube-scaner扫描测试代码BUG--->ansible批量部署web机器
实现操作:
这里直接jenkins服务器上就可以实现,需要安装sonarQube组件和sonarQube-scaner插件。
sonarQube组件安装的是6.5版本,zip压缩包,直接解压,修改里面的配置文件conf/sonar.properties,需要数据库保存扫描的记录。修改的内容如下:
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://172.31.225.244:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.host=0.0.0.0
sonar.web.port=9000
要求mysql版本为5.6或者5.7,低于5.6版本不行。
运行解析目录里面的sonar.sh start即可启动服务,端口默认9000端口
注意:如果你有php服务在运行,端口冲突,php使用的也是9000端口。
默认的sonarQube是英文界面,需要对应的中文插件:sonar-l10n-zh-plugin-1.11.jar ,把该插件上传至该目录下extensions/plugins,但需要重启sonarqube服务,sonar.sh restart
在jenkins安装插件sonarQube-scaner,这里我已经提前安装好。注意:安装好之后,需要长期jenkins服务
再全局配置sonarqube,点击系统管理-->系统配置,配置如下图:(配置好,点击应用,保存)
再配置sonarqube-scaner,点击系统管理-->全局工具配置,如果已经装好sonarQube-scaner,指定对应的位置即可,没有的话,就直接自动安装(最后点击应用,保存)
下面开始新建任务,输入任务名称,选择构建一个自由风格的软件项目或者流水线(基于pipline)都可以,这里我就选择自由风格的。这里由于时间的问题,我就不介绍ansible了,我就直接用自己编写的脚本来操作了。(具体部署,看下面截图)
然后开始构建
目标tomcat机器打开看下内容
sonarqube扫描的结果:(因为是一个静态文件,很简单的,所以没有什么什么BUG)
部署脚本内容:
#!/bin/bash
DATE=`date +%Y-%m-%d_%H-%M-%S`
GROUP_LIST=$2
function IP_list(){
if [[ ${GROUP_LIST} == "online-group1" ]];then
Server_IP="172.31.225.245"
echo ${Server_IP}
elif [[ ${GROUP_LIST} == "online-group2" ]];then
Server_IP="172.31.225.242"
ssh root@172.31.225.243 ""echo enable server web_port/172.31.225.245" | socat stdio /var/lib/haproxy/haproxy.sock"
ssh root@172.31.225.244 ""echo enable server web_port/172.31.225.242" | socat stdio /var/lib/haproxy/haproxy.sock"
echo ${Server_IP}
elif [[ ${GROUP_LIST} == "online-all" ]];then
Server_IP="172.31.225.245 172.31.225.242"
echo ${Server_IP}
fi
}
#function pull_code(){
# rm -rf /home/tomcat/.jenkins/workspace/testweb
# cd /home/tomcat/.jenkins/workspace
# git clone git@192.168.7.202:testgroup/testweb.git
#}
function make_zip(){
cd /var/lib/jenkins/workspace/test-demo1 && zip testweb.war.zip ./*
}
function down_node(){
for node in ${Server_IP};do
echo ${node}
ssh root@172.31.225.243 ""echo disable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
ssh root@172.31.225.244 ""echo disable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
echo "${node} 关闭成功!"
done
}
function stop_tomcat(){
for node in ${Server_IP};do
ssh tomcat@${node} "/etc/init.d/tomcat stop"
echo "${node} 关闭成功!"
done
}
function start_tomcat(){
for node in ${Server_IP};do
ssh tomcat@${node} "/etc/init.d/tomcat start"
echo "${node} 启动成功!"
done
}
function scp_codefile(){
cd /var/lib/jenkins/workspace/test-demo1
for node in ${Server_IP};do
scp testweb.war.zip tomcat@${node}:/apps/tomcat_appdir
ssh tomcat@${node} "cd /apps/tomcat_appdir && unzip testweb.war.zip -d /apps/tomcat_webdir/testweb-${DATE} && rm -rf /data/tomcat_webdir/testweb && ln -sv /apps/tomcat_webdir/testweb-${DATE} /data/tomcat_webdir/testweb"
done
}
function web_test(){
#sleep 30
for node in ${Server_IP};do
NUM=`curl -s -I -m 10 -o /dev/null -w %{http_code} http://${node}:8080/testweb/index.html`
if [[ ${NUM} -eq 200 ]];then
echo "${node} 测试通过,即将添加到负载"
add_node ${node}
else
echo "${node} 测试失败,请检查该服务器是否成功启动tomcat"
fi
done
}
function add_node(){
node=$1
echo ${node},"----->"
if [ ${node} == "192.168.8.100" ];then
echo "192.168.8.100部署完毕,请进行代码测试!"
else
ssh root@172.31.225.243 ""echo enable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
ssh root@172.31.225.244 ""echo enable server web_port/${node}" | socat stdio /var/lib/haproxy/haproxy.sock"
fi
}
function rollback_last_version(){
for node in ${Server_IP};do
NOW_VERSION=`ssh tomcat@${node} ""/bin/ls -l -rt /data/tomcat_webdir/ | awk -F"->" '{print $2}' | tail -n1 | awk -F"/apps/tomcat_webdir/" '{print $2}'""`
NAME=`ssh tomcat@${node} ""/bin/ls -l -rt -d /apps/tomcat_webdir/testweb* | grep -B 1 ${NOW_VERSION} | head -n1 | awk '{print $9}'""`
ssh tomcat@${node} "rm -rf /data/tomcat_webdir/testweb && ln -sv ${NAME} /data/tomcat_webdir/testweb"
done
}
main(){
case $1 in
deploy)
IP_list;
#pull_code;
make_zip;
down_node;
stop_tomcat;
scp_codefile;
start_tomcat;
web_test;
;;
rollback_last_version)
IP_list;
echo ${Server_IP}
down_node;
stop_tomcat;
rollback_last_version;
start_tomcat;
web_test;
;;
esac
}
main $1 $2
tomcat启动关闭脚本:(写这个脚本的原因,有时候tomcat会关不掉,所以写这个脚本进行强制关闭)
#!/bin/bash
# #########################################################
# Tomcat init script for "中企动力科技股份有限公司"####
###########################################################
# chkconfig: 2345 96 14 ###################################
# description: 2016/11/1. 张士杰##########################
# #########################################################
JDK_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64
CATALINA_HOME=/apps/tomcat
export JDK_HOME CATALINA_HOME
source /etc/profile
#PID=`ps -ef | grep -v grep | grep java | awk '{print $2}'`
#NUM=`ps -ef | grep -v grep | grep java | awk '{print $2}' | wc -l`
#case $1 in
start() {
echo "正在判断服务状态,请稍等!"
echo "请稍等3秒钟"
echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
if netstat -an | grep 8080 | grep LISTEN >/dev/null
then
echo "Tomcat已经正在运行了!"
else
echo "Tomcat没有运行,1秒后启动!"
echo 1;sleep 1
$CATALINA_HOME/bin/catalina.sh start
echo "Tomcat 已经成功启动完成,5秒后判断是否启动成功"
echo "5";sleep 1;echo "4";sleep 1
echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
if netstat -an | grep 8080 | grep LISTEN >/dev/null
then
PID=`ps -ef | grep tomcat | grep jdk | awk '{print $2}'`
NUM=`ps -ef | grep tomcat | grep jdk | awk '{print $2}' | wc -l`
echo "Tomcat 已经成功启动${NUM} 个Tomcat进程!,PID为${PID}"
else
echo "Tomcat启动失败,请重新启动!"
echo 1
fi
fi
}
stop() {
PID=`ps -ef | grep -v grep | grep java | awk '{print $2}'`
NUM=`ps -ef | grep -v "color" | grep tomcat | awk '{print $2}' | wc -l`
echo "正在判断服务状态,请稍等3秒钟!"
echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
if netstat -an | grep 8080 | grep LISTEN >/dev/null
then
echo "Tomcat运行中,1秒后关闭!"
echo 1;sleep 1
echo "即将关闭Tomcat服务,请稍等!"
$CATALINA_HOME/bin/catalina.sh stop ;echo "已经执行关闭命令,正在检查关闭了多少Tomcat进程,请稍等5秒钟!"
sleep 2
echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
pkill java && pkill tomcat
if netstat -an | grep 8080 | grep LISTEN >/dev/null;then
PID=`ps -ef | grep -v grep | grep java | awk '{print $2}'`
NUM=`ps -ef | grep -v "color" | grep tomcat | awk '{print $2}' | wc -l`
kill -9 $PID ;echo "已成功关闭${NUM} 个tomcat进程"
else
echo "Tomcat 已经关闭完成!"
echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
fi
else
echo "Tomcat 没有运行"
echo 1
fi
if netstat -an | grep 8080 | grep LISTEN >/dev/null;then
PID=`ps -ef | grep -v grep | grep java | awk '{print $2}'`
#NUM=`ps -ef | grep -v "color" | grep tomcat | awk '{print $2}' | wc -l`
echo "关闭失败,即将强制删除tomcat进程!"
sleep 2
pkill tomcat ;sleep 2
if netstat -an | grep 8080 | grep LISTEN >/dev/null;then
echo "强制关闭失败,即将再次强制删除tomcat进程!"
pkill java; sleep 2
fi
fi
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
esac
注:此脚本是针对负载均衡haproxy和高可用keepalived来写的,针对这两个程序部署,论坛之前有些过,就不多描述了
页:
[1]