def __init__(self, task_id=None, project_id=None, console=False): self.local_codebase = current_app.config.get('CODE_BASE') self.local = Waller( host=current_app.config.get('LOCAL_SERVER_HOST'), user=current_app.config.get('LOCAL_SERVER_USER'), port=current_app.config.get('LOCAL_SERVER_PORT'), ) self.TaskRecord = RecordModel() if task_id: self.task_id = task_id # task start current_app.logger.info(self.task_id) self.taskMdl = TaskModel().item(self.task_id) self.user_id = self.taskMdl.get('user_id') self.servers = self.taskMdl.get('servers_info') self.task = self.taskMdl.get('target_user') self.project_info = self.taskMdl.get('project_info') if project_id: self.project_id = project_id self.project_info = ProjectModel(id=project_id).item() self.project_name = self.project_info['id'] self.dir_codebase_project = self.local_codebase + str( self.project_name) self.init_repo() # start to deploy self.console = console
def walle_rollback(self): self.start() try: is_all_servers_success = True for server_info in self.servers: host = server_info['host'] try: waller = Waller(host=host, user=server_info['user'], port=server_info['port'], inline_ssh_env=True) waller.init_env(env=self.custom_global_env) self.connections[self.task_id] = waller self.prev_release_custom(self.connections[self.task_id]) self.release(self.connections[self.task_id]) self.post_release(self.connections[self.task_id]) RecordModel().save_record(stage=RecordModel.stage_end, sequence=0, user_id=current_user.id, task_id=self.task_id, status=RecordModel.status_success, host=host, user=server_info['user'], command='') emit('success', {'event': 'finish', 'data': {'host': host, 'message': host + ' 部署完成!'}}, room=self.task_id) except Exception as e: is_all_servers_success = False current_app.logger.exception(e) self.errors[host] = e.message RecordModel().save_record(stage=RecordModel.stage_end, sequence=0, user_id=current_user.id, task_id=self.task_id, status=RecordModel.status_fail, host=host, user=server_info['user'], command='') emit('fail', {'event': 'finish', 'data': {'host': host, 'message': host + Code.code_msg[Code.deploy_fail]}}, room=self.task_id) self.end(is_all_servers_success) except Exception as e: self.end(False) return {'success': self.success, 'errors': self.errors}
def walle_deploy(self): self.start() try: self.prev_deploy() self.deploy() self.post_deploy() is_all_servers_success = True for server_info in self.servers: server = server_info['host'] try: self.connections[server] = Waller( host=server, user=self.project_info['target_user']) self.prev_release(self.connections[server]) self.release(self.connections[server]) self.post_release(self.connections[server]) except Exception as e: is_all_servers_success = False current_app.logger.error(e) self.errors[server] = e.message self.end(is_all_servers_success) except Exception as e: self.end(False) emit('fail', { 'event': 'console', 'data': { 'message': Code.code_msg[Code.deploy_fail] } }, room=self.task_id) return {'success': self.success, 'errors': self.errors}
def walle_deploy(self): self.start() self.prev_deploy() self.deploy() self.post_deploy() # server = '172.16.0.231' # try: # self.connections[server] = Waller(host=server, user=self.project_info['target_user']) # self.prev_release(self.connections[server]) # self.release(self.connections[server]) # self.post_release(self.connections[server]) # except Exception as e: # current_app.logger.exception(e) # self.errors[server] = e.message all_servers_success = True for server_info in self.servers: server = server_info['host'] try: self.connections[server] = Waller( host=server, user=self.project_info['target_user']) self.prev_release(self.connections[server]) self.release(self.connections[server]) self.post_release(self.connections[server]) except Exception as e: all_servers_success = False self.errors[server] = e.message self.end(all_servers_success) return {'success': self.success, 'errors': self.errors}
def project_detection(self): errors = [] # LOCAL_SERVER_USER => git # LOCAL_SERVER_USER => target_servers for server_info in self.servers: waller = Waller(host=server_info['host'], user=server_info['user'], port=server_info['port']) result = waller.run('id', exception=False, wenv=self.config()) if result.failed: errors.append({ 'title': '远程目标机器免密码登录失败', 'why': '远程目标机器:%s 错误:%s' % (server_info['host'], result.stdout), 'how': '在宿主机中配置免密码登录,把宿主机用户%s的~/.ssh/ssh_rsa.pub添加到远程目标机器用户%s的~/.ssh/authorized_keys。了解更多:http://walle-web.io/docs/troubleshooting.html' % ( pwd.getpwuid(os.getuid())[0], server_info['host']), }) # maybe this is no webroot's parent dir command = '[ -d {webroot} ] || mkdir -p {webroot}'.format(webroot=os.path.basename(self.project_info['target_root'])) result = waller.run(command, exception=False, wenv=self.config(console=False)) # 检查 webroot 父目录是否存在,是否为软链 command = '[ -L "%s" ] && echo "true" || echo "false"' % (self.project_info['target_root']) result = waller.run(command, exception=False, wenv=self.config()) if result.stdout == 'false': errors.append({ 'title': '远程目标机器webroot不能是已建好的目录', 'why': '远程目标机器%s webroot不能是已存在的目录,必须为软链接,你不必新建,walle会自行创建。' % (server_info['host']), 'how': '手工删除远程目标机器:%s webroot目录:%s' % (server_info['host'], self.project_info['target_root']), }) # remote release directory return errors
def __init__(self, task_id=None, project_id=None, console=False): self.local_codebase = current_app.config.get('CODE_BASE') self.localhost = Waller(host='127.0.0.1') self.TaskRecord = RecordModel() if task_id: self.task_id = task_id # task start current_app.logger.info(self.task_id) self.taskMdl = TaskModel().item(self.task_id) self.user_id = self.taskMdl.get('user_id') self.servers = self.taskMdl.get('servers_info') self.project_info = self.taskMdl.get('project_info') if project_id: self.project_id = project_id self.project_info = ProjectModel(id=project_id).item() self.servers = self.project_info['servers_info'] self.project_name = self.project_info['id'] self.dir_codebase_project = self.local_codebase + str(self.project_name) # self.init_repo() # start to deploy self.console = console
def walle_deploy(self): self.start() try: self.prev_deploy() self.deploy() self.post_deploy() is_all_servers_success = True for server_info in self.servers: host = server_info['host'] try: self.connections[host] = Waller(host=host, user=server_info['user'], port=server_info['port']) self.prev_release(self.connections[host]) self.release(self.connections[host]) self.post_release(self.connections[host]) except Exception as e: is_all_servers_success = False current_app.logger.error(e) self.errors[host] = e.message self.end(is_all_servers_success) except Exception as e: self.end(False) return {'success': self.success, 'errors': self.errors}
def walle_deploy(self): self.prev_deploy() self.deploy() self.post_deploy() server = '172.16.0.231' try: self.connections[server] = Waller( host=server, user=self.project_info['target_user']) self.prev_release(self.connections[server]) self.release(self.connections[server]) self.post_release(self.connections[server]) except Exception as e: current_app.logger.exception(e) self.errors[server] = e.message # for server_info in self.servers: # server = server_info.host # try: # self.connections[server] = Waller(host=server, user=self.project_info['target_user']) # self.prev_release(self.connections[server]) # self.release(self.connections[server]) # self.post_release(self.connections[server]) # except Exception, e: # self.errors[server] = e.message return {'success': self.success, 'errors': self.errors}
def __init__(self, task_id=None, project_id=None, console=False): self.local_codebase = current_app.config.get('CODE_BASE').rstrip('/') + '/' self.localhost = Waller(host='127.0.0.1') self.TaskRecord = RecordModel() if task_id: self.task_id = task_id # task start current_app.logger.info(self.task_id) self.taskMdl = TaskModel().item(self.task_id) self.user_id = self.taskMdl.get('user_id') self.servers = self.taskMdl.get('servers_info') self.project_info = self.taskMdl.get('project_info') # copy to a local version self.release_version = '{project_id}_{task_id}_{timestamp}'.format( project_id=self.project_info['id'], task_id=self.task_id, timestamp=time.strftime('%Y%m%d_%H%M%S', time.localtime(time.time())), ) current_app.logger.info(self.taskMdl) self.custom_global_env = { 'WEBROOT': str(self.project_info['target_root']), 'VERSION': str(self.release_version), 'CURRENT_RELEASE': str(self.project_info['target_releases']), 'BRANCH': str(self.taskMdl.get('branch')), 'TAG': str(self.taskMdl.get('tag')), 'COMMIT_ID': str(self.taskMdl.get('commit_id')), 'PROJECT_NAME': str(self.project_info['name']).replace('"', '').replace("'", '').replace(" ", '_'), 'PROJECT_ID': str(self.project_info['id']), 'TASK_NAME': str(self.taskMdl.get('name')).replace('"', '').replace("'", '').replace(" ", '_'), 'TASK_ID': str(self.task_id), 'DEPLOY_USER': str(self.taskMdl.get('user_name')), 'DEPLOY_TIME': str(time.strftime('%Y%m%d-%H:%M:%S', time.localtime(time.time()))), } if self.project_info['task_vars']: task_vars = [i.strip() for i in self.project_info['task_vars'].split('\n') if i.strip() and not i.strip().startswith('#')] for var in task_vars: var_list = var.split('=', 1) if len(var_list) != 2: continue self.custom_global_env[var_list[0]] = var_list[1] self.localhost.init_env(env=self.custom_global_env) if project_id: self.project_id = project_id self.project_info = ProjectModel(id=project_id).item() self.servers = self.project_info['servers_info'] self.project_name = self.project_info['id'] self.dir_codebase_project = self.local_codebase + str(self.project_name) # self.init_repo() # start to deploy self.console = console
def test(self): server = '172.20.95.43' # server = '172.16.0.231' try: self.connections[server] = Waller(host=server, user='******') self.post_release_service(self.connections[server]) except Exception as e: current_app.logger.exception(e) self.errors[server] = e.message
def project_detection(self): errors = [] # walle user => walle LOCAL_SERVER_USER # show ssh_rsa.pub (maybe not necessary) command = 'whoami' current_app.logger.info(command) result = self.local.run(command, exception=False, wenv=self.config()) if result.failed: errors.append({ 'title': u'本地免密码登录失败', 'why': result.stdout, 'how': u'在宿主机中配置免密码登录,把walle启动用户%s的~/.ssh/ssh_rsa.pub添加到LOCAL_SERVER_USER用户%s的~/.ssh/authorized_keys。了解更多:http://walle-web.io/docs/troubleshooting.html' % (pwd.getpwuid(os.getuid())[0], current_app.config.get('LOCAL_SERVER_USER')), }) # LOCAL_SERVER_USER => git # LOCAL_SERVER_USER => target_servers for server_info in self.servers: waller = Waller(host=server_info['host'], user=server_info['user'], port=server_info['port']) result = waller.run('id', exception=False, wenv=self.config()) if result.failed: errors.append({ 'title': u'远程目标机器免密码登录失败', 'why': u'远程目标机器:%s 错误:%s' % (server_info['host'], result.stdout), 'how': u'在宿主机中配置免密码登录,把宿主机用户%s的~/.ssh/ssh_rsa.pub添加到远程目标机器用户%s的~/.ssh/authorized_keys。了解更多:http://walle-web.io/docs/troubleshooting.html' % (current_app.config.get('LOCAL_SERVER_USER'), server_info['host']), }) # 检查 webroot 父目录是否存在,是否为软链 command = '[ -L "%s" ] && echo "true" || echo "false"' % ( self.project_info['target_root']) result = waller.run(command, exception=False, wenv=self.config()) if result.stdout == 'false': errors.append({ 'title': u'远程目标机器webroot不能是已建好的目录', 'why': u'远程目标机器%s webroot不能是已存在的目录,必须为软链接,你不必新建,walle会自行创建。' % (server_info['host']), 'how': u'手工删除远程目标机器:%s webroot目录:%s' % (server_info['host'], self.project_info['target_root']), }) # remote release directory return errors
def test(self): # server = '172.20.95.43' server = '172.16.0.231' ws_dict = { 'user': '******', 'host': 'ip', 'cmd': 'Going to sleep !!!!!', 'status': 0, 'stage': 1, 'sequence': 1, 'success': 'Going to sleep !!!!!', 'error': '', } emit('console', { 'event': 'task:console', 'data': ws_dict }, room=self.task_id) socketio.sleep(60) ws_dict = { 'user': '******', 'host': 'ip', 'cmd': 'sleep 60', 'status': 0, 'stage': 1, 'sequence': 1, 'success': 'sleep 60....', 'error': '', } emit('console', { 'event': 'task:console', 'data': ws_dict }, room=self.task_id) socketio.sleep(10) ws_dict = { 'user': '******', 'host': 'ip', 'cmd': 'sleep 10', 'status': 0, 'stage': 1, 'sequence': 1, 'success': 'sleep 10....', 'error': '', } emit('console', { 'event': 'task:console', 'data': ws_dict }, room=self.task_id) try: self.connections[server] = Waller(host=server, user='******') self.post_release_service(self.connections[server]) except Exception as e: current_app.logger.exception(e) self.errors[server] = e.message
def walle_deploy(self): self.prev_deploy() self.deploy() self.post_deploy() server = '172.16.0.231' try: self.connections[server] = Waller( host=server, user=self.project_info['target_user']) self.prev_release(self.connections[server]) self.release(self.connections[server]) self.post_release(self.connections[server]) except Exception, e: current_app.logger.exception(e) self.errors[server] = e.message
def __init__(self, task_id=None, project_id=None): self.local = Waller(host=current_app.config.get('LOCAL_SERVER_HOST'), user=current_app.config.get('LOCAL_SERVER_USER'), port=current_app.config.get('LOCAL_SERVER_PORT')) self.TaskRecord = TaskModel.TaskRecordModel() if task_id: self.task_id = task_id self.taskMdl = TaskModel.TaskModel().item(self.task_id) self.user_id = self.taskMdl.get('user_id') self.servers = self.taskMdl.get('servers_info') self.task = self.taskMdl.get('target_user') self.project_info = self.taskMdl.get('project_info') if project_id: self.project_id = project_id self.project_info = ProjectModel(id=project_id).item()
def __init__(self, task_id=None, project_id=None, websocket=None): self.local = Waller(host=current_app.config.get('LOCAL_SERVER_HOST'), user=current_app.config.get('LOCAL_SERVER_USER'), port=current_app.config.get('LOCAL_SERVER_PORT')) self.TaskRecord = TaskModel.TaskRecordModel() current_app.logger.info('DeploySocketIO.__init__ before') emit('message', {'msg': 'DeploySocketIO.__init__'}) current_app.logger.info('DeploySocketIO.__init__ after') # if websocket: # websocket.send_updates(__name__) # self.websocket = websocket if task_id: self.task_id = task_id self.taskMdl = TaskModel.TaskModel().item(self.task_id) self.user_id = self.taskMdl.get('user_id') self.servers = self.taskMdl.get('servers_info') self.task = self.taskMdl.get('target_user') self.project_info = self.taskMdl.get('project_info') if project_id: self.project_id = project_id self.project_info = ProjectModel(id=project_id).item()
def __init__(self, task_id=None, project_id=None, console=False): self.local = Waller(host=current_app.config.get('LOCAL_SERVER_HOST'), user=current_app.config.get('LOCAL_SERVER_USER'), port=current_app.config.get('LOCAL_SERVER_PORT')) self.TaskRecord = RecordModel() if task_id: self.task_id = task_id # task start TaskModel(id=self.task_id).update(status=TaskModel.status_doing) self.taskMdl = TaskModel().item(self.task_id) self.user_id = self.taskMdl.get('user_id') self.servers = self.taskMdl.get('servers_info') self.task = self.taskMdl.get('target_user') self.project_info = self.taskMdl.get('project_info') if project_id: self.project_id = project_id self.project_info = ProjectModel(id=project_id).item() self.project_name = self.project_info['id'] self.dir_codebase_project = self.dir_codebase + str(self.project_name)