主要功能块还是通过脚本来完成的,jenkins提供了一个更直观发布过程和操作页面,gitblit也提供了一个非常友好的操作页面。
实现功能:
# -1-代码发布
# -2-版本回滚(通过git服务器版本切换再rsync同步到服务器上完成回滚)
# -3-添加git tag版本标签
# -4-删除git tag版本标签
# -5-代码回滚(通过发布时拷贝的备份文件恢复完成回滚)
线下服务器:192.168.0.210 安装了docker jenkins 、gitblit(非docker)
线上服务器:39.108.100.130
在192.168.0.210服务器搭建好gitblit,然后在docker jenkins的映射工作目录上拉取git代码,并使用git tag标记发布版本号,再通过rsync命令同步到39.108.100.130服务器上对应的发布目录上。回滚的话,将git代码切换到上一个版本号代码,再通过rsync同步到线上服务器上就可以了。 我这里功能做得完善些,所以设置步骤会比较多。
gitblit 设置搭建(可参考我之前写的文档, 这里不作叙述,你也可以选择使用docker gitblit快速搭建)
docker jenkins 设置
1. 创建docker jenkins
docker run -p 8800:8080 -p 5000:5000 -v /usr/local/jenkins:/var/jenkins_home -v /usr/local/jenkins_war/jenkins.war:/usr/share/jenkins/jenkins.war -v /etc/localtime:/etc/localtime -d jenkins
-v /usr/local/jenkins:/var/jenkins_home 映射jenkins主目录
-v /usr/local/jenkins_war/jenkins.war:/usr/share/jenkins/jenkins.war 映射使用新的jenkins版本(内置版本提示偏旧了,所以这里重新下载了新的war映射更换,如果你目前下载的docker jenkins 镜像比较新,没提示版本问题,那这一条语句可以省略。
2.免密设置
A. 192.168.0.210服务器ssh到gitblit的免密设置
设置方式可查看我的这篇文档:https://blog.csdn.net/cbuy888/article/details/89884486
B. docker jenkins ssh到192.168.0.210 服务器 ( 如果你使用非docker的jenkins这一步就可以省了)
因为这里使用了docker jenkins(独立容器) ,所以要做要让它能对192.168.0.210服务器上有读写操作权限,要进到docker jenkins容器里ssh免密到192.168.0.210服务器上。
[root@bakserver docker]# docker exec -it 3ee bash
...
jenkins@3ee6789a3463:/$ ssh-keygen
...
jenkins@3ee6789a3463:/$ ssh-copy-id 192.168.0.210
...
3.docker jenkins 页面设置
安装插件:
Git Parameter Plug-In Adds ability to choose branches, tags or revisions from git repositories configured in project. |
0.9.10 | |||
Git plugin This plugin integrates Git with Jenkins. |
3.10.0 |
Localization: Chinese (Simplified) Jenkins 及其插件的简体中文语言包。 |
0.0.15 |
新建项目:
创建好后打开项目-->再点击配置
因为我在192.168.0.210服务器上做了ssh免密,这里的设置主要是为Tag这个选项参数读取git版本号用。
配置项根据实际情况修改填写
实现功能:
# -1-代码发布
# -2-版本回滚(通过git服务器版本切换再rsync同步到服务器上完成回滚)
# -3-添加git tag版本标签
# -4-删除git tag版本标签
# -5-代码回滚(通过发布时拷贝的备份文件恢复完成回滚)
注意:jenkins_workspace="/var/jenkins_home/workspace" 这个是docker jenkins 默认的可读写目录
#----------------配置
# docker 容器ssh连接宿主机(要求免密连接)
ssh_local="ssh [email protected]"
# jenkins服务器ssh连接线上发布的服务器(要求免密连接)
ssh_remote="ssh -p 1876 [email protected]"
# docker jenkins 本地路径
jenkins_workspace="/var/jenkins_home/workspace"
# docker jenkins 映射路径
docker_jenkins="/usr/local/jenkins/workspace"
# git代码 ssh下载路径
git_ssh="ssh://[email protected]:29418/Sharebed/mstcp.git"
# 运程服务器ip/代码目录路径
remote_code="39.108.133.131:/tmp"
#----------------功能块
on_log="$jenkins_workspace/.$git_folder.log"
git_folder=${git_ssh##*/}
git_folder=${git_folder%%.*}
case $Status in
# -1-代码发布
"Depoly")
echo "status: $Status"
[ -f "$on_log" ] || : > $on_log
[ $Version -eq 0 ] && echo "请输入版本号" && exit 9
# 拉取代码
cd $jenkins_workspace
temp_time=`date +%Y%M%d%H%M`
if [ -d "$jenkins_workspace/$git_folde" ];then
cd $jenkins_workspace/$git_folder
git pull origin master
git tag $Version $id -m "最新版本发布"
git push origin $Version
else
git clone $git_ssh
fi
# 备份代码(在远程服务器上/usr/local/jenkins目录下创建脚本backups131.sh脚本)
last_version=`tail -1 $on_log | awk -F "::" '{print $2}'`
$ssh_local $ssh_remote "/data/shell/codeBAK.sh $last_version"
# 上传代码
$ssh_local "rsync -avc --delete $docker_jenkins/$git_folder -e 'ssh -p 1876' $remote_code"
# 发布日志
echo "$temp_time: 从$git_ssh拉取代码,发布到$remote_code服务器上,版本号::$Version" >> $on_log
echo "Depoly Done"
;;
# -2-版本回滚(通过git服务器版本切换再rsync同步到服务器上完成回滚)
"RollBack")
echo "status: $Status"
cd $jenkins_workspace/$git_folder
git checkout $Tag
$ssh_local "rsync -avc --delete $docker_jenkins/$git_folder -e 'ssh -p 1876' $remote_code"
echo "RollBac Done"
;;
# -3-添加版本标签
"AddTag")
echo "status: $Status"
cd $jenkins_workspace/$git_folder
if [ $Version != "0" ];then
git tag $Version $GitID -m "添加版本"
git push origin $Version
fi
echo "AddTag Done"
;;
# -4-删除版本标签
"DellTag")
echo "status: $Status Tag=$Tag Version=$Version"
cd $jenkins_workspace/$git_folder
if [ $Version -eq 0 ];then
git tag -d $Tag
git push origin :$Tag
else
git tag -d $Version
git push origin :$Version
fi
echo "DellTag Done"
;;
# -5-代码回滚(通过发布时拷贝的备份文件恢复完成回滚)
"RollBack_CP")
echo "status: $Status"
# 以最新时间戳的备份进行回滚
temp=`ls /data/Bak | awk -F "." '{print $2}' | sort -n | head -1`
temp=`ls /data/Bak | grep $temp`
rm /data/www/ald8/* -rf
tar -xf /data/Bak/$temp -C /data/www/ald8/
echo "RollBack_CP Done"
;;
*)
echo "nothing to do"
exit 11
;;
esac
以上有个调用39.108.100.130服务器的备份脚本如下:
# 备份代码(在远程服务器上/usr/local/jenkins目录下创建脚本backups131.sh脚本)
last_version=`tail -1 $on_log | awk -F "::" '{print $2}'`
$ssh_local $ssh_remote "/data/shell/codeBAK.sh $last_version"
[root@u130 www]# cd /data/shell/
[root@u130 shell]# ls
codeBAK.sh
[root@u130 shell]# cat codeBAK.sh
#!/bin/bash
# 要备份的文件目录
codeURL="/tmp/mstcp"
# 备份存放目录
codeBAK="/data/codeBAK"
# 保留最新备份的数量
bak_num=10
# 备份日志文件
BAK_log="$codeBAK/.codeBAK.log"
#---主功能块
# 备份功能
temp_name=${codeURL##*/}
[ ! -d $codeBAK ] && mkdir -p $codeBAK
[ ! -f $BAK_log ] && : > $BAK_log
cd $codeURL
dtime=`date +%Y%M%d%H%M`
temp="$codeBAK/$temp_name.$dtime.$1.tar.gz"
tar -zcpPf $temp *
echo "$dtime::$temp" >> $BAK_log
# 过滤出十个最新备份除外的较早备份时间戳,并逐个删除。
cd $codeURL
temp=`awk -F "::" '/'$i'/{print $2}' $BAK_log | awk 'NR>'$bak_num'{print}'`
for p in ${temp[@]}
do
rm *$p* -rf
done