def deployment_update(): db_token = db_op.platform_token params = request.json new_replicas = None msg = "image build fail!" try: if params: if 'project' in params and 'version' in params and 'access_token' in params: token = params['access_token'] project = params['project'] version = params['version'] new_image = "%s/%s:%s" %(docke_registry,project.split('.')[0],version) if 'replicas' in params: new_replicas = params['replicas'] # 验证token是否有效 vals = db_token.query.filter(and_(db_token.token == token, db_token.expire > time.strftime('%Y-%m-%d', time.localtime()))).all() if vals: redis_key = 'op_k8s_update_%s' %time.strftime('%Y%m%d%H%M%S', time.localtime()) Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem(k8s_resource.object_update, [new_image, new_replicas,version,redis_key]) Scheduler.start() msg = "http://op.moji.com/deploy_query/%s" %redis_key else: msg = 'token deny!' else: msg = 'url params error!' else: msg = 'url params null!' except Exception as e: msg = e finally: return jsonify({'result': msg})
def update_java(): produce.Async_log(g.user, request.url) K = '%s_%s' %(g.user,g.secret_key) messageKey = '%s_update_java' % K taskKey = 'update_java' form = MyForm.MyForm_updateJboss() if form.submit.data: try: if form.text.data: tags = form.text.data.strip().splitlines() assert len(tags)==1,'Can only execute a project at a time!' project = form.text.data.strip() warname = project.split('-')[0] Action = form.selectAction.data Gray = form.Gray.data Type = 1 dbTable = db_op.java_list #灰度发布 if Gray: ServerList = dbTable.query.with_entities(dbTable.ip, dbTable.user).filter(db_op.DB.and_(dbTable.project == warname, dbTable.type == Type,dbTable.Gray == '1')).limit(1).all() if not ServerList: ServerList = dbTable.query.with_entities(dbTable.ip, dbTable.user).filter(db_op.DB.and_(dbTable.project == warname, dbTable.type == Type)).limit(1).all() loging.write(ServerList[:]) if ServerList: for ip, username in ServerList: dbTable.query.filter(db_op.DB.and_(dbTable.ip == ip, dbTable.user == username)).update({dbTable.Gray:'1'}) else: flash('%s Not found' % warname) return render_template('Message.html') else: ServerList = dbTable.query.with_entities(dbTable.ip,dbTable.user).filter(db_op.DB.and_(dbTable.project == warname,dbTable.type == Type)).all() if ServerList: information = {} information['warname'] = warname information['project'] = project information['ServerList'] = ServerList information['Action'] = Action information['key'] = messageKey information['Gray'] = Gray myRedis.delete(messageKey) myRedis.lpush(taskKey,information) mysql_operation = Mysql.mysql_op(g.user,Action,Type,project,Gray) mysql_operation.op_operation() Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem(Scheduler.job_update_java) Scheduler.start() else: flash('%s Not found' % warname) return render_template('Message.html') except Exception as e: flash(e) return render_template('Message.html') return render_template('java_update_show.html') return render_template('java_update.html',form=form)
def publish(): produce.Async_log(g.user, request.url) importlib.reload(MyForm) secret_key= tools.Produce(length=8, chars=string.digits) session['secret_key'] = secret_key K = '%s_%s' %(g.user,secret_key) Msg_Key = '%s_publish_msg' %K form = MyForm.MyForm_publish() if form.submit.data: try: if Redis.exists(Msg_Key): raise flash('上线操作过于频繁,请稍等%s秒......' %Redis.ttl(Msg_Key)) package_url = form.package_url.data describe = form.describe.data package_md5 = form.package_md5.data package_type = form.package_type.data publish_type = form.publish_type.data check_url = form.check_url.data restart = form.restart.data execute = form.execute.data rb_project = form.project.data rb_version = form.version.data gray = form.gray.data if execute == 'rollback': if not rb_project and not rb_version: raise logging.error("choice can not be empty!") if execute == 'publish': if not package_url or not package_md5 or not check_url or not describe: raise logging.error("input can not be empty!") Package_name = package_url.split('/')[-1] package_name = Package_name.replace('.zip', '') rb_project = '-'.join(package_name.split('-')[:-1]) INFOS = {'package_url': package_url, 'package_md5': package_md5, 'package_type': package_type, 'publish_type': publish_type,'user':g.user,'describe':describe.replace('"','').replace("'",''),'gray':int(gray), 'restart': restart, 'execute': execute, 'check_url': check_url.replace('https','http'), 'project': rb_project, 'version': rb_version,'channel':'web','callback_url':'None','token':'None','timestamp' :int(time.time())} #启动代码分发控制中心 Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem(task_publish.Publish_center,[INFOS,Msg_Key,K]) Scheduler.start() return render_template('publish_show.html') except Exception as e: if 'old-style' not in str(e): logging.error(e) return render_template('publish.html',form=form)
def update_php(): produce.Async_log(g.user, request.url) K = '%s_%s' % (g.user, g.secret_key) Key = '%s_update_php' % K publish_key = '%s_update_key' % K form = MyForm.MyForm_php() if form.submit.data: try: if Redis.exists(Key): raise flash('项目上线操作正在执行,不能并行上线操作.请稍候......') Redis.lpush(Key, 'check env......') tm = time.strftime('%Y%m%d%H%M%S', time.localtime()) Key_file_list = 'file_list_%s' % tm if form.text.data: List = form.text.data.strip().splitlines() Action = form.selectaction.data Gray = form.Gray.data else: return redirect(url_for('update_php.update_php')) lines = [line.strip() for line in List] lines = str(lines) Redis.set(Key_file_list, lines) Redis.expire(Key_file_list, 1800) Info = {} Type = 1 Info['arg'] = Type Info['action'] = Action Info['Key_file_lis'] = Key_file_list Info['gray'] = Gray Redis.rpush(publish_key, str(Info)) Redis.lpush(Key, ' --->check env pass!') Redis.lpush(Key, '-' * 80 + '\n') mysql_operation = Mysql.mysql_op(g.user, Action, Type, lines, Gray) mysql_operation.op_operation() Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem(php_update.php_update, publish_key, Key) Scheduler.start() except Exception as e: Redis.lpush(Key, e) return render_template('php_update_show.html') return render_template('php_update.html', form=form)
def image_update(): try: produce.Async_log(g.user, request.url) reload(MyForm) form = MyForm.Form_k8s_update() if form.submit.data: deployment = form.deployment.data version = form.version.data if version: new_image = "%s/%s:%s" % (docker_registry, deployment, version) new_replicas = form.replicas.data redis_key = 'op_k8s_update_%s' % time.strftime( '%Y%m%d%H%M%S', time.localtime()) session['redis_key'] = redis_key Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem( k8s_resource.object_update, [new_image, new_replicas, version, redis_key]) Scheduler.start() return render_template('deploy_show.html') except Exception as e: logging.error(e) return render_template('k8s_update.html', form=form)
def publish_code(): try: timestamp = None db_token = db_op.platform_token params = request.json GRAY = {'Flase': 0, 'True': 1} # 检查时间戳是否存在 if 'timestamp' in params['data']: timestamp = params['data']['timestamp'] else: return jsonify({'status': 'timestamp is null', 'timestamp': None}) #md5对比验证数据 new_md5 = Md5.Md5_make(params['data']) if new_md5 == params['data_md5']: params = params['data'] token = params['access_token'] #验证token是否有效 vals = db_token.query.filter( and_( db_token.token == token, db_token.expire > time.strftime( '%Y-%m-%d', time.localtime()))).all() if vals: user = params['proposer'] package_url = params['package_url'] #检查压缩包下载地址格式 if not package_url.endswith( '.zip') and not package_url.endswith('.war'): return jsonify({ 'status': 'the package must be zip or war', 'timestamp': timestamp }) #获取详细参数 describe = params['describe'] package_md5 = params['package_md5'] package_type = params['package_type'] publish_type = params['publish_type'] restart = params['restart'] execute = params['execute'] check_url = params['check_url'] rb_project = params['project_name'] rb_version = params['project_version'] callback_url = params['callback_url'] gray = GRAY[params['gray']] #生成随机key种子 K = '%s_%s' % (token, tools.Produce(length=8, chars=string.digits)) Msg_Key = '%s_publish_msg' % K INFOS = { 'package_url': package_url, 'package_md5': package_md5, 'package_type': package_type, 'publish_type': publish_type, 'user': user, 'describe': describe.replace('"', '').replace("'", ''), 'gray': gray, 'restart': restart, 'execute': execute, 'check_url': check_url.replace('https', 'http'), 'project': rb_project, 'version': rb_version, 'channel': 'api', 'callback_url': callback_url, 'token': token, 'timestamp': timestamp } #启动代码分发控制中心 Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem( task_publish.Publish_center, [INFOS, Msg_Key, K]) Scheduler.start() return jsonify({'status': 'ok', 'timestamp': timestamp}) else: return jsonify({ 'status': 'token deny', 'timestamp': timestamp }) else: return jsonify({ 'status': 'data_md5 error', 'timestamp': timestamp }) except Exception as e: logging.error(e) return jsonify({'status': str(e), 'timestamp': timestamp}) finally: db_op.DB.session.remove()
def deployment_create(): produce.Async_log(g.user, request.url) reload(MyForm) form = MyForm.Form_k8s_deploy() if form.submit.data: project = form.projects.data version = form.version.data object = form.object.data container_port = form.container_port.data ingress_port = form.ingress_port.data replicas = form.replicas.data request_cpu = form.request_cpu.data limit_cpu = form.limit_cpu.data request_mem = form.request_mem.data limit_mem = form.limit_mem.data domain = form.domain.data re_requests = {} re_limits = {} try: if object and version and container_port and replicas: if object.endswith('.war') or object.endswith('.jar'): dm_name = object.split('.')[0] image = "%s/%s:%s" % (docker_registry, dm_name, version) docker_file = "%s/%s" % (dockerfile_path, dm_name) if os.path.exists(docker_file): container_port = [ int(port) for port in container_port.split(',') ] if request_cpu and limit_cpu and request_mem and limit_mem: if float(request_cpu) > float(limit_cpu) or float( request_mem) > float(limit_mem): raise flash('限制资源不能小于请求资源!') else: re_requests = { 'cpu': request_cpu, 'memory': '%sG' % request_mem } re_limits = { 'cpu': limit_cpu, 'memory': '%sG' % limit_mem } if ingress_port: if int(ingress_port) not in [ int(port) for port in container_port ]: raise flash('对外服务端口必须是服务端口其中之一!') redis_key = 'op_k8s_create_%s' % time.strftime( '%Y%m%d%H%M%S', time.localtime()) session['redis_key'] = redis_key Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem( k8s_resource.object_deploy, [ project, dm_name, version, image, container_port, ingress_port, replicas, domain, re_requests, re_limits, redis_key ]) Scheduler.start() return render_template('deploy_show.html') else: flash("%s文件路径不存在!" % docker_file) else: flash("%s包名应以.war或者.jar结尾!" % object) else: flash('必填项参数不完整!') return render_template('Message.html') except Exception as e: logging.error(e) return render_template('k8s_deploy.html', form=form)
def publish_php(): produce.Async_log(g.user, request.url) K = '%s_%s' %(g.user,g.secret_key) Key = '%s_publish_php' %K form = MyForm.MyForm_php() qrcode_url = "https://xxx.baihe.com/xxx/{0}/{1}".format(g.user,g.grade) if form.submit.data: try: Redis.lpush(Key, 'check env......') if form.text.data and form.changelog.data: action = form.selectaction.data Type = int(form.selecttype.data) Way = form.selectWay.data if Type == 1: platfrom = '线上' if Type == 2: platfrom = '测外' Tags = form.text.data.strip().splitlines() Gray = form.Gray.data code = form.code.data work = form.selectwork.data grade = form.selectgrade.data changelog = form.changelog.data if Way == 'SVN': if len(Tags) > 1: raise flash('错误:只能同时上线一个项目!') else: for line in Tags: if line.startswith('#') or not line.split(): continue m = re.match(r'[0-9]', line) if m: raise flash('错误:不能以数字开头!') if not line.startswith('/'): raise flash('错误:' + line + '路径必须以"/"开头!') path = line.strip() path = path.replace('\\', '/') App = path.split('/') if len(App)<4: raise flash('错误:路径错误,无法获取项目名!') App = App[3] if len(path.split('-')) >= 2: version = path.split('-')[-1] else: raise flash('错误:项目名称格式错误!') if version.endswith('.zip'): version = version.replace('.zip', '') elif Way == 'GIT': if len(Tags) != 2: raise flash('错误:GIT上线格式不对!') elif not Tags[0].strip().startswith('http://'): raise flash('错误:' + Tags[0] + '路径需以"http://"开头!') elif not Tags[0].strip().endswith('.git'): raise flash('错误:' + Tags[0] + '应该以".git"结尾!') elif 'tag' not in Tags[1]: raise flash('错误:没有tag版本号!') path = ';'.join(Tags) path = path.replace('http://git.baihe.com/', '/') App = Tags[0].strip().split('/')[-1] App = App.split('.')[0] version = Tags[1].split('-')[-1] else: raise flash('错误:文本框内容不能为空!') except Exception as e: pass else: try: #用户权限判断 if g.grade == 2: if code: verify_key = "{0}_{1}".format(g.user,g.grade) verify_code = Redis.get(verify_key) if verify_code == str(code): Redis.lpush(Key, ' --->verify code pass!') Redis.delete(verify_key) code_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) db = db_op.publish_code db_op.DB.session.add(db(project=App, code=str(code), platfrom=platfrom, user=g.user, Time=code_time)) db_op.DB.session.commit() else: flash('上线码验证错误!') return redirect(url_for('publish_php.publish_php')) else: flash('上线码不能为空!') return redirect(url_for('publish_php.publish_php')) Redis.lpush(Key,' --->check env pass!') Redis.lpush(Key,'-'*80+'\n') db = db_op.php_list if Gray: if App == 'baihePhpGlobalLibrary_publish': val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.operation == 'baihe')).limit(1).all() if not val: val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' % Type,db.operation == 'baihe')).limit(1).all() elif App == 'Baihe': val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.operation == 'hunli')).limit(1).all() if not val: val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' % Type,db.operation == 'hunli')).limit(1).all() else: val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.project == '%s' % App)).limit(1).all() if not val: val = db.query.with_entities(db.ip).filter(and_(db.project == '%s' % App, db.type == '%i' % Type)).limit(1).all() if val: sip = [v[0].encode('UTF-8') for v in val if v] db.query.filter(and_(db.project == App, db.ip == sip[0])).update({db.Gray: '1'}) else: raise flash('%s 没有在上线列表中找到!' % App) else: if App == 'baihePhpGlobalLibrary_publish': val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' %Type,db.operation == 'baihe')).all() elif App == 'Baihe': val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' %Type,db.operation == 'hunli')).all() else: val = db.query.with_entities(db.ip).filter(and_(db.project == '%s' %App,db.type == '%i' %Type)).all() if val: val = set(val) sip = [v[0].encode('UTF-8') for v in val if v] else: raise flash('%s 没有在上线列表中找到!' %App) Redis.delete(Key) Info = {} Info['action'] = action Info['key'] = Key Info['path'] = path Info['app'] = App Info['sip'] = sip Info['gray'] = Gray Info['Type'] = Type Info['Way'] = Way Redis.lpush('publish_php',str(Info)) mysql_operation = Mysql.mysql_op(g.user,action,Type,App,version,Gray,work,grade,changelog) mysql_operation.op_operation() Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem(Scheduler.job_publish_php) Scheduler.start() except Exception as e: if 'old' not in str(e): flash(e) Redis.lpush(Key,'End') return render_template('Message.html') return render_template('php_publish_show.html') return render_template('php_publish.html',form=form,qrcode_url = qrcode_url )
def publish_java(): produce.Async_log(g.user, request.url) K = '%s_%s' %(g.user,g.secret_key) messageKey = '%s_publish_java' % K publish_key = '%s_publish_key' % K qrcode_url = None form = MyForm.MyForm_publishJboss() if form.submit.data: Action = form.selectAction.data Type = int(form.selectType.data) Gray = form.Gray.data Way = form.selectWay.data code = form.code.data work = form.selectwork.data changelog = form.changelog.data tags = form.text.data.strip().splitlines() if tags and changelog: try: if myRedis.exists(messageKey): raise flash('上线操作过于频繁,请稍等%s秒......' %myRedis.ttl(messageKey)) assert len(tags) == 1, '错误:只能同时上线一个项目!' warTagName = tags[0] version = '0.0.0' if Action == 'restart': warname = warTagName elif Way == 'SVN': assert '.war.zip' in warTagName, '错误:格式错误!格式应为: baihe-xxxx-x.x.x.war.zip' warname = warTagName.split('-')[:-1] version = warTagName.split('-')[-1].replace('.war.zip','') warname = '-'.join(warname) + '.war' elif Way == 'GIT': warname = "{0}.war".format(warTagName.split('/')[-1]) except Exception as e: flash(e) else: try: project_db = db_op.project_level project_level = project_db.query.with_entities(project_db.level).filter(project_db.project == warname).all() # 测外不强制项目等级 if Type == 2: if project_level: project_level = int(project_level[0][0]) else: project_level = 1 else: if project_level: project_level = int(project_level[0][0]) crypto = Md5.crypto(crypto_key) qrcode_url = "https://op.baihe.com/qrcode_java/{0}/{1}/{2}/{3}".format(crypto.encrypt(g.user),g.grade,crypto.encrypt(warname),project_level) else: raise flash('没有找到该项目的对应项目等级!') publish_time = time.strftime("%H", time.localtime()) if code: verify_key = "{0}_{1}".format(g.user,warname) verify_code = myRedis.get(verify_key) if verify_code == str(code): myRedis.lpush(messageKey, ' --->verify code pass!') myRedis.expire(messageKey,30) myRedis.delete(verify_key) else: raise flash('%s 该上线码验证不通过!' %str(code)) else: # 用户权限及行为判断 tw = int(time.strftime('%w', time.localtime(time.time()))) if g.grade >= 2 and Type == 1 and Action == 'publish': if project_level >= 5: raise flash('该项目等级为%s级,需申请上线码!' % project_level) if tw in (2, 4): if project_level <= 4 and (int(publish_time) >= 17 or int(publish_time) <= 9): raise flash('仅允许在10-17点时间段进行上线操作,需申请上线码!') else: raise flash('4级及以下常规项目只限在周二和周四上线,修复BUG需申请上线码!') if g.grade >= 2 and Action == 'rollback': raise flash('没有权限进行回滚操作!') dbTable = db_op.java_list #灰度发布 if Gray: ServerList = dbTable.query.with_entities(dbTable.ip, dbTable.user).filter(db_op.DB.and_(dbTable.project == warname, dbTable.type == Type,dbTable.Gray == '1')).limit(1).all() if not ServerList: ServerList = dbTable.query.with_entities(dbTable.ip, dbTable.user).filter(db_op.DB.and_(dbTable.project == warname, dbTable.type == Type)).limit(1).all() if ServerList: for ip, username in ServerList: dbTable.query.filter(db_op.DB.and_(dbTable.ip == ip, dbTable.user == username)).update({dbTable.Gray:'1'}) else: raise flash('%s 没有在上线列表中找到!' % warname) else: ServerList = dbTable.query.with_entities(dbTable.ip,dbTable.user).filter(db_op.DB.and_(dbTable.project == warname,dbTable.type == Type)).all() if Type == 1: ServerList.append(('172.16.4.188','java')) if ServerList: myRedis.lpush(messageKey, 'check security policy......') myRedis.expire(messageKey, 30) information = {} information['warname'] = warname information['warTagName'] = warTagName information['ServerList'] = ServerList information['Action'] = Action information['Gray'] = Gray information['Type'] = Type information['Way'] = Way myRedis.lpush(publish_key,information) mysql_operation = Mysql.mysql_op(g.user,Action,Type,warname,version,Gray,work,project_level,changelog) mysql_operation.op_operation() Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem(java_publish.java_publish,publish_key,messageKey) Scheduler.start() myRedis.lpush(messageKey, ' --->check pass!') myRedis.lpush(messageKey, '-' * 80 + '\n') else: raise flash('%s 没有在上线列表中找到!' % warname) except Exception as e: if 'old' not in str(e): flash(e) if qrcode_url: return render_template('java_publish.html',Main_Infos=g.main_infos, form=form, qrcode_url=qrcode_url) else: return render_template('java_publish_show.html',Main_Infos=g.main_infos) else: flash("错误:文本框内容不能为空!") return render_template('java_publish.html',Main_Infos=g.main_infos,form=form,qrcode_url=qrcode_url)
def update_java(): produce.Async_log(g.user, request.url) K = '%s_%s' % (g.user, g.secret_key) messageKey = '%s_update_java' % K publish_key = '%s_update_key' % K form = MyForm.MyForm_updateJboss() if form.submit.data: try: if form.text.data: if myRedis.exists(messageKey): raise flash('上线操作过于频繁,请稍等%s秒......' % myRedis.ttl(messageKey)) myRedis.lpush(messageKey, 'check env......') tags = form.text.data.strip().splitlines() assert len(tags) == 1, 'Can only execute a project at a time!' project = form.text.data.strip() warname = project.split('-')[0] Action = form.selectAction.data Gray = form.Gray.data Type = 1 dbTable = db_op.java_list #灰度发布 if Gray: ServerList = dbTable.query.with_entities( dbTable.ip, dbTable.user).filter( db_op.DB.and_(dbTable.project == warname, dbTable.type == Type, dbTable.Gray == '1')).limit(1).all() if not ServerList: ServerList = dbTable.query.with_entities( dbTable.ip, dbTable.user).filter( db_op.DB.and_( dbTable.project == warname, dbTable.type == Type)).limit(1).all() if ServerList: for ip, username in ServerList: dbTable.query.filter( db_op.DB.and_( dbTable.ip == ip, dbTable.user == username)).update( {dbTable.Gray: '1'}) else: flash('%s Not found' % warname) return render_template('Message_static.html', Main_Infos=g.main_infos) else: ServerList = dbTable.query.with_entities( dbTable.ip, dbTable.user).filter( db_op.DB.and_(dbTable.project == warname, dbTable.type == Type)).all() if ServerList: myRedis.lpush(messageKey, ' --->check env pass!') myRedis.lpush(messageKey, '-' * 80 + '\n') information = {} information['warname'] = warname information['project'] = project information['ServerList'] = ServerList information['Action'] = Action information['Gray'] = Gray myRedis.lpush(publish_key, information) mysql_operation = Mysql.mysql_op(g.user, Action, Type, project, Gray) mysql_operation.op_operation() Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem( java_update.java_update, publish_key, messageKey) Scheduler.start() else: flash('%s Not found' % warname) return render_template('Message_static.html', Main_Infos=g.main_infos) except Exception as e: flash(e) return render_template('Message_static.html', Main_Infos=g.main_infos) return render_template('java_update_show.html', Main_Infos=g.main_infos) return render_template('java_update.html', Main_Infos=g.main_infos, form=form)
def project_apply(): form = MyForm.MyForm_project_apply() types = {'new': u'新增需求', 'bug': u'bug修复'} if form.submit.data: Project_types = form.Project_types.data Project_describe = form.Project_describe.data.strip() Project_content = form.Project_content.data.strip() Publish_conf = form.Publish_conf.data Front = form.Front.data Rollback_version = form.Rollback_version.data.strip() proposer = g.user if Project_describe and Project_content and Rollback_version: try: if Publish_conf == 'no': raise flash('请确认资源配置是否正确?') if Project_content == Rollback_version: raise flash('上线版本和回滚版本内容不能相同!') Projects = Project_content.splitlines() Rollback_version = Rollback_version.splitlines() if len(Projects) == 2 and len(Rollback_version) == 2: Project = Projects[0].strip() tag = Projects[1].strip() if Project.endswith('git') or tag.startswith('tag'): project = Project.split('/')[-1] project = project.split('.')[0] else: raise flash('无效的路径格式!') else: raise flash('无效的内容格式!') db_project_apply = db_op.project_apply VALS = db_project_apply.query.filter( and_( db_project_apply.content.like('{0};%'.format(Project)), db_project_apply.status <> '2')).all() if VALS: raise flash('该项目已经提测,请勿重复提交!') db_project = db_op.project_level project_val = db_project.query.with_entities( db_project.level).filter( db_project.project == project).all() if project_val: Project_level = int(project_val[0][0]) else: raise flash('没有找到%s项目的等级记录!' % project_val[0][0]) Receiver = mails['test'] msg = Message("%s项目提测申请" % project, sender=sender, recipients=[Receiver], cc=[sender]) msg.html = '<p>1、项目等级:<strong>%s</strong></p>' \ '<p>2、项目类型:<strong>%s</strong></p>' \ '<p>3、项目描述:</p>'\ '<p><strong>%s</strong></p>' \ '<p>4、提测版本:</p>' \ '<p><strong>%s</strong></p>' \ '<p><strong>%s</strong></p>' \ '<p>5、前端相关项目是否上线?:<strong>%s</strong></p>' \ '<p>6、线上资源配置是否正确?:<strong>%s</strong></p>' \ '<p>7、回滚版本:</p>'\ '<p><strong>%s</strong></p>' \ '<p><strong>%s</strong></p>' \ '<p>8、申请人:<strong>%s</strong></p>' % (Project_level,types[Project_types],Project_describe,Projects[0].strip(),Projects[1].strip(),Front,Publish_conf,Rollback_version[0].strip(),Rollback_version[1].strip(),proposer) with app.app_context(): try: mail.send(msg) except Exception as e: flash(e) raise flash('提测申请邮件发送失败!') #执行预发布上线 K = '%s_%s' % (g.user, g.secret_key) Key = '%s_publish_php' % K publish_key = '%s_publish_key' % K action = 'publish' Redis.lpush(Key, 'check security policy......') Redis.expire(Key, 30) Path = ';'.join(Projects).replace('http://', '') sip = [ '172.16.1.246', ] Gray = '0' Info = {} Info['action'] = action Info['path'] = Path Info['app'] = project Info['sip'] = sip Info['gray'] = Gray Redis.lpush(publish_key, Info) #记入数据库 db = db_op.project_apply db_op.DB.session.add( db(project=project, types=types[Project_types], describe=Project_describe, content='%s;%s' % (Projects[0].strip(), Projects[1].strip()), Rollback='%s;%s' % (Rollback_version[0].strip(), Rollback_version[1].strip()), sender=proposer, status='0')) db_op.DB.session.commit() # 项目提测记录上线时间 db_project = db_op.project_show tm = time.strftime('%Y%m%d', time.localtime()) db_project.query.filter(db_project.project == project).update( {db_project.test_time: tm}) db_op.DB.session.commit() # 后台执行 Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem(php_publish.php_publish, publish_key, Key) Scheduler.start() Redis.lpush(Key, ' --->check pass!') Redis.lpush(Key, '-' * 80 + '\n') return render_template('php_publish_show.html', Main_Infos=g.main_infos) except Exception as e: loging.write(e) if 'old' not in str(e): flash(e) return render_template('Message_static.html', Main_Infos=g.main_infos) return render_template('project_apply.html', Main_Infos=g.main_infos, form=form)
def publish_java(): produce.Async_log(g.user, request.url) K = '%s_%s' % (g.user, g.secret_key) messageKey = '%s_publish_java' % K publish_key = '%s_publish_key' % K qrcode_url = "https://op.baihe.com/qrcode_java/{0}/{1}".format( g.user, g.grade) form = MyForm.MyForm_publishJboss() if form.submit.data: Action = form.selectAction.data Type = int(form.selectType.data) Gray = form.Gray.data Way = form.selectWay.data code = form.code.data work = form.selectwork.data grade = form.selectgrade.data changelog = form.changelog.data tags = form.text.data.strip().splitlines() if tags and changelog: try: if myRedis.exists(messageKey): raise flash('项目上线操作正在执行,不能并行上线操作.请稍候......') myRedis.lpush(messageKey, 'check env......') assert len(tags) == 1, '错误:只能同时上线一个项目!' warTagName = tags[0] version = '0.0.0' if Action == 'restart': warname = warTagName elif Way == 'SVN': assert '.war.zip' in warTagName, '错误:格式错误!格式应为: baihe-xxxx-x.x.x.war.zip' warname = warTagName.split('-')[:-1] version = warTagName.split('-')[-1].replace('.war.zip', '') warname = '-'.join(warname) + '.war' elif Way == 'GIT': warname = "{0}.war".format(warTagName.split('/')[-1]) except Exception as e: flash(e) else: try: publish_time = time.strftime("%H", time.localtime()) if code: verify_key = "{0}_{1}".format(g.user, g.grade) verify_code = myRedis.get(verify_key) if verify_code == str(code): myRedis.lpush(messageKey, ' --->verify code pass!') myRedis.delete(verify_key) else: raise flash('上线码验证错误!') else: # 用户权限判断 if g.grade >= 2 and Type == 1 and int(grade) >= 5: raise flash('需申请验证码!') if g.grade >= 2 and int(grade) <= 4 and Type == 1 and ( int(publish_time) >= 17 or int(publish_time) <= 9): raise flash('仅允许在10-17点时间段进行自助操作,需申请验证码!') dbTable = db_op.java_list #灰度发布 if Gray: ServerList = dbTable.query.with_entities( dbTable.ip, dbTable.user).filter( db_op.DB.and_( dbTable.project == warname, dbTable.type == Type, dbTable.Gray == '1')).limit(1).all() if not ServerList: ServerList = dbTable.query.with_entities( dbTable.ip, dbTable.user).filter( db_op.DB.and_( dbTable.project == warname, dbTable.type == Type)).limit(1).all() loging.write(ServerList[:]) if ServerList: for ip, username in ServerList: dbTable.query.filter( db_op.DB.and_( dbTable.ip == ip, dbTable.user == username)).update( {dbTable.Gray: '1'}) else: raise flash('%s 没有在上线列表中找到!' % warname) else: ServerList = dbTable.query.with_entities( dbTable.ip, dbTable.user).filter( db_op.DB.and_(dbTable.project == warname, dbTable.type == Type)).all() if Type == 1: ServerList.append(('172.16.4.188', 'java')) if ServerList: myRedis.lpush(messageKey, ' --->check env pass!') myRedis.lpush(messageKey, '-' * 80 + '\n') information = {} information['warname'] = warname information['warTagName'] = warTagName information['ServerList'] = ServerList information['Action'] = Action information['Gray'] = Gray information['Type'] = Type information['Way'] = Way myRedis.lpush(publish_key, information) mysql_operation = Mysql.mysql_op( g.user, Action, Type, warname, version, Gray, work, grade, changelog) mysql_operation.op_operation() Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem( java_publish.java_publish, publish_key, messageKey) Scheduler.start() else: raise flash('%s 没有在上线列表中找到!' % warname) except Exception as e: if 'old' not in str(e): flash(e) else: return render_template('java_publish_show.html') else: flash("错误:文本框内容不能为空!") return render_template('java_publish.html', form=form, qrcode_url=qrcode_url)
def publish_php(): produce.Async_log(g.user, request.url) K = '%s_%s' %(g.user,g.secret_key) Key = '%s_publish_php' %K publish_key = '%s_publish_key' %K qrcode_url = None form = MyForm.MyForm_php() if form.submit.data: try: if Redis.exists(Key): raise flash('上线操作过于频繁,请稍等%s秒......' %Redis.ttl(Key)) if form.text.data and form.changelog.data: action = form.selectaction.data Type = int(form.selecttype.data) Way = form.selectWay.data if Type == 1: platfrom = '线上' if Type == 2: platfrom = '测外' Tags = form.text.data.strip().splitlines() Gray = form.Gray.data code = form.code.data work = form.selectwork.data changelog = form.changelog.data if Way == 'SVN': if len(Tags) > 1: raise flash('错误:只能同时上线一个项目!') else: for line in Tags: if line.startswith('#') or not line.split(): continue m = re.match(r'[0-9]', line) if m: raise flash('错误:不能以数字开头!') if not line.startswith('/'): raise flash('错误:' + line + '路径必须以"/"开头!') path = line.strip() path = path.replace('\\', '/') App = path.split('/') if len(App)<4: raise flash('错误:路径错误,无法获取项目名!') App = App[3] if len(path.split('-')) >= 2: version = path.split('-')[-1] else: raise flash('错误:项目名称格式错误!') if version.endswith('.zip'): version = version.replace('.zip', '') elif Way == 'GIT': if len(Tags) != 2: raise flash('错误:GIT上线格式不对!') elif not Tags[0].strip().startswith('http://'): raise flash('错误:' + Tags[0] + '路径需以"http://"开头!') elif not Tags[0].strip().endswith('.git'): raise flash('错误:' + Tags[0] + '应该以".git"结尾!') elif not Tags[1].strip().startswith('tag-'): raise flash('错误:输入的tag版本号格式错误!') path = ';'.join(Tags) path = path.replace('http://git.baihe.com/', '/') App = Tags[0].strip().split('/')[-1] App = App.split('.')[0] version = Tags[1].split('-')[-1] else: raise flash('错误:文本框内容不能为空!') except Exception as e: if 'old' not in str(e): flash(e) else: try: project_db = db_op.project_level project_level = project_db.query.with_entities(project_db.level).filter(project_db.project == App).all() #测外不强制项目等级 if Type == 2: if project_level: project_level = int(project_level[0][0]) else: project_level = 1 else: if project_level: project_level = int(project_level[0][0]) crypto = Md5.crypto(crypto_key) qrcode_url = "https://op.baihe.com/qrcode_php/{0}/{1}/{2}/{3}".format(crypto.encrypt(g.user),g.grade,crypto.encrypt(App),project_level) else: raise flash('没有找到该项目的对应项目等级!') publish_time = time.strftime("%H", time.localtime()) if code: verify_key = "{0}_{1}".format(g.user,App) verify_code = Redis.get(verify_key) if verify_code == str(code): Redis.lpush(Key, ' --->verify code pass!') Redis.expire(Key, 30) Redis.delete(verify_key) code_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) db = db_op.publish_code db_op.DB.session.add( db(project=App, code=str(code), platfrom=platfrom, user=g.user, Time=code_time)) db_op.DB.session.commit() else: raise flash('%s 该上线码验证不通过!' %str(code)) else: # 用户权限及行为判断 tw = int(time.strftime('%w',time.localtime(time.time()))) if g.grade >= 2 and Type == 1 and action == 'publish': if project_level >= 5: raise flash('该项目等级为%s级,需申请上线码!' % project_level) if tw in (2,4): if project_level <= 4 and (int(publish_time) >= 17 or int(publish_time) <= 9): raise flash('仅允许在10-17点时间段进行上线操作,需申请上线码!') else: raise flash('4级及以下常规项目只限在周二和周四上线,修复BUG需申请上线码!') if g.grade >= 2 and action == 'rollback': raise flash('没有权限进行回滚操作!') db = db_op.php_list if Gray: if App == 'baihePhpGlobalLibrary_publish': val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.operation == 'baihe')).limit(1).all() if not val: val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' % Type,db.operation == 'baihe')).limit(1).all() elif App == 'Baihe': val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.operation == 'hunli')).limit(1).all() if not val: val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' % Type,db.operation == 'hunli')).limit(1).all() else: val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.project == '%s' % App)).limit(1).all() if not val: val = db.query.with_entities(db.ip).filter(and_(db.project == '%s' % App, db.type == '%i' % Type)).limit(1).all() if val: sip = [v[0].encode('UTF-8') for v in val if v] db.query.filter(and_(db.project == App, db.ip == sip[0])).update({db.Gray: '1'}) else: raise flash('%s 没有在上线列表中找到!' % App) else: if App == 'baihePhpGlobalLibrary_publish': val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' %Type,db.operation == 'baihe')).all() elif App == 'Baihe': val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' %Type,db.operation == 'hunli')).all() else: val = db.query.with_entities(db.ip).filter(and_(db.project == '%s' %App,db.type == '%i' %Type)).all() if val: val = set(val) sip = [v[0].encode('UTF-8') for v in val if v] if Type == 1: sip.append('172.16.4.188') else: raise flash('%s 没有在上线列表中找到!' %App) Redis.lpush(Key, 'check security policy......') Redis.expire(Key, 30) Info = {} Info['action'] = action Info['path'] = path Info['app'] = App Info['sip'] = sip Info['gray'] = Gray Info['Type'] = Type Info['Way'] = Way Redis.lpush(publish_key,Info) mysql_operation = Mysql.mysql_op(g.user,action,Type,App,version,Gray,work,project_level,changelog) mysql_operation.op_operation() Scheduler = produce.Scheduler_publish() Scheduler = Scheduler.Scheduler_mem(php_publish.php_publish,publish_key,Key) Scheduler.start() Redis.lpush(Key,' --->check pass!') Redis.lpush(Key,'-'*80+'\n') except Exception as e: if 'old' not in str(e): flash(e) if qrcode_url: return render_template('php_publish.html',Main_Infos=g.main_infos, form=form, qrcode_url=qrcode_url) else: return render_template('php_publish_show.html',Main_Infos=g.main_infos) return render_template('php_publish.html',Main_Infos=g.main_infos,form=form,qrcode_url = qrcode_url)