SOA自动部署脚本(发布更新回滚)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SOA自动部署脚本(发布更新回滚)相关的知识,希望对你有一定的参考价值。

  1. 脚本功能

    使用该脚本完成SOA工程的全量更新、增量更新、全量回滚等操作。

  2. 自动部署流程

   技术分享

 3. 脚本代码

#!/usr/bin/python
#coding=utf-8
import sys,os,re,time,commands,logging
work_dir=‘/data/company/soa‘
package_dir=‘/data/package/soa‘
update_file_path=‘/data/update/‘
check_dir=os.path.exists(work_dir)
update_dir=os.path.exists(update_file_path)
data=os.listdir(update_file_path)
def Total_update():
    flag=0
    num=0
    while num <3:
        filename=raw_input(‘\033[1;31;40m请输入需要更新的完整包名:\033[0m‘)
        os.chdir(package_dir)
        result=os.path.lexists(filename)
        if result == 1:
            flag+=1
            break
        else:
            num+=1
            print ‘\033[1;31;40m您输入的包名不存在,请重新输入!\033[0m‘
    a=re.findall(r‘^-soa-\d{14}.war$‘,filename)
    filename_str=str(a).lstrip(‘[\‘‘).rstrip(‘\‘]‘)
    if len(filename_str) != 0:
        flag+=1
     else:
        sys.exit()

    if flag == 2:
        time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())
        release_dir=work_dir + ‘_‘ + time_tag
        os.mkdir(release_dir)
        os.system(‘rm -rf %s‘ %work_dir)
        os.system(‘unzip %s -d %s‘ %(filename,release_dir))
        os.system(‘ln -s %s %s‘ %(release_dir,work_dir))
        info=‘软件包已成功更新至:‘ + release_dir
        log_text(info)
        print ‘\033[1;31;40m %s \033[0m‘ %info
        
def log_text(info):
    logging.basicConfig(level=logging.DEBUG,
                format=‘%(asctime)s  %(message)s‘,
                datefmt=‘%d %b %Y %H:%M:%S‘,
                filename=‘/data/logs/update_soa.log‘,
                filemode=‘a‘)
    logging.debug(info)
    
def Incrementally_udate():
    if update_dir != 1:
        print ‘\033[1;31;40m创建更新文件存储目录!\033[0m‘
        os.system(‘mkdir -p %s‘ %update_file_path)
        sys.exit()
    if check_dir == 1:
        os.chdir(work_dir)
        find_command=‘find . -name "%s" ‘ %update_file
        aresult=commands.getoutput(find_command)
        if len(aresult) != 0:
            file_path=aresult.rstrip(update_file)
            os.chdir(file_path)
            time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())
            bak_result=commands.getstatusoutput(‘mv %s %s.%s‘ %(update_file,update_file,time_tag))
            if bak_result[0] == 0:
                update_file_abs_path=update_file_path + update_file
                update_result=commands.getstatusoutput(‘mv -i %s %s‘ %(update_file_abs_path,update_file))
                if update_result[0] == 0:
                    result=os.listdir(update_file_path)
                    info=‘更新‘ + work_dir + aresult.lstrip(‘\.‘) + ‘成功‘
                    log_text(info)
                    print ‘\033[1;31;40m %s \033[0m‘ %info
        else:
            print ‘\033[1;31;40m工程目录中无此文件!\033[0m‘
            sys.exit()
    else:
        print ‘\033[1;31;40m工程目录不存在!\033[0m‘
        sys.exit()
        
def rollback():
    def find_soa(i):
        a=re.findall(r‘soa_\d{14}$‘,i)
        return a
    os.chdir(‘/data/company‘)
    soa_list=os.listdir(‘/data/company‘)
    result=filter(find_soa,soa_list)
    sort_list=[]
    for t in result:
        sort_list.append(t.split(‘soa_‘)[1])
    sort_list.sort()
    back_ver=‘soa_‘ + sort_list[-2]
    last_ver=‘soa_‘ + sort_list[-1]
    os.system(‘rm -rf /data/company/%s‘ %last_ver)
    os.system(‘rm -rf /data/company/soa‘)
    os.system(‘ln -s %s /data/company/soa‘ %back_ver)
    info=‘代码回滚至:‘ + back_ver
    log_text(info)
    print ‘\033[1;31;40m %s \033[0m‘ %info
    
if __name__ == ‘__main__‘:
    while True:
        print ‘\033[1;31;40m‘
        print ‘‘‘
********* SOA 程序更新 *********

1.全量更新

2.增量更新

3.代码回滚

4.退出程序

*********************************
‘‘‘
        print ‘\033[0m‘

        choice=raw_input(‘\033[1;31;40m请输入您的选择:\033[0m‘)
        if choice == ‘1‘:
            print  ‘\033[1;31;40m‘
            print  ‘您选择的项目是全量更新‘
            print ‘\033[0m‘
            Total_update()
        if choice == ‘2‘:
            print  ‘\033[1;31;40m‘
            print  ‘您选择的项目是增量更新‘
            print ‘\033[0m‘
            if len(data) == 0:
                print ‘\033[1;31;40m无更新文件,请检查!\033[0m‘
            backup_tag=time.strftime("%Y%m%d%H%M%S", time.localtime()) + ‘zengliangbeifen‘
            bresult=commands.getoutput(‘ls -l %s‘ %work_dir)
            real_dir=str(bresult.split(‘->‘)[-1])
            os.chdir(‘/data/company‘)
            os.system (‘cp -r %s %s_%s‘ %(real_dir,real_dir,backup_tag))
            for update_file in data:
                Incrementally_udate()
        if choice == ‘3‘:
            print  ‘\033[1;31;40m‘
            print  ‘您选择的项目是代码回滚‘
            print ‘\033[0m‘
            rollback()
        if choice == ‘4‘:
            print  ‘\033[1;31;40m‘
            print  ‘您选择的项目是退出程序‘
            print ‘\033[0m‘
            sys.exit()


本文出自 “吾在庐山” 博客,请务必保留此出处http://147546.blog.51cto.com/137546/1858108

以上是关于SOA自动部署脚本(发布更新回滚)的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins+Gitlab通过脚本自动部署回滚web项目版本至服务器集群(测试环境和正式环境),图文详细

Tomcat灰度发布shell脚本(来自网络可以参考)

Jenkins与Gitlib实现自动化部署与持续构建

ansible 发部署nginx以及更新回滚

jenkins之代码部署回滚脚本

如何处理 Azure 部署槽中的数据库回滚?