Exemplo n.º 1
0
def deploy_run(request,pid): 
    try:
        project = Project_Config.objects.get(id=pid)
        serverList = Project_Number.objects.filter(project=project)
        if project.project_repertory == 'git':version = GitTools()
        elif project.project_repertory == 'svn':version = SvnTools()
    except:
        return render_to_response('deploy/deploy_run.html',{"user":request.user,
                                                         "errorInfo":"项目不存在,可能已经被删除."}, 
                                  context_instance=RequestContext(request))     
    if request.method == "GET":
        if project.project_model == 'branch':bList = version.branch(path=project.project_repo_dir) 
        elif project.project_model == 'tag':bList = version.tag(path=project.project_repo_dir) 
        #获取最新版本
        version.pull(path=project.project_repo_dir)        
        vList = version.log(path=project.project_repo_dir, number=50)
        return render_to_response('deploy/deploy_run.html',{"user":request.user,
                                                         "project":project,"serverList":serverList,
                                                         "bList":bList,"vList":vList}, 
                                  context_instance=RequestContext(request)) 
        
    elif request.method == "POST":
        if request.POST.getlist('project_server',None):
            serverList = [ Project_Number.objects.get(project=project,server=ds) for ds in request.POST.getlist('project_server') ]
            allServerList = [ ds.server  for ds in Project_Number.objects.filter(project=project) ]
            #获取项目目标服务器列表与分批部署服务器(post提交)列表的差集
            tmpServer = [ i for i in allServerList if i not in request.POST.getlist('project_server') ]
        else:return JsonResponse({'msg':"项目部署失败:未选择目标服务器","code":500,'data':[]}) 
        if DsRedis.OpsProject.get(redisKey=project.project_uuid+"-locked") is None:#判断该项目是否有人在部署
            #给项目部署加上锁
            DsRedis.OpsProject.set(redisKey=project.project_uuid+"-locked",value=request.user)
            DsRedis.OpsDeploy.delete(project.project_uuid)  
            if request.POST.get('project_mode',None) == "rollback":
                if project.project_model == 'branch':
                    trueDir = project.project_dir+project.project_env+'/'+ request.POST.get('project_version')  + '/'
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Start] Start Rollback branch:%s  vesion: %s" % (request.POST.get('project_branch'),request.POST.get('project_version')))
                elif  project.project_model == 'tag':
                    trueDir = project.project_dir+project.project_env+'/'+ request.POST.get('project_branch') + '/'
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Start] Start Rollback tag:%s" % request.POST.get('project_branch'))
            else:
                #判断版本上线类型再切换分支到指定的分支/Tag
                if project.project_model == 'branch':
                    bName = request.POST.get('project_branch')
                    result = version.checkOut(path=project.project_repo_dir, name=bName)
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Start] Switched to branch %s" % bName)
                    #reset到指定版本
                    result = version.reset(path=project.project_repo_dir, commintId=request.POST.get('project_version'))
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Git reset to {comid} info: {info}".format(comid=request.POST.get('project_version'),info=result[1])) 
                    trueDir = project.project_dir+project.project_env+'/'+ request.POST.get('project_version')  + '/'
                elif project.project_model == 'tag':
                    bName = request.POST.get('project_branch')
                    result = version.checkOut(path=project.project_repo_dir, name=bName)
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Start] Switched to tag %s" % bName)
                    trueDir = project.project_dir+project.project_env+'/'+ bName + '/'
                #创建版本目录
                base.mkdir(dirPath=trueDir)
                DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Mkdir version dir: {dir} ".format(dir=trueDir))
                #创建快捷方式
                softdir = project.project_dir+project.project_name+'/'
                result = base.lns(spath=trueDir, dpath=softdir.rstrip('/'))
                DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Make softlink cmd:  ln -s  {sdir} {ddir} info: {info}".format(sdir=trueDir,ddir=softdir,info=result[1]))
                if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]})                   
                #执行部署命令  - 编译型语言      
                if project.project_local_command:
                    result =  base.cmds(cmds=project.project_local_command) 
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Execute local command: {cmds} info: {info}".format(cmds=project.project_local_command,info=result[1])) 
                    if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]})  
                #非编译型语言
                else:               
                    #获取要排除的文件 
                    exclude = None
                    if project.project_exclude:
                        try:
                            exclude = ''
                            for s in project.project_exclude.split(','):
                                exclude =  '--exclude "{file}"'.format(file=s.replace('\r\n','').replace('\n','').strip()) + ' ' + exclude
                        except Exception,e:
                            return JsonResponse({'msg':str(e),"code":500,'data':[]})
                    #配置rsync同步文件到本地目录
                    result = base.rsync(sourceDir=project.project_repo_dir, destDir=trueDir,exclude=exclude)
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Rsync {sDir} to {dDir} exclude {exclude}".format(sDir=project.project_repo_dir,dDir=trueDir,exclude=exclude))  
                    if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]})                         
            #授权文件
            result = base.chown(user=project.project_user, path=trueDir)
            DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Chown {user} to {path}".format(user=project.project_user,path=trueDir)) 
            if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]})        
            #调用ansible同步代码到远程服务器上           
            resource = []
            hostList = []
            for ds in serverList:
                server = Server_Assets.objects.get(ip=ds.server) 
                hostList.append(ds.server)
                data = dict()
                if server.keyfile == 1:
                    data['port'] = int(server.port)
                    data["hostname"] = server.ip
                else:
                    data["hostname"] = server.ip
                    data["port"] = int(server.port)
                    data["username"] = server.username
                    data["password"] = server.passwd
                resource.append(data)            
            if resource and hostList:
                if exclude:args = '''src={srcDir} dest={desDir} links=yes recursive=yes compress=yes delete=yes rsync_opts="{exclude}"'''.format(srcDir=softdir, desDir=ds.dir,exclude=exclude)
                else:args = '''src={srcDir} dest={desDir} links=yes recursive=yes compress=yes delete=yes'''.format(srcDir=softdir, desDir=ds.dir)
                ANS = ANSRunner(resource)
                ANS.run_model(host_list=hostList,module_name='synchronize',module_args=args)
                #精简返回的结果
                dataList = ANS.handle_model_data(ANS.get_model_result() , 'synchronize', module_args=args)
                for ds in  dataList:
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Rsync project to {host} status: {status} msg: {msg}".format(host=ds.get('ip'),
                                                                                                                                  status=ds.get('status'),
                                                                                                                                  msg=ds.get('msg')))
                    if ds.get('status') == 'failed':result = (1,ds.get('ip')+ds.get('msg'))
            #目标服务器执行后续命令
            if project.project_remote_command:
                ANS.run_model(host_list=hostList,module_name='raw',module_args=project.project_remote_command)
                #精简返回的结果
                dataList = ANS.handle_model_data(ANS.get_model_result() , 'raw', module_args=project.project_remote_command) 
                for ds in dataList:
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Execute command to {host} status: {status} msg: {msg}".format(host=ds.get('ip'),
                                                                                                                                  status=ds.get('status'),
                                                                                                                                  msg=ds.get('msg')))
                    if ds.get('status') == 'failed':result = (1,"部署错误: " +ds.get('msg'))                           
            if result[0] > 0:
                DsRedis.OpsProject.delete(redisKey=project.project_uuid+"-locked")
                return JsonResponse({'msg':result[1],"code":500,'data':[]}) 
            DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Done] Deploy Success.")
            #切换版本之后取消项目部署锁
            DsRedis.OpsProject.delete(redisKey=project.project_uuid+"-locked") 
            #异步记入操作日志
            if request.POST.get('project_version'):bName = request.POST.get('project_version') 
            recordProject.delay(project_user=str(request.user),project_id=project.id,
                                project_name=project.project_name,project_content="部署项目",
                                project_branch=bName)          
            return JsonResponse({'msg':"项目部署成功","code":200,'data':tmpServer}) 
        else:
            return JsonResponse({'msg':"项目部署失败:{user}正在部署改项目,请稍后再提交部署。".format(user=DsRedis.OpsProject.get(redisKey=project.project_uuid+"-locked")),"code":500,'data':[]}) 
Exemplo n.º 2
0
     verName = request.POST.get('project_branch')
     trueDir = project.project_dir + project.project_env + '/' + request.POST.get(
         'project_branch') + '/'
     DsRedis.OpsDeploy.lpush(
         project.project_uuid,
         data="[PULL] Start Rollback tag:%s" %
         request.POST.get('project_branch'))
 #创建版本目录
 base.mkdir(dirPath=trueDir)
 DsRedis.OpsDeploy.lpush(
     project.project_uuid,
     data="[PULL] Mkdir version dir: {dir} ".format(
         dir=trueDir))
 #创建快捷方式
 softdir = project.project_dir + project.project_name + '/'
 result = base.lns(spath=trueDir, dpath=softdir.rstrip('/'))
 DsRedis.OpsDeploy.lpush(
     project.project_uuid,
     data=
     "[PULL] Make softlink cmd:  ln -s  {sdir} {ddir} info: {info}"
     .format(sdir=trueDir, ddir=softdir, info=result[1]))
 if result[0] > 0:
     return JsonResponse({
         'msg': result[1],
         "code": 500,
         'data': []
     })
 #获取要排除的文件
 exclude = None
 if project.project_exclude:
     try:
Exemplo n.º 3
0
def deploy_run(request,pid): 
    try:
        project = Project_Config.objects.get(id=pid)
        serverList = Project_Number.objects.filter(project=project)
        if project.project_repertory == 'git':version = GitTools()
        elif project.project_repertory == 'svn':version = SvnTools()
    except:
        return render_to_response('deploy/deploy_run.html',{"user":request.user,
                                                         "errorInfo":"项目不存在,可能已经被删除."}, 
                                  context_instance=RequestContext(request))     
    if request.method == "GET":
        if project.project_model == 'branch':bList = version.branch(path=project.project_repo_dir) 
        elif project.project_model == 'tag':bList = version.tag(path=project.project_repo_dir) 
        #获取最新版本
        version.pull(path=project.project_repo_dir)        
        vList = version.log(path=project.project_repo_dir, number=50)
        return render_to_response('deploy/deploy_run.html',{"user":request.user,
                                                         "project":project,"serverList":serverList,
                                                         "bList":bList,"vList":vList}, 
                                  context_instance=RequestContext(request)) 
        
    elif request.method == "POST":
        if request.POST.getlist('project_server',None):
            serverList = [ Project_Number.objects.get(project=project,server=ds) for ds in request.POST.getlist('project_server') ]
            allServerList = [ ds.server  for ds in Project_Number.objects.filter(project=project) ]
            #获取项目目标服务器列表与分批部署服务器(post提交)列表的差集
            tmpServer = [ i for i in allServerList if i not in request.POST.getlist('project_server') ]
        else:return JsonResponse({'msg':"项目部署失败:未选择目标服务器","code":500,'data':[]}) 
        if DsRedis.OpsProject.get(redisKey=project.project_uuid+"-locked") is None:#判断该项目是否有人在部署
            #给项目部署加上锁
            DsRedis.OpsProject.set(redisKey=project.project_uuid+"-locked",value=request.user)
            DsRedis.OpsDeploy.delete(project.project_uuid)  
            if request.POST.get('project_mode',None) == "rollback":
                if project.project_model == 'branch':
                    trueDir = project.project_dir+project.project_env+'/'+ request.POST.get('project_version')  + '/'
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Start] Start Rollback branch:%s  vesion: %s" % (request.POST.get('project_branch'),request.POST.get('project_version')))
                elif  project.project_model == 'tag':
                    trueDir = project.project_dir+project.project_env+'/'+ request.POST.get('project_branch') + '/'
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Start] Start Rollback tag:%s" % request.POST.get('project_branch'))
            else:
                #判断版本上线类型再切换分支到指定的分支/Tag
                if project.project_model == 'branch':
                    bName = request.POST.get('project_branch')
                    result = version.checkOut(path=project.project_repo_dir, name=bName)
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Start] Switched to branch %s" % bName)
                    #reset到指定版本
                    result = version.reset(path=project.project_repo_dir, commintId=request.POST.get('project_version'))
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Git reset to {comid} info: {info}".format(comid=request.POST.get('project_version'),info=result[1])) 
                    trueDir = project.project_dir+project.project_env+'/'+ request.POST.get('project_version')  + '/'
                elif project.project_model == 'tag':
                    bName = request.POST.get('project_branch')
                    result = version.checkOut(path=project.project_repo_dir, name=bName)
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Start] Switched to tag %s" % bName)
                    trueDir = project.project_dir+project.project_env+'/'+ bName + '/'
                #创建版本目录
                base.mkdir(dirPath=trueDir)
                DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Mkdir version dir: {dir} ".format(dir=trueDir))
                #创建快捷方式
                softdir = project.project_dir+project.project_name+'/'
                result = base.lns(spath=trueDir, dpath=softdir.rstrip('/'))
                DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Make softlink cmd:  ln -s  {sdir} {ddir} info: {info}".format(sdir=trueDir,ddir=softdir,info=result[1]))
                if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]})                   
                #执行部署命令  - 编译型语言      
                if project.project_local_command:
                    result =  base.cmds(cmds=project.project_local_command) 
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Execute local command: {cmds} info: {info}".format(cmds=project.project_local_command,info=result[1])) 
                    if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]})  
                #非编译型语言
                else:               
                    #获取要排除的文件 
                    exclude = None
                    if project.project_exclude:
                        try:
                            exclude = ''
                            for s in project.project_exclude.split(','):
                                exclude =  '--exclude "{file}"'.format(file=s.replace('\r\n','').replace('\n','').strip()) + ' ' + exclude
                        except Exception,e:
                            return JsonResponse({'msg':str(e),"code":500,'data':[]})
                    #配置rsync同步文件到本地目录
                    result = base.rsync(sourceDir=project.project_repo_dir, destDir=trueDir,exclude=exclude)
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Rsync {sDir} to {dDir} exclude {exclude}".format(sDir=project.project_repo_dir,dDir=trueDir,exclude=exclude))  
                    if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]})                         
            #授权文件
            result = base.chown(user=project.project_user, path=trueDir)
            DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Chown {user} to {path}".format(user=project.project_user,path=trueDir)) 
            if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]})        
            #调用ansible同步代码到远程服务器上           
            resource = []
            hostList = []
            for ds in serverList:
                server = Server_Assets.objects.get(ip=ds.server) 
                hostList.append(ds.server)
                data = dict()
                if server.keyfile == 1:
                    data['port'] = int(server.port)
                    data["hostname"] = server.ip
                else:
                    data["hostname"] = server.ip
                    data["port"] = int(server.port)
                    data["username"] = server.username
                    data["password"] = server.passwd
                resource.append(data)            
            if resource and hostList:
                if exclude:args = '''src={srcDir} dest={desDir} links=yes recursive=yes compress=yes delete=yes rsync_opts="{exclude}"'''.format(srcDir=softdir, desDir=ds.dir,exclude=exclude)
                else:args = '''src={srcDir} dest={desDir} links=yes recursive=yes compress=yes delete=yes'''.format(srcDir=softdir, desDir=ds.dir)
                ANS = ANSRunner(resource)
                ANS.run_model(host_list=hostList,module_name='synchronize',module_args=args)
                #精简返回的结果
                dataList = ANS.handle_model_data(ANS.get_model_result() , 'synchronize', module_args=args)
                for ds in  dataList:
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Rsync project to {host} status: {status} msg: {msg}".format(host=ds.get('ip'),
                                                                                                                                  status=ds.get('status'),
                                                                                                                                  msg=ds.get('msg')))
                    if ds.get('status') == 'failed':result = (1,ds.get('ip')+ds.get('msg'))
            #目标服务器执行后续命令
            if project.project_remote_command:
                ANS.run_model(host_list=hostList,module_name='raw',module_args=project.project_remote_command)
                #精简返回的结果
                dataList = ANS.handle_model_data(ANS.get_model_result() , 'raw', module_args=project.project_remote_command) 
                for ds in dataList:
                    DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Running] Execute command to {host} status: {status} msg: {msg}".format(host=ds.get('ip'),
                                                                                                                                  status=ds.get('status'),
                                                                                                                                  msg=ds.get('msg')))
                    if ds.get('status') == 'failed':result = (1,"部署错误: " +ds.get('msg'))                           
            if result[0] > 0:
                DsRedis.OpsProject.delete(redisKey=project.project_uuid+"-locked")
                return JsonResponse({'msg':result[1],"code":500,'data':[]}) 
            DsRedis.OpsDeploy.lpush(project.project_uuid, data="[Done] Deploy Success.")
            #切换版本之后取消项目部署锁
            DsRedis.OpsProject.delete(redisKey=project.project_uuid+"-locked") 
            #异步记入操作日志
            if request.POST.get('project_version'):bName = request.POST.get('project_version') 
            recordProject.delay(project_user=str(request.user),project_id=project.id,
                                project_name=project.project_name,project_content="部署项目",
                                project_branch=bName)          
            return JsonResponse({'msg':"项目部署成功","code":200,'data':tmpServer}) 
        else:
            return JsonResponse({'msg':"项目部署失败:{user}正在部署改项目,请稍后再提交部署。".format(user=DsRedis.OpsProject.get(redisKey=project.project_uuid+"-locked")),"code":500,'data':[]}) 
Exemplo n.º 4
0
 if request.POST.get('project_model',None) == "rollback":
     project_content = "回滚项目"
     if project.project_model == 'branch':
         verName = request.POST.get('project_version') 
         trueDir = project.project_dir+project.project_env+'/'+ request.POST.get('project_version')  + '/'
         DsRedis.OpsDeploy.lpush(project.project_uuid, data="[PULL] Start Rollback branch:%s  vesion: %s" % (request.POST.get('project_branch'),request.POST.get('project_version')))
     elif  project.project_model == 'tag':
         verName = request.POST.get('project_branch') 
         trueDir = project.project_dir+project.project_env+'/'+ request.POST.get('project_branch') + '/'
         DsRedis.OpsDeploy.lpush(project.project_uuid, data="[PULL] Start Rollback tag:%s" % request.POST.get('project_branch'))
     #创建版本目录
     base.mkdir(dirPath=trueDir)
     DsRedis.OpsDeploy.lpush(project.project_uuid, data="[PULL] Mkdir version dir: {dir} ".format(dir=trueDir))
     #创建快捷方式
     softdir = project.project_dir+project.project_name+'/'
     result = base.lns(spath=trueDir, dpath=softdir.rstrip('/'))
     DsRedis.OpsDeploy.lpush(project.project_uuid, data="[PULL] Make softlink cmd:  ln -s  {sdir} {ddir} info: {info}".format(sdir=trueDir,ddir=softdir,info=result[1]))
     if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]})    
     #获取要排除的文件 
     exclude = None
     if project.project_exclude:
         try:
             exclude = ''
             for s in project.project_exclude.split(','):
                 exclude =  "--exclude='{file}'".format(file=s.replace('\r\n','').replace('\n','').strip()) + ' ' + exclude
         except Exception,e:
             return JsonResponse({'msg':str(e),"code":500,'data':[]})                                 
 else:
     DsRedis.OpsDeploy.lpush(project.project_uuid, data="[PULL start get code on server]") 
     project_content = "部署项目"
     #判断版本上线类型再切换分支到指定的分支/Tag
Exemplo n.º 5
0
def deploy_run(request, pid):
    try:
        project = Project_Config.objects.get(id=pid)
        if project.project_repertory == 'git': version = GitTools()
        elif project.project_repertory == 'svn': version = SvnTools()
    except Exception as ex:
        logger.error(msg="项目部署失败: {ex}".format(ex=ex))
        return render(
            request,
            'deploy/deploy_run.html',
            {
                "user": request.user,
                "errorInfo": "项目部署失败: {ex}".format(ex=ex)
            },
        )
    if request.method == "GET":
        if project.project_env == 'prod':
            return render(
                request,
                'deploy/deploy_run.html',
                {
                    "user": request.user,
                    "project": project,
                    "errorInfo": "正式环境代码部署,请走工单审批流程"
                },
            )
        #获取最新版本
        return render(request, 'deploy/deploy_run.html', {
            "user": request.user,
            "project": project
        })

    elif request.method == "POST":

        try:
            jenkins_client = JenkinsTools(
                host=project.jenkins.jenkins_host,
                username=project.jenkins.jenkins_user,
                password=project.jenkins.jenkins_token)
            k8s_client = K8sTools(api_host=str(project.k8s.k8s_host),
                                  token=str(project.k8s.k8s_token),
                                  namespace=str(
                                      project.project.project_english_name))
        except Exception as ex:
            logger.error(msg="项目部署失败: {ex}".format(ex=ex))
            return JsonResponse({'msg': str(ex), "code": 500, 'data': []})

        if DsRedis.OpsProject.get(redisKey=project.project_uuid +
                                  "-locked") is None:  #判断该项目是否有人在部署
            #给项目部署加上锁

            DsRedis.OpsProject.set(redisKey=project.project_uuid + "-locked",
                                   value=request.user)
            DsRedis.OpsDeploy.delete(project.project_uuid)
            if request.POST.get('project_model', None) == "rollback":
                project_content = "回滚项目"
                if project.project_model == 'branch':
                    verName = request.POST.get('project_version')
                    trueDir = project.project_dir + project.project_env + '/' + request.POST.get(
                        'project_version') + '/'
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="[PULL] Start Rollback branch:%s  vesion: %s" %
                        (request.POST.get('project_branch'),
                         request.POST.get('project_version')))
                elif project.project_model == 'tag':
                    verName = request.POST.get('project_branch')
                    trueDir = project.project_dir + project.project_env + '/' + request.POST.get(
                        'project_branch') + '/'
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="[PULL] Start Rollback tag:%s" %
                        request.POST.get('project_branch'))
                #创建版本目录
                base.mkdir(dirPath=trueDir)
                DsRedis.OpsDeploy.lpush(
                    project.project_uuid,
                    data="[PULL] Mkdir version dir: {dir} ".format(
                        dir=trueDir))
                #创建快捷方式
                softdir = project.project_dir + project.project_name + '/'
                result = base.lns(spath=trueDir, dpath=softdir.rstrip('/'))
                DsRedis.OpsDeploy.lpush(
                    project.project_uuid,
                    data=
                    "[PULL] Make softlink cmd:  ln -s  {sdir} {ddir} info: {info}"
                    .format(sdir=trueDir, ddir=softdir, info=result[1]))
                if result[0] > 0:
                    return JsonResponse({
                        'msg': result[1],
                        "code": 500,
                        'data': []
                    })
                #获取要排除的文件
                exclude = None
                if project.project_exclude:
                    try:
                        exclude = ''
                        for s in project.project_exclude.split(','):
                            exclude = "--exclude='{file}'".format(
                                file=s.replace('\r\n', '').replace(
                                    '\n', '').strip()) + ' ' + exclude
                    except Exception as e:
                        return JsonResponse({
                            'msg': str(e),
                            "code": 500,
                            'data': []
                        })
            else:
                DsRedis.OpsDeploy.lpush(
                    project.project_uuid,
                    data=
                    "[Application Initialization of project parameters ...... ]"
                )
                #判断版本上线类型再切换分支到指定的分支/Tag

                project_name = str(
                    project.project.project_english_name.strip())
                service_name = str(project.service.service_name.strip())
                project_env = str(project.project_env)
                deployment_name = str(service_name + "-" + project_env)
                project_full_name = project_name + '-' + service_name + "-" + project_env
                repo_user = project.project_repo_user
                repo_passwd = project.project_repo_passwd
                repo_branch = project.project_branch
                repo_host = project.project_address
                build_type = str(project.service.service_type)
                mount_path = str(
                    project.project_mount_path
                ) if project.project_mount_path.strip() else None
                base_image = settings.DOCKER_IMAGE[
                    "jdk"] if build_type == "jar" else settings.DOCKER_IMAGE[
                        "tomcat"]
                registry = settings.DOCKER_REGISTRY[
                    "test"] if project_env == "test" else settings.DOCKER_REGISTRY[
                        "prod"]
                service_ip = settings.PROJECT_SERVICE_IP[
                    "test"] if project_env == "test" else settings.PROJECT_SERVICE_IP[
                        "prod"]
                image = str(registry + '/' + project_name + "-" +
                            service_name + ":" + str(int(time.time())))
                project_env_var = str(project.project_env_var.strip())

                if project_env_var:
                    try:
                        project_env_var = json.loads(project_env_var)
                    except Exception as ex:
                        DsRedis.OpsProject.delete(
                            redisKey=project.project_uuid + "-locked")
                        return JsonResponse({
                            'msg': "容器环境变量不是字典类型 " + str(ex),
                            "code": 500,
                            'data': []
                        })
                else:
                    project_env_var = None

                try:
                    jenkins_client.create_credential(
                        username=str(repo_user),
                        password=str(repo_passwd),
                        c_id=str(project_full_name))
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="[Jenkins start create credential %s" %
                        project_full_name)
                    time.sleep(1)
                except Exception as ex:
                    DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                              "-locked")
                    return JsonResponse({
                        'msg':
                        "jenkins create Credentials fail " + str(ex),
                        "code":
                        500,
                        'data': []
                    })

                # 创建和更新jenkins job
                try:
                    cmd = "jhhTool --project={project} --service={service} --env={env} --k8s={k8s}" \
                          " --ding={ding} --type={type} --user={user} --url={url} --baseImage={base_image} " \
                          " --image={image} --registry={registry}".format(project=project_name,
                                                                          service=service_name,
                                                                          env=project_env,
                                                                          k8s="False",
                                                                          ding="False",
                                                                          type=project.service.service_type,
                                                                          user=request.user,
                                                                          url="False",
                                                                          base_image=base_image,
                                                                          image=image,
                                                                          registry=registry)
                    result = jenkins_client.create_job(str(project_full_name),
                                                       str(repo_branch),
                                                       str(project_full_name),
                                                       str(repo_host),
                                                       str(cmd))
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="Jenkins start create jobs {job} info: {info}".
                        format(job=project_full_name, info=result))
                except Exception as ex:
                    DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                              "-locked")
                    return JsonResponse({
                        'msg': "jenkins创建job失败" + str(ex),
                        "code": 500,
                        'data': []
                    })

                # 获取jenkins的下一次构建number号
                try:
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="Jenkins get build job next number...... ")
                    build_number = str(
                        jenkins_client.get_next_build_number(
                            project_full_name))
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="Jenkins build job {name} info: job number{info}".
                        format(name=project_full_name, info=str(build_number)))
                except Exception as ex:
                    DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                              "-locked")
                    return JsonResponse({
                        'msg':
                        "jenkins获取项目构建number失败" + str(ex),
                        "code":
                        500,
                        'data': []
                    })

                # 触发jenkins构建
                try:
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="Jenkins start build job ...... ")
                    result = jenkins_client.build_job(project_full_name)
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="Jenkins start build job {name} info: {info}".
                        format(name=project_full_name, info=result))
                    time.sleep(2)
                except Exception as ex:
                    DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                              "-locked")
                    return JsonResponse({
                        'msg': "jenkins触发job构建失败" + str(ex),
                        "code": 500,
                        'data': []
                    })

                # 判断jenkins构建是否运行完毕
                try:
                    building = True
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="Jenkins job {name} building, wait a minute...... "
                        .format(name=project_full_name))
                    while building:
                        build_status = jenkins_client.is_building(
                            project_full_name, int(build_number))
                        if build_status:
                            time.sleep(2)
                        else:
                            building = False
                except Exception as ex:
                    DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                              "-locked")
                    return JsonResponse({
                        'msg': "jenkins获取构建状态失败" + str(ex),
                        "code": 500,
                        'data': []
                    })

                # 判断jenkins构建是否成功
                try:
                    jenkins_job_build_result = jenkins_client.get_build_result(
                        project_full_name, int(build_number))
                    if jenkins_job_build_result != "SUCCESS":
                        return JsonResponse({
                            'msg': "jenkins构建job失败",
                            "code": 500,
                            'data': []
                        })
                except Exception as ex:
                    DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                              "-locked")
                    return JsonResponse({
                        'msg': "jenkins构建job失败" + str(ex),
                        "code": 500,
                        'data': []
                    })

                # 输出jenkins构建信息
                try:
                    jenkins_job_output = jenkins_client.get_build_output(
                        project_full_name, int(build_number))
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="Jenkins job info {info} ".format(
                            info=jenkins_job_output))
                except Exception as ex:
                    DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                              "-locked")
                    return JsonResponse({
                        'msg': "jenkins构建job信息输出失败" + str(ex),
                        "code": 500,
                        'data': []
                    })

                # 配置kubernetes相关参数
                try:
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="[Kubernetes start create namespace ...... ]")
                    result = k8s_client.create_namespace(project_name)
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data=
                        "Kubernetes start k8s create namespace {namespace} info: {info}"
                        .format(namespace=project_name, info=result))
                    time.sleep(1)
                except Exception as ex:
                    DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                              "-locked")
                    return JsonResponse({
                        'msg': "kubernetes 创建命名空间失败" + str(ex),
                        "code": 500,
                        'data': []
                    })

                try:
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="Kubernetes start create deployment ......")
                    k8s_client.create_deployment(name=deployment_name,
                                                 image=image,
                                                 env=project_env,
                                                 type=build_type,
                                                 env_dict=project_env_var,
                                                 mount_path=mount_path)
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data=
                        "Kubernetes start create deployment {name} info: {info}"
                        .format(name=deployment_name, info='POD创建成功'))
                except Exception as ex:
                    DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                              "-locked")
                    return JsonResponse({
                        'msg': "kubernetes创建POD失败" + str(ex),
                        "code": 500,
                        'data': []
                    })

                try:
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data="[Kubernetes start create service ...... ]")
                    service_port = str(
                        project.project_service_port
                    ) if project.project_service_port.strip() else None
                    debug_port = str(
                        project.project_debug_port
                    ) if project.project_debug_port.strip() else None
                    result = k8s_client.create_service(deployment_name,
                                                       service_port,
                                                       debug_port)
                    DsRedis.OpsDeploy.lpush(
                        project.project_uuid,
                        data=
                        "Kubernetes start create service svc-{name} info: {info}"
                        .format(name=deployment_name, info=result))
                except Exception as ex:
                    DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                              "-locked")
                    return JsonResponse({
                        'msg':
                        "kubernetes创建service失败" + str(ex),
                        "code":
                        500,
                        'data': []
                    })

            DsRedis.OpsDeploy.lpush(
                project.project_uuid,
                data="[Done] {name} Deploy Success.".format(
                    name=project.service.service_name))
            #切换版本之后取消项目部署锁
            DsRedis.OpsProject.delete(redisKey=project.project_uuid +
                                      "-locked")
            #异步记入操作日志

            recordProjectDeploy(user=str(request.user),
                                project_name=project.project.project_name,
                                service_name=project.service.service_name,
                                image_name=image,
                                run_env=str(project.project_env),
                                is_online=1)
            return JsonResponse({
                'msg': "项目部署成功",
                "code": 200,
                'data': project.project.project_name
            })
        else:
            return JsonResponse({
                'msg':
                "项目部署失败:{user}正在部署改项目,请稍后再提交部署。".format(
                    user=DsRedis.OpsProject.get(redisKey=project.project_uuid +
                                                "-locked")),
                "code":
                500,
                'data': []
            })