def deploy_manage(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: return render( request, 'deploy/deploy_manage.html', { "user": request.user, "errorInfo": "项目不存在,可能已经被删除." }, ) if request.method == "GET": #获取最新版本 version.pull(path=project.project_repo_dir) 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) vList = version.log(path=project.project_repo_dir, number=50) return render( request, 'deploy/deploy_manage.html', { "user": request.user, "project": project, "bList": bList, "vList": vList }, )
def deploy_version(request,pid): try: project = Project_Config.objects.select_related().get(id=pid) if project.project_repertory == 'git':version = GitTools() except: return render_to_response('deploy/deploy_version.html',{"user":request.user, "errorInfo":"项目不存在,可能已经被删除."}, context_instance=RequestContext(request)) if request.method == "POST": try: project = Project_Config.objects.get(id=pid) if project.project_repertory == 'git':version = GitTools() elif project.project_repertory == 'svn':version = SvnTools() except: return JsonResponse({'msg':"项目资源不存在","code":403,'data':[]}) if project.project_status == 0:return JsonResponse({'msg':"请先初始化项目","code":403,'data':[]}) if request.POST.get('op') in ['create','delete','query','histroy']: if request.POST.get('op') == 'create': if request.POST.get('model') == 'branch':result = version.createBranch(path=project.project_repo_dir,branchName=request.POST.get('name')) elif request.POST.get('model') == 'tag':result = version.createTag(path=project.project_repo_dir,tagName=request.POST.get('name')) elif request.POST.get('op') == 'delete': if request.POST.get('model') == 'branch':result = version.delBranch(path=project.project_repo_dir,branchName=request.POST.get('name')) elif request.POST.get('model') == 'tag':result = version.delTag(path=project.project_repo_dir,tagName=request.POST.get('name')) elif request.POST.get('op') == 'query': if project.project_model == 'branch': result = version.log(path=project.project_repo_dir,bName=request.POST.get('name'),number=50) return JsonResponse({'msg':"操作成功","code":200,'data':result}) else:result = version.tag(path=project.project_repo_dir) elif request.POST.get('op') == 'histroy': result = version.show(path=project.project_repo_dir,branch=request.POST.get('project_branch'),cid=request.POST.get('project_version',None)) return JsonResponse({'msg':"操作成功","code":200,'data':"<pre> <xmp>" + result[1].replace('<br>','\n') + "</xmp></pre>"}) else:return JsonResponse({'msg':"非法操作","code":500,'data':[]}) if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]}) else:return JsonResponse({'msg':"操作成功","code":200,'data':[]})
def deploy_ask(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: return render( request, 'deploy/deploy_ask.html', { "user": request.user, "errorInfo": "项目不存在,可能已经被删除." }, ) if request.method == "GET": vList = None version.pull(path=project.project_repo_dir) if project.project_model == 'branch': #获取最新版本 bList = version.branch(path=project.project_repo_dir) vList = version.log(path=project.project_repo_dir, number=50) elif project.project_model == 'tag': bList = version.tag(path=project.project_repo_dir) audit_group = Group.objects.get(id=project.project_audit_group) userList = [u.get('username') for u in audit_group.user_set.values()] return render( request, 'deploy/deploy_ask.html', { "user": request.user, "project": project, "userList": userList, "bList": bList, "vList": vList }, ) elif request.method == "POST": try: order = Project_Order.objects.create( order_user=request.user, order_project=project, order_subject=request.POST.get('order_subject'), order_audit=request.POST.get('order_audit'), order_status=request.POST.get('order_status', 2), order_level=request.POST.get('order_level'), order_content=request.POST.get('order_content'), order_branch=request.POST.get('order_branch', None), order_comid=request.POST.get('order_comid', None), order_tag=request.POST.get('order_tag', None)) sendDeployEmail.delay(order_id=order.id, mask='【申请中】') except Exception, e: return render( request, 'deploy/deploy_ask.html', { "user": request.user, "errorInfo": "项目部署申请失败:%s" % str(e) }, ) return HttpResponseRedirect('/deploy_ask/{id}/'.format(id=pid))
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 Exception ,ex: logger.error(msg="项目部署失败: {ex}".format(ex=ex)) return render(request,'deploy/deploy_run.html',{"user":request.user, "errorInfo":"项目部署失败: {ex}".format(ex=ex)}, )
def deploy_init(request,pid): if request.method == "POST": project = Project_Config.objects.select_related().get(id=pid) if project.project_repertory == 'git':version = GitTools() elif project.project_repertory == 'svn':version = SvnTools() version.mkdir(dir=project.project_repo_dir) version.mkdir(dir=project.project_dir) result = version.clone(url=project.project_address, dir=project.project_repo_dir, user=project.project_repo_user, passwd=project.project_repo_passwd) if result[0] > 0:return JsonResponse({'msg':result[1],"code":500,'data':[]}) else: Project_Config.objects.filter(id=pid).update(project_status = 1) recordProject.delay(project_user=str(request.user),project_id=project.id,project_name=project.project_name,project_content="初始化项目") return JsonResponse({'msg':"初始化成功","code":200,'data':[]})
def deploy_apply(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: return render(request,'orders/deploy_apply.html',{"user":request.user, "errorInfo":"项目不存在,可能已经被删除."}, ) if request.method == "GET": vList = None version.pull(path=project.project_repo_dir) if project.project_model == 'branch' or project.project_repertory == 'svn': #获取最新版本 bList = version.branch(path=project.project_repo_dir) vList = version.log(path=project.project_repo_dir, number=50) elif project.project_model == "tag": bList = version.tag(path=project.project_repo_dir) audit_group = Group.objects.get(id=project.project_audit_group) userList = [ u for u in audit_group.user_set.values()] return render(request,'orders/deploy_apply.html',{"user":request.user,"project":project, "userList":userList,"bList":bList,"vList":vList}, ) elif request.method == "POST": try: order = Order_System.objects.create( order_user = request.user.id, order_subject = request.POST.get('order_subject'), order_executor = request.POST.get('order_audit'), order_status = request.POST.get('order_status',2), order_level = request.POST.get('order_level'), order_type = 1, ) except Exception,ex: logger.error(msg="项目部署申请失败: {ex}".format(ex=str(ex))) return render(request,'orders/deploy_apply.html',{"user":request.user,"errorInfo":"项目部署申请失败:%s" % str(ex)},) try: Project_Order.objects.create( order = order, order_project = project, order_content = request.POST.get('order_content'), order_branch = request.POST.get('order_branch',None), order_comid = request.POST.get('order_comid',None), order_tag = request.POST.get('order_tag',None) ) except Exception,ex: logger.error(msg="项目部署申请失败: {ex}".format(ex=str(ex))) return render(request,'orders/deploy_apply.html',{"user":request.user,"errorInfo":"项目部署申请失败:%s" % str(ex)},)
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':[]})
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': [] })