你可能会遇到的问题:
使用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.exclude

jenkins安装好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

标签: jenkins

添加新评论