Esempio n. 1
0
    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
Esempio n. 2
0
    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}
Esempio n. 3
0
    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}
Esempio n. 4
0
    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}
Esempio n. 5
0
    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
Esempio n. 6
0
    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
Esempio n. 7
0
    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}
Esempio n. 8
0
    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}
Esempio n. 9
0
    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
Esempio n. 10
0
 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
Esempio n. 11
0
    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
Esempio n. 12
0
 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
Esempio n. 13
0
    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
Esempio n. 14
0
    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()
Esempio n. 15
0
 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()
Esempio n. 16
0
    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)