示例#1
0
    def deploy(self, payload):
        try:
            event_id = payload.event_id
            repo = self.repo
            logger_server.info("Start deploy Event[{event_id}]...".format(event_id=event_id))
            datetime_start = datetime.datetime.now()

            # Change & init status to Running
            self.status.set_status(DeployStatus.RUNNING)
            self.status.set_running_task(payload)
            self.status.init_host_status()
            self.status.set_cancel_flag(False)
            # Release lock to let other event occur
            self.status.lock_release()
            if _DEBUG:
                logger_server.debug(self.status.export_status())

            # Step 1.Clean Git Work Dir
            self.stage("Clean Git Work Dir", 10)
            repo.clean()
            # Step 2.Fetch data
            self.stage("Fetch data", 20)
            fetch_content = repo.fetch()
            # Step 3.Reset to tag
            self.stage("Reset to tag", 30)
            repo.reset(payload.tag)

            commit_after_pull = self.repo.get_last_commit()
            commit_before_pull = self.status.get_last_commit()

            if _DEBUG:
                logger_server.debug(
                    "Start commit:{start},end commit:{end}".format(start=commit_before_pull, end=commit_after_pull))

            change_files = self.repo.get_change_files(commit_before_pull, commit_after_pull)

            if _DEBUG:
                logger_server.debug("Change files:" + str(change_files))

            if change_files:
                # Step 4.NPM & Python Package Install
                self.stage("NPM & Python Package Install", 40)
                repo.install_pkg(repo.get_pkg_to_install(change_files))
                # Step 5.Run Post-actions
                self.stage("Run Post-actions", 50)
                repo.handle_post_actions()
                # Step 6.Backup Deploy Directory
                self.stage("Backup Deploy Directory", 60)
                backup_tar_file = repo.backup_deploy_dir()
                self.status.set_backup_filename(backup_tar_file)

                if _DEBUG:
                    logger_server.debug("Backup File:" + backup_tar_file)

                # Step 7.Tar directory
                self.stage("Tar directory", 70)
                package_file = repo.tar_git_dir(payload.tag)
                self.status.set_package_filename(package_file)

                if _DEBUG:
                    logger_server.debug("Package File:" + package_file)

                # Step 8.Release Tar
                self.stage("Release Package", 80)
                for one_host in self.status.get_hosts():
                    try:
                        self.status.set_host_status(one_host, HostStatus.DEPLOYING)
                        # Step 8.1.SYNC package
                        if _DEBUG:
                            logger_server.debug("Rsync files to {host}".format(host=one_host))
                        self.stage("Rsync files to {host}".format(host=one_host),
                                   self.status.get_process_percent() + self.status.calculate_process_interval(20, 2))
                        repo.release(package_file, one_host)

                        # Step 8.2.Get Services to restart
                        restart_services = repo.get_service_to_restart(change_files)
                        if _DEBUG:
                            logger_server.debug("service to restart:" + str(restart_services))
                        # Step 8.3.Restart Services
                        if _DEBUG:
                            logger_server.debug("Restart services at {host}".format(host=one_host))
                        self.stage("Restart services at {host}".format(host=one_host),
                                   self.status.get_process_percent() + self.status.calculate_process_interval(20, 2))
                        repo.restart_services(restart_services, one_host)
                        self.status.set_host_status(one_host, HostStatus.SUCCESS)
                    except RepositoryException as ex:
                        self.status.set_host_status(one_host, HostStatus.FAULT)
                        raise ex
                self.stage("Finish", 100)

            else:
                logger_server.info("Nothing has been changed")

            # Logging
            logger_server.info(
                "Deploy Event[{event_id}] done.".format(event_id=event_id))

            datetime_end = datetime.datetime.now()
            mongodb_client['deployment']['deploy_log'].insert({'event_id': payload.event_id,
                                                               'type': 'deploy',
                                                               'repo_name': self.repo.repo_name,
                                                               'result': "success",
                                                               'cost_time': str(datetime_end - datetime_start),
                                                               'createdTimeStamp': int(time.time())})

            mail_manager.send_success_mail(payload, self.repo.get_tag_info(payload.tag), datetime_start, datetime_end)

            # Check if exist waiting task to run
            self.status.lock_acquire()
            self.status.update_last_commit()

            if self.status.has_waiting_task():
                self.deploy(self.status.get_first_waiting_task())
                return

            # Change Status to Idle, Trick: Here will be reached once during one working list
            self.status.set_status(DeployStatus.IDLE)
            self.status.init_host_status()
            self.stage(None)
            self.status.update_last_release_tags()
            self.status.set_running_task(None)
            self.status.set_cancel_flag(False)
            self.status.set_backup_filename(None)
            self.status.set_package_filename(None)
            if _DEBUG:
                logger_server.debug("Status" + str(self.status.export_status()))

            self.status.lock_release()
        except DeployCancel as ex:
            datetime_end = datetime.datetime.now()
            mongodb_client['deployment']['deploy_log'].insert({'event_id': payload.event_id,
                                                               'type': 'deploy_cancel',
                                                               'result': 'success',
                                                               'createdTimeStamp': int(time.time())})
            mail_manager.send_cancel_success_mail(payload, self.repo.get_tag_info(payload.tag), datetime_start, datetime_end)

        except Exception as ex:
            exception_str = str(ex)
            stack_info = traceback.format_exc()
            mail_manager.send_error_mail(payload, self.repo.get_tag_info(payload.tag), datetime_start,
                                         stack_info)
            mongodb_client['deployment']['deploy_log'].insert({'event_id': payload.event_id,
                                                               'type': 'deploy',
                                                               'result': 'exception',
                                                               'exception': exception_str,
                                                               'trace': stack_info,
                                                               'createdTimeStamp': int(time.time()),
                                                               'status_snapshot': serialize_status(
                                                                   self.status.export_status())})
            try:
                self.rollback(payload)
                datetime_end = datetime.datetime.now()
                mongodb_client['deployment']['deploy_log'].insert({'event_id': payload.event_id,
                                                                   'type': 'deploy_rollback',
                                                                   'result': 'success',
                                                                   'exception': exception_str,
                                                                   'trace': stack_info,
                                                                   'createdTimeStamp': int(time.time()),
                                                                   'status_snapshot': serialize_status(
                                                                       self.status.export_status())})
                mail_manager.send_rollback_success_mail(payload, self.repo.get_tag_info(payload.tag), datetime_start,
                                                        datetime_end, stack_info)

            except Exception as rollback_ex:
                rollback_exception_str = str(rollback_ex)
                rollback_stack_info = traceback.format_exc()
                datetime_end = datetime.datetime.now()
                mongodb_client['deployment']['deploy_log'].insert({'event_id': payload.event_id,
                                                                   'type': 'deploy_rollback',
                                                                   'result': 'fail',
                                                                   'exception_original': exception_str,
                                                                   'trace_original': stack_info,
                                                                   'exception_rollback': rollback_exception_str,
                                                                   'trace_rollback': rollback_stack_info,
                                                                   'createdTimeStamp': int(time.time()),
                                                                   'status_snapshot': serialize_status(
                                                                       self.status.export_status())})
                mail_manager.send_rollback_fail_mail(payload, self.repo.get_tag_info(payload.tag), datetime_start,
                                                        datetime_end, stack_info, rollback_stack_info)
示例#2
0
    def deploy(self, payload):
        try:
            event_id = payload.event_id
            repo = self.repo
            logger_server.info(
                "Start deploy Event[{event_id}]...".format(event_id=event_id))
            datetime_start = datetime.datetime.now()

            # Change & init status to Running
            self.status.set_status(DeployStatus.RUNNING)
            self.status.set_running_task(payload)
            self.status.init_host_status()
            self.status.set_cancel_flag(False)
            # Release lock to let other event occur
            self.status.lock_release()
            if _DEBUG:
                logger_server.debug(self.status.export_status())

            # Step 1.Clean Git Work Dir
            self.stage("Clean Git Work Dir", 20)
            repo.clean()
            # Step 2.Pull data
            self.stage("Pull data", 30)
            pull_content = repo.pull()

            # Step 3.Get change files
            self.stage("Get change files", 40)
            commit_after_pull = self.repo.get_last_commit()
            commit_before_pull = self.status.get_last_commit()

            if _DEBUG:
                logger_server.debug(
                    "Start commit:{start},end commit:{end}".format(
                        start=commit_before_pull, end=commit_after_pull))

            change_files = self.repo.get_change_files(commit_before_pull,
                                                      commit_after_pull)

            if _DEBUG:
                logger_server.debug("Change files:" + str(change_files))

            if change_files:
                # Step 4.NPM & Python Package Install
                self.stage("NPM & Python Package Install", 60)
                repo.install_pkg(repo.get_pkg_to_install(change_files))
                # Step 5.Run Post-actions
                self.stage("Run Post-actions", 70)
                repo.handle_post_actions()
                # Step 6.Get Services to restarts
                self.stage("Get Services to restart", 80)
                restart_services = repo.get_service_to_restart(change_files)
                if _DEBUG:
                    logger_server.debug("service to restart:" +
                                        str(restart_services))
                # Step 7.Restart Services
                self.stage("Restart Services", 90)
                repo.restart_services(restart_services,
                                      self.status.get_hosts()[0])
                self.stage("Finish", 100)

            else:
                logger_server.info("Nothing has been changed")

            # Logging
            logger_server.info(
                "Deploy Event[{event_id}] done.".format(event_id=event_id))
            datetime_end = datetime.datetime.now()
            mongodb_client['deployment']['deploy_log'].insert({
                'event_id':
                payload.event_id,
                'type':
                'deploy',
                'repo_name':
                self.repo.repo_name,
                'result':
                "success",
                'cost_time':
                str(datetime_end - datetime_start),
                'createdTimeStamp':
                int(time.time())
            })

            # Check if exist waiting task to run
            self.status.lock_acquire()
            self.status.update_last_commit()

            if self.status.has_waiting_task():
                self.deploy(self.status.get_first_waiting_task())
                return

            # Change Status to Idle, Trick: Here will be reached once during one working list
            self.status.set_status(DeployStatus.IDLE)
            self.stage(None)
            self.status.set_running_task(None)
            self.status.set_cancel_flag(False)
            if _DEBUG:
                logger_server.debug("Status" +
                                    str(self.status.export_status()))

            self.status.lock_release()
        except DeployCancel as ex:
            mongodb_client['deployment']['deploy_log'].insert({
                'event_id':
                payload.event_id,
                'type':
                'deploy_cancel',
                'result':
                'success',
                'createdTimeStamp':
                int(time.time())
            })
        except Exception as ex:
            exception_str = str(ex)
            stack_info = traceback.format_exc()
            mongodb_client['deployment']['deploy_log'].insert({
                'event_id':
                payload.event_id,
                'type':
                'deploy',
                'result':
                'exception',
                'exception':
                exception_str,
                'trace':
                stack_info,
                'createdTimeStamp':
                int(time.time()),
                'status_snapshot':
                serialize_status(self.status.export_status())
            })
            mail_manager.send_error_mail(payload, '', datetime_start,
                                         stack_info)
            try:
                self.rollback(payload)
                datetime_end = datetime.datetime.now()
                mongodb_client['deployment']['deploy_log'].insert({
                    'event_id':
                    payload.event_id,
                    'type':
                    'deploy_rollback',
                    'result':
                    'success',
                    'exception':
                    exception_str,
                    'trace':
                    stack_info,
                    'createdTimeStamp':
                    int(time.time()),
                    'status_snapshot':
                    serialize_status(self.status.export_status())
                })
                mail_manager.send_rollback_success_mail(
                    payload, '', datetime_start, datetime_end, stack_info)

            except Exception as rollback_ex:
                rollback_exception_str = str(rollback_ex)
                rollback_stack_info = traceback.format_exc()
                datetime_end = datetime.datetime.now()
                mongodb_client['deployment']['deploy_log'].insert({
                    'event_id':
                    payload.event_id,
                    'type':
                    'deploy_rollback',
                    'result':
                    'fail',
                    'exception_original':
                    exception_str,
                    'trace_original':
                    stack_info,
                    'exception_rollback':
                    rollback_exception_str,
                    'trace_rollback':
                    rollback_stack_info,
                    'createdTimeStamp':
                    int(time.time()),
                    'status_snapshot':
                    serialize_status(self.status.export_status())
                })
                mail_manager.send_rollback_fail_mail(payload, '',
                                                     datetime_start,
                                                     datetime_end, stack_info,
                                                     rollback_stack_info)
示例#3
0
    def deploy(self, payload):
        try:
            event_id = payload.event_id
            repo = self.repo
            logger_server.info(
                "Start deploy Event[{event_id}]...".format(event_id=event_id))
            datetime_start = datetime.datetime.now()

            # Change & init status to Running
            self.status.set_status(DeployStatus.RUNNING)
            self.status.set_running_task(payload)
            self.status.init_host_status()
            self.status.set_cancel_flag(False)
            # Release lock to let other event occur
            self.status.lock_release()
            if _DEBUG:
                logger_server.debug(self.status.export_status())

            # Step 1.Clean Git Work Dir
            self.stage("Clean Git Work Dir", 10)
            repo.clean()
            # Step 2.Fetch data
            self.stage("Fetch data", 20)
            fetch_content = repo.fetch()
            # Step 3.Reset to tag
            self.stage("Reset to tag", 30)
            repo.reset(payload.tag)

            commit_after_pull = self.repo.get_last_commit()
            commit_before_pull = self.status.get_last_commit()

            if _DEBUG:
                logger_server.debug(
                    "Start commit:{start},end commit:{end}".format(
                        start=commit_before_pull, end=commit_after_pull))

            change_files = self.repo.get_change_files(commit_before_pull,
                                                      commit_after_pull)

            if _DEBUG:
                logger_server.debug("Change files:" + str(change_files))

            if change_files:
                # Step 4.NPM & Python Package Install
                self.stage("NPM & Python Package Install", 40)
                repo.install_pkg(repo.get_pkg_to_install(change_files))
                # Step 5.Run Post-actions
                self.stage("Run Post-actions", 50)
                repo.handle_post_actions()
                # Step 6.Backup Deploy Directory
                self.stage("Backup Deploy Directory", 60)
                backup_tar_file = repo.backup_deploy_dir()
                self.status.set_backup_filename(backup_tar_file)

                if _DEBUG:
                    logger_server.debug("Backup File:" + backup_tar_file)

                # Step 7.Tar directory
                self.stage("Tar directory", 70)
                package_file = repo.tar_git_dir(payload.tag)
                self.status.set_package_filename(package_file)

                if _DEBUG:
                    logger_server.debug("Package File:" + package_file)

                # Step 8.Release Tar
                self.stage("Release Package", 80)
                for one_host in self.status.get_hosts():
                    try:
                        self.status.set_host_status(one_host,
                                                    HostStatus.DEPLOYING)
                        # Step 8.1.SYNC package
                        if _DEBUG:
                            logger_server.debug(
                                "Rsync files to {host}".format(host=one_host))
                        self.stage(
                            "Rsync files to {host}".format(host=one_host),
                            self.status.get_process_percent() +
                            self.status.calculate_process_interval(20, 2))
                        repo.release(package_file, one_host)

                        # Step 8.2.Get Services to restart
                        restart_services = repo.get_service_to_restart(
                            change_files)
                        if _DEBUG:
                            logger_server.debug("service to restart:" +
                                                str(restart_services))
                        # Step 8.3.Restart Services
                        if _DEBUG:
                            logger_server.debug(
                                "Restart services at {host}".format(
                                    host=one_host))
                        self.stage(
                            "Restart services at {host}".format(host=one_host),
                            self.status.get_process_percent() +
                            self.status.calculate_process_interval(20, 2))
                        repo.restart_services(restart_services, one_host)
                        self.status.set_host_status(one_host,
                                                    HostStatus.SUCCESS)
                    except RepositoryException as ex:
                        self.status.set_host_status(one_host, HostStatus.FAULT)
                        raise ex
                self.stage("Finish", 100)

            else:
                logger_server.info("Nothing has been changed")

            # Logging
            logger_server.info(
                "Deploy Event[{event_id}] done.".format(event_id=event_id))

            datetime_end = datetime.datetime.now()
            mongodb_client['deployment']['deploy_log'].insert({
                'event_id':
                payload.event_id,
                'type':
                'deploy',
                'repo_name':
                self.repo.repo_name,
                'result':
                "success",
                'cost_time':
                str(datetime_end - datetime_start),
                'createdTimeStamp':
                int(time.time())
            })

            mail_manager.send_success_mail(payload,
                                           self.repo.get_tag_info(payload.tag),
                                           datetime_start, datetime_end)

            # Check if exist waiting task to run
            self.status.lock_acquire()
            self.status.update_last_commit()

            if self.status.has_waiting_task():
                self.deploy(self.status.get_first_waiting_task())
                return

            # Change Status to Idle, Trick: Here will be reached once during one working list
            self.status.set_status(DeployStatus.IDLE)
            self.status.init_host_status()
            self.stage(None)
            self.status.update_last_release_tags()
            self.status.set_running_task(None)
            self.status.set_cancel_flag(False)
            self.status.set_backup_filename(None)
            self.status.set_package_filename(None)
            if _DEBUG:
                logger_server.debug("Status" +
                                    str(self.status.export_status()))

            self.status.lock_release()
        except DeployCancel as ex:
            datetime_end = datetime.datetime.now()
            mongodb_client['deployment']['deploy_log'].insert({
                'event_id':
                payload.event_id,
                'type':
                'deploy_cancel',
                'result':
                'success',
                'createdTimeStamp':
                int(time.time())
            })
            mail_manager.send_cancel_success_mail(
                payload, self.repo.get_tag_info(payload.tag), datetime_start,
                datetime_end)

        except Exception as ex:
            exception_str = str(ex)
            stack_info = traceback.format_exc()
            mail_manager.send_error_mail(payload,
                                         self.repo.get_tag_info(payload.tag),
                                         datetime_start, stack_info)
            mongodb_client['deployment']['deploy_log'].insert({
                'event_id':
                payload.event_id,
                'type':
                'deploy',
                'result':
                'exception',
                'exception':
                exception_str,
                'trace':
                stack_info,
                'createdTimeStamp':
                int(time.time()),
                'status_snapshot':
                serialize_status(self.status.export_status())
            })
            try:
                self.rollback(payload)
                datetime_end = datetime.datetime.now()
                mongodb_client['deployment']['deploy_log'].insert({
                    'event_id':
                    payload.event_id,
                    'type':
                    'deploy_rollback',
                    'result':
                    'success',
                    'exception':
                    exception_str,
                    'trace':
                    stack_info,
                    'createdTimeStamp':
                    int(time.time()),
                    'status_snapshot':
                    serialize_status(self.status.export_status())
                })
                mail_manager.send_rollback_success_mail(
                    payload, self.repo.get_tag_info(payload.tag),
                    datetime_start, datetime_end, stack_info)

            except Exception as rollback_ex:
                rollback_exception_str = str(rollback_ex)
                rollback_stack_info = traceback.format_exc()
                datetime_end = datetime.datetime.now()
                mongodb_client['deployment']['deploy_log'].insert({
                    'event_id':
                    payload.event_id,
                    'type':
                    'deploy_rollback',
                    'result':
                    'fail',
                    'exception_original':
                    exception_str,
                    'trace_original':
                    stack_info,
                    'exception_rollback':
                    rollback_exception_str,
                    'trace_rollback':
                    rollback_stack_info,
                    'createdTimeStamp':
                    int(time.time()),
                    'status_snapshot':
                    serialize_status(self.status.export_status())
                })
                mail_manager.send_rollback_fail_mail(
                    payload, self.repo.get_tag_info(payload.tag),
                    datetime_start, datetime_end, stack_info,
                    rollback_stack_info)
示例#4
0
    def deploy(self, payload):
        try:
            event_id = payload.event_id
            repo = self.repo
            logger_server.info("Start deploy Event[{event_id}]...".format(event_id=event_id))
            datetime_start = datetime.datetime.now()

            # Change & init status to Running
            self.status.set_status(DeployStatus.RUNNING)
            self.status.set_running_task(payload)
            self.status.init_host_status()
            self.status.set_cancel_flag(False)
            # Release lock to let other event occur
            self.status.lock_release()
            if _DEBUG:
                logger_server.debug(self.status.export_status())

            # Step 1.Clean Git Work Dir
            self.stage("Clean Git Work Dir", 20)
            repo.clean()
            # Step 2.Pull data
            self.stage("Pull data", 30)
            pull_content = repo.pull()

            # Step 3.Get change files
            self.stage("Get change files", 40)
            commit_after_pull = self.repo.get_last_commit()
            commit_before_pull = self.status.get_last_commit()

            if _DEBUG:
                logger_server.debug(
                    "Start commit:{start},end commit:{end}".format(start=commit_before_pull, end=commit_after_pull)
                )

            change_files = self.repo.get_change_files(commit_before_pull, commit_after_pull)

            if _DEBUG:
                logger_server.debug("Change files:" + str(change_files))

            if change_files:
                # Step 4.NPM & Python Package Install
                self.stage("NPM & Python Package Install", 60)
                repo.install_pkg(repo.get_pkg_to_install(change_files))
                # Step 5.Run Post-actions
                self.stage("Run Post-actions", 70)
                repo.handle_post_actions()
                # Step 6.Get Services to restarts
                self.stage("Get Services to restart", 80)
                restart_services = repo.get_service_to_restart(change_files)
                if _DEBUG:
                    logger_server.debug("service to restart:" + str(restart_services))
                # Step 7.Restart Services
                self.stage("Restart Services", 90)
                repo.restart_services(restart_services, self.status.get_hosts()[0])
                self.stage("Finish", 100)

            else:
                logger_server.info("Nothing has been changed")

            # Logging
            logger_server.info("Deploy Event[{event_id}] done.".format(event_id=event_id))
            datetime_end = datetime.datetime.now()
            mongodb_client["deployment"]["deploy_log"].insert(
                {
                    "event_id": payload.event_id,
                    "type": "deploy",
                    "repo_name": self.repo.repo_name,
                    "result": "success",
                    "cost_time": str(datetime_end - datetime_start),
                    "createdTimeStamp": int(time.time()),
                }
            )

            # Check if exist waiting task to run
            self.status.lock_acquire()
            self.status.update_last_commit()

            if self.status.has_waiting_task():
                self.deploy(self.status.get_first_waiting_task())
                return

            # Change Status to Idle, Trick: Here will be reached once during one working list
            self.status.set_status(DeployStatus.IDLE)
            self.stage(None)
            self.status.set_running_task(None)
            self.status.set_cancel_flag(False)
            if _DEBUG:
                logger_server.debug("Status" + str(self.status.export_status()))

            self.status.lock_release()
        except DeployCancel as ex:
            mongodb_client["deployment"]["deploy_log"].insert(
                {
                    "event_id": payload.event_id,
                    "type": "deploy_cancel",
                    "result": "success",
                    "createdTimeStamp": int(time.time()),
                }
            )
        except Exception as ex:
            exception_str = str(ex)
            stack_info = traceback.format_exc()
            mongodb_client["deployment"]["deploy_log"].insert(
                {
                    "event_id": payload.event_id,
                    "type": "deploy",
                    "result": "exception",
                    "exception": exception_str,
                    "trace": stack_info,
                    "createdTimeStamp": int(time.time()),
                    "status_snapshot": serialize_status(self.status.export_status()),
                }
            )
            mail_manager.send_error_mail(payload, "", datetime_start, stack_info)
            try:
                self.rollback(payload)
                datetime_end = datetime.datetime.now()
                mongodb_client["deployment"]["deploy_log"].insert(
                    {
                        "event_id": payload.event_id,
                        "type": "deploy_rollback",
                        "result": "success",
                        "exception": exception_str,
                        "trace": stack_info,
                        "createdTimeStamp": int(time.time()),
                        "status_snapshot": serialize_status(self.status.export_status()),
                    }
                )
                mail_manager.send_rollback_success_mail(payload, "", datetime_start, datetime_end, stack_info)

            except Exception as rollback_ex:
                rollback_exception_str = str(rollback_ex)
                rollback_stack_info = traceback.format_exc()
                datetime_end = datetime.datetime.now()
                mongodb_client["deployment"]["deploy_log"].insert(
                    {
                        "event_id": payload.event_id,
                        "type": "deploy_rollback",
                        "result": "fail",
                        "exception_original": exception_str,
                        "trace_original": stack_info,
                        "exception_rollback": rollback_exception_str,
                        "trace_rollback": rollback_stack_info,
                        "createdTimeStamp": int(time.time()),
                        "status_snapshot": serialize_status(self.status.export_status()),
                    }
                )
                mail_manager.send_rollback_fail_mail(
                    payload, "", datetime_start, datetime_end, stack_info, rollback_stack_info
                )