- 要求:当gitlab提交到release/*分支上时,触发jenkins自动构建,再手动把构建的包发布到对应的服务器上。
- 配置jenkins自动构建job,参考我上一篇博客:jenkins通过正则表达式过滤分支,gitlab推送到特定分支时自动构建
- 新建一个自由风格的job Rollback,用于发布自动构建的包。
- 选择参数化构建,按如图所示设置参数。
- 构建环境勾选Color ANSI Console Output,用于输出shell脚本的字体颜色
- 构建设置build,执行shell,填写用来发布的脚本。
- 编写发布脚本
#!/bin/bash
#java jenkins发布脚本
#author menard 2019-06-12
#编写发送文件函数,$job是jenkins里选择的job,$version是jenkins输入的版本号
#定义变量
web1_mod='client-app,registration,authenticate-server,client-web,common-server'
web2_mod='client-app,registration,authenticate-server,client-web,common-server'
api_mod='registration,common-server,client-api'
fs_mod='server-upload,client-web,common-server,registration'
cms_mod='cms'
schedule_mod='schedule,asynclog'
web_user=www
fs_user=vod
web1_ip=172.16.218.1
web2_ip=172.16.58.2
api_ip=10.168.154.3
fs_ip=10.122.84.4
cms_ip=172.16.218.5
schedule_ip=172.16.218.6
dest_default=目标主机上的项目所在目录
cmd_default=目标主机上的项目更新脚本
cmd_default2=docker部署的项目更新脚本
#cmd_default2用于docker的模块是docker的发布
#dest_default=/tmp
#cmd_default=ls
#cmd_default2=ls
echo "job=$job"
echo "版本号=$version"
echo host=$host
#函数使用方法build (要发布的模块名) 用户名 主机ip 文件路径 执行脚本 ssh端口
function build ()
{
echo "模块=$1"
echo "用户=$2"
echo "ip=$3"
echo "目录=$4"
echo "命令=$5"
echo "端口=$6"
#去掉$1传进来的,
mod=(`echo $1|sed 's/,/ /g'`)
#echo mod=${mod[*]}
#同步前,先把目标目录文件删除
ssh -p $6 $2@$3 << eeooff
echo "正在删除$3的$4目录下的*.tar.gz文件"
rm -rf $4/*.tar.gz
exit
eeooff
#循环传送需要的构建成的gz包到目标服务器
for i in ${mod[@]}
do
#echo i=$i
#$job是jenkins的job参数,$version是jenkins的版本号,用来选择要回滚的job和版本号
dir=`find /var/jenkins_home/jobs/$job/builds/$version/ -name "*$i*" -type d`
#echo dir=$dir
file=`find $dir -name *.tar.gz`
#echo file=$file
#$2是函数调用时输入的目标用户,$3为目标ip,$4为目标路径
f=`echo $file |awk -F / '{print $NF;}'`
#echo f=$f
rsync -zP -e "ssh -p $6" --timeout=1800 $file $2@$3:$4
#通过$?的值判断有没传送成功,如果失败返回失败值并结束脚本
if [ $? -ne 0 ];then
echo -e "\01122[31m$file发送到$3失败 \01122[0m"
exit 1
fi
echo "$f已发送到$3"
done
#连上服务器执行发布脚本,$5为发布脚本
echo -e "\01122[32m$3全部文件发送完成,开始执行发布脚本 \01122[0m"
ssh -p $6 $2@$3 << eeooff
$5
eeooff
if [ $? -eq 0 ];then
echo -e "\01122[32m$3发布完成 \01122[0m"
else
echo -e "\01122[31m$3执行发布脚本失败 \01122[0m"
exit 1
fi
}
case $host in
web1)
build $web1_mod $web_user $web1_ip $dest_default $cmd_default 22
;;
web2)
build $web2_mod $web_user $web2_ip $dest_default $cmd_default 22
;;
'web1 & web2')
#修改Hudson设置的环境变量BUILD_ID的值,从而让Jenkins认为此进程不是由Job的构建过程衍生的,防止Jenkins kill掉进程
BUILD_ID=dontKillMe
build $web1_mod $web_user $web1_ip $dest_default $cmd_default 22
build $web2_mod $web_user $web2_ip $dest_default $cmd_default 22
;;
api)
build $api_mod $web_user $api_ip $dest_default $cmd_default2 22
;;
fs)
build $fs_mod $fs_user $fs_ip $dest_default $cmd_default 22
;;
cms)
build $cms_mod $web_user $cms_ip $dest_default $cmd_default2 22
;;
schedule)
build $schedule_mod $web_user $schedule_ip $dest_default $cmd_default 22
;;
all)
BUILD_ID=dontKillMe
build $web1_mod $web_user $web1_ip $dest_default $cmd_default 22
build $web2_mod $web_user $web2_ip $dest_default $cmd_default 22
build $api_mod $web_user $api_ip $dest_default $cmd_default2 22
build $fs_mod $fs_user $fs_ip $dest_default $cmd_default 22
build $cms_mod $web_user $cms_ip $dest_default $cmd_default2 22
build $schedule_mod $web_user $schedule_ip $dest_default $cmd_default 22
;;
*)
exit
;;
esac
- 构建
- 查看构建结果