jenkins 创建可回滚的项目发布
你可能会遇到的问题:
使用ansible-playbook的时候,ssh无法链接前台服务器
点击【高级】,为命令增加附加参数,使用--become-user root 即使用root用户执行playbook命令
Additional parameters: --become-user root
另外,添加好ssh无密码访问后,还需要切换到jenkins用户连接一次服务器,因为第一次连接时会让用户输入yes后才能连接上,所以需要操作一次,成功连接后即可使用了
sudo -u jenkins ssh root@192.168.1.10
================= 本文开始 =============
创建自定义项目:
选择 This project is parameterized (这个项目是参数化的),参数如下:
####Choice Parameter
名称
Status
选项
Deploy
Rollback
描述
Deploy:发布
Rollback:回滚
####String Parameter
名称
Version
默认值
0
描述
发布版本序号
同步项目代码前备份:
case $Status in
# Deploy)
# echo "Status:$Status"
# path="${WORKSPACE}/../${JOB_NAME}_bak/${BUILD_NUMBER}" #创建每次要备份的目录
# if [ -d $path ];
# then
# echo "The files is already exists "
# else
# mkdir -p $path
# fi
# rsync -r --exclude=".git" ${WORKSPACE}/ $path/ #将构建工作空间文件备份到文件夹
# echo "Copy code to ${path} Completing!"
# ;;
Rollback)
echo "Status:$Status"
echo "Version:$Version"
if [ $Version -lt 1 ];then
echo "Version val is error"
exit 1
fi
path="${WORKSPACE}/../${JOB_NAME}_bak/$Version" #备份目录
if [ ! -d $path ];then
echo "Bak dir not exists: $path"
exit 2
fi
#清除工作空间中除了.git文件夹的所有文件
find ${WORKSPACE}/ ! -regex .*\.git.* -empty -delete
rsync -r --exclude=".git" ${path}/ ${WORKSPACE}/ #将备份拷贝到构建工作空间
echo "Copy bak code ${path} to ${WORKSPACE} Completing!"
;;
*)
exit
;;
esac同步代码过程...
例子使用了ansible-playbook将代码同步到远程WEB服务器:
全局环境变量设置:
全局属性
Environment variables
键值对列表
键 PLAY_BOOK_EXCLUDE_FILE
值 /etc/ansible/playbook/deploy.excludejenkins安装好ansible插件,配置一下ansible插件的命令路径: 配置好两个命令ansible(本例未使用)和ansible-playbook
构建设置:这里使用了一个自定义的环境变量(jenkins全局管理里面配置的PLAY_BOOK_EXCLUDE_FILE,项目同步时忽略的目录和文件可以写到这个文件里)
Ansible installation ansible-playbook
Playbook path /etc/ansible/playbook/deploy.yml
Inventory Do not specify Inventory
Host subset dev-web test
Number of parallel processes 5
Extra Variables
Key srcdir
Value ${WORKSPACE}/
Key destdir
Value /www/wwwroot/houtai111/
Key opts
Value --exclude-from=${PLAY_BOOK_EXCLUDE_FILE}同步代码以后备份本次代码
case $Status in
Deploy)
echo "Status:$Status"
path="${WORKSPACE}/../${JOB_NAME}_bak/${BUILD_NUMBER}" #创建每次要备份的目录
if [ -d $path ];
then
echo "The files is already exists "
else
mkdir -p $path
fi
rsync -r --exclude=".git" ${WORKSPACE}/ $path/ #将构建工作空间文件备份到文件夹
echo "Copy code to ${path} Completing!"
;;
# Rollback)
# echo "Status:$Status"
# echo "Version:$Version"
#
# if [ $Version -lt 1 ];then
# echo "Version val is error"
# exit 1
# fi
#
# path="${WORKSPACE}/../${JOB_NAME}_bak/$Version" #备份目录
# if [ ! -d $path ];then
# echo "Bak dir not exists: $path"
# exit 2
# fi
#
# rsync -r --exclude=".git" ${path}/ ${WORKSPACE}/ #将备份拷贝到构建工作空间
# echo "Copy bak code ${path} to ${WORKSPACE} Completing!"
# ;;
*)
exit
;;
esac最后清理多余的备份,只保留最近的备份数量
ReservedNum=5 #保留文件数
FileDir="${WORKSPACE}/../${JOB_NAME}_bak"
date=$(date "+%Y%m%d-%H%M%S")
cd $FileDir #进入备份目录
FileNum=$(ls -l | grep '^d' | wc -l) #当前有几个文件夹,即几个备份
while(( $FileNum > $ReservedNum))
do
OldFile=$(ls -rt | head -1) #获取最旧的那个备份文件夹
echo $date "Delete File:"$OldFile
rm -rf $FileDir/$OldFile
let "FileNum--"
done 构建项目的时候就会有选择:Deploy 还是 Rollback, 选择Rollback的话,version 填写 发布的序号即可使用相应的备份数据
playbook
- hosts: test,online
remote_user: root
tasks:
- name: deploy code to remote server
synchronize:
src: '{{ srcdir }}'
dest: '{{ destdir }}'
mode: push
dirs: yes
owner: no
group: no
copy_links: no
delete: no
rsync_opts: '{{opts}}'
- name: copy files if not existing, and delete extraneous files
synchronize:
src: '{{ srcdir }}/{{ item }}'
dest: '{{ destdir }}/{{ item }}'
mode: push
dirs: yes
owner: no
group: no
copy_links: no
delete: yes
rsync_opts: '--ignore-existing'
with_items:
- common/coreCss/
- common/coreJs/
- common/css/
- common/js/
- pay/alipayMobile/alipay.config.php
- pay/alipayPC/alipay.config.php
- pay/singleTradeQuery/alipay.config.php
- wxpay/lib/WxPay.Config.php
- name: change files mode
file:
path: '{{ destdir }}/{{ item.0 }}'
mode: '{{ item.1 }}'
with_list:
- ['protected/yiic', '0755']
deploy.exclude
.git
.idea
.user.ini
lextab.py
yacctab.py
assets
attachments
node_modules
protected/runtime
pay/alipayMobile/alipay.config.php
pay/alipayPC/alipay.config.php
pay/singleTradeQuery/alipay.config.php
wxpay/lib/WxPay.Config.php
ansible hosts
[test]
192.168.1.100
[online]
web1 ansible_ssh_host=192.168.1.101 ansible_ssh_port=22
web2 ansible_ssh_host=192.168.1.102 ansible_ssh_port=22版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/364.html
转载时须注明出处及本声明