写了一个脚本用于每天备份一下jenkins的工程代码
脚本内容，注意由于是在每天凌晨进行备份，所以备份时的备份目录是生成的昨天的日期目录：#! /bin/bash #=============== # Back up files once a day and delete old backups # Author: joyber #=============== ReservedNum=7 #keep last backup num BSPATH=/var/lib/jenkins/workspace #jenkins for dir in `ls -d $BSPATH/*_bak` do BSNAME=`basename $dir | sed 's/_bak//'` #project name BAKDIR=`ls -t $dir | head -1` #last project code backup diri basename SRC=$dir/$BAKDIR/ #copy src dir DESC=$BSPATH/${BSNAME}_daybak/`date +%Y%m%d -d '-1 day'`/ #copy desc dir, yesterday echo "$SRC => $DESC" if [ ! -d $DESC ]; then mkdir $DESC -p fi rsync -r $SRC $DESC #use rsync copy files if [ $? -eq 0 ]; then BAKDIR=`dirname $DESC` cd $BAKDIR #goto day bak dir FileNum=$(ls -l | grep '^d' | wc -l) #check backup num at now while(( $FileNum > $ReservedNum)) do OldFile=$(ls -rt | head -1) #del old backup files echo $date "Delete File:"$OldFile rm -rf $BAKDIR/$OldFile let "FileNum--" done echo -e "\033[34mbackup success\033[0m" else echo -e "\033[31mbackup failed\033[0m" fi done可以结合这篇日记方法，实现代码能快速恢复到某一天的备份jenkins 创建可回滚的项目发布：https://blog.qqvbc.com/default/364.html将rollback部分的代码改写一下，把path变量设置为天备份，不存在的话就是发布备份了：case $Status in Rollback) echo "Status:$Status" echo "Version:$Version" if [ $Version -lt 1 ];then echo "Version val is error" exit 1 fi path="${WORKSPACE}/../${JOB_NAME}_daybak/$Version" #每天备份的目录 if [ ! -d $path ]; then path="${WORKSPACE}/../${JOB_NAME}_bak/$Version" #备份目录 fi 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初学shell脚本编写，望指证
==================================== jenkins 配置新站步骤 ssh-copy-to root@172.19.0.x vim /etc/ansible/hosts servername(目标服务器名称) ansible_ssh_host=172.19.0.x ansible_ssh_port=22 cd /var/lib/jenkins/test #测试是否能通过jenkins用户执行ansible执行连通到目标服务器 sudo -u jenkins ansible -m ping --become-user root -u root --private-key ./ssh4337360459752630127.key servername 创建项目，可以从XX项目复制（填写项目名称，选择自由项目，最下面填写 从xxx项目复制来），修改以下地方： ----源码管理: --------git 地址； --------点击【高级】修改Refspec为：+refs/heads/分支名字:refs/remotes/origin/分支名字 --------指定分支（为空时代表any）：*/分支名字 ----构建： --------ansible playbook: ------------Host subset: servername(目标服务器名称) ------------点击【高级】添加代码同步参数：Extra Variables ------------增加参数【srcdir】源码所在目录，填写代码空间变量：${WORKSPACE}/ ------------增加参数【destdir】这个定义的值为目标发布的网站目录，注意后面要加/结尾：如 /www/wwwroot/xxxxxx/ ------------增加参数【opts】文件同步参数，填写：--exclude-from=${PLAY_BOOK_EXCLUDE_FILE} ------------ Additional parameters 填写:--become-user root ----保存 #登录目标服务器，将项目代码备份，注意目录一定要以/结尾 rsync -r --exclude=.git --exclude=assets --exclude=attachments --exclude=protected/runtime --exclude=node_modules /www/wwwroot/xxxxxx/ ~/xxxxxxbak/ #发布测试是否成功，登录进去发布，选择项目:Build with Parameters -> deploy
你可能会遇到的问题：使用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