def execute(self, args_dict): workdir, virtualenv, script = self._parse_args_dict(args_dict) activate_path = path.join(virtualenv, 'bin', 'activate') if not path.exists(activate_path) or not path.isfile(activate_path): raise PluginError( 'Python virtualenv doesn\'t exist: {}'.format(activate_path)) bash_input = ('cd {}\n' 'source {}\n' 'python {}').format(workdir, activate_path, script) log.debug('Running python script: {}'.format(bash_input)) if self.dry_run: return TaskResult(EXECUTION_SUCCESSFUL) try: stdout = self._run_bash(bash_input) status = EXECUTION_SUCCESSFUL except BashExecuteError as e: status = EXECUTION_FAILED stdout = e.stderr return TaskResult(status, stdout)
def execute(self, args_dict): if 'message' not in args_dict: raise PluginError('BashExecutor got incorrect arguments, got: {}'.format( args_dict.keys() )) message = args_dict['message'] if self.dry_run: return TaskResult(EXECUTION_SUCCESSFUL) payload = { 'username': '******', 'text': message } for i in range(RETRY_COUNT + 1): resp = requests.post(self.webhook_url, json=payload) if resp.ok: log.debug('Successfully sent webhook') break log.debug('Problem sending webhook. Status {}'.format(resp.status_code)) else: log.warning('Could not successfully send webhook. Status: {}'.format(resp.status_code)) return TaskResult(EXECUTION_FAILED, 'Sending slack notification failed') return TaskResult(EXECUTION_SUCCESSFUL, 'Sending slack notification successful')
def execute(self, args_dict): cmd = self._parse_args_dict(args_dict) if self.dry_run: return TaskResult(EXECUTION_SUCCESSFUL, 'Dry run') print('Running executor with command: %s' % cmd) return TaskResult(EXECUTION_SUCCESSFUL, 'Dummy execute completed')
def execute(self, args_dict): self._validate_args_dict(args_dict) workdir = args_dict.get('workdir') script = args_dict.get('script') file = args_dict.get('file') virtualenv = args_dict.get('virtualenv') bash_input = '' if workdir: bash_input += 'cd {}\n'.format(workdir) if virtualenv: activate_path = path.join(virtualenv, 'bin', 'activate') if not path.exists(activate_path) or not path.isfile( activate_path): raise PluginError( 'Python virtualenv doesn\'t exist: {}'.format( activate_path)) bash_input += 'source {}\n'.format(activate_path) filename = file if script: f = NamedTemporaryFile(delete=False) f.write(script) log.debug('Wrote script to file {}, {}'.format(f.name, script)) filename = f.name f.close() bash_input += 'python {}'.format(filename) log.debug('Running python script: {}'.format(bash_input)) if self.dry_run: return TaskResult(EXECUTION_SUCCESSFUL) return_obj = None try: stdout, return_obj = self._run_bash(bash_input) status = EXECUTION_SUCCESSFUL except BashExecuteError as e: status = EXECUTION_FAILED stdout = e.data.get('stdout') print('Finished, stdout: %s' % (stdout)) return TaskResult(status, 'Execution finished', data={'output': stdout}, return_obj=return_obj)
def execute(self, args_dict): cmd = self._parse_args_dict(args_dict) if self.dry_run: return TaskResult(EXECUTION_SUCCESSFUL) try: stdout = self._run_bash(cmd) status = EXECUTION_SUCCESSFUL except BashExecuteError as e: status = EXECUTION_FAILED stdout = e.stderr return TaskResult(status, stdout)
def _run_task(self, task): log.debug('Starting to execute task {}'.format(task.name)) self.plugin_mgr.trigger('on_task_start', task) event_name = '{}.execute'.format(task.executor) self._validate_executor_plugin(event_name) try: results = self.plugin_mgr.trigger(event_name, task.args) # Run the task except KeyboardInterrupt as e: raise except Exception as e: log.warning('Unexpected error running task: %s' % e) log.exception(e) results = [TaskResult(EXECUTION_FAILED, 'Unknown Error: %s' % e)] result = results[0] if not result: raise PipelineError('Result still missing %s' % result) self.plugin_mgr.trigger('on_task_finish', task, result) log.debug('Task finished. Result: %s' % result) return result
def run(self): log.debug('Run pipeline. params: {}'.format(self.context)) pipeline_context = { 'results': [], 'vars': self.context.get('vars', {}), 'status': PIPELINE_STATUS_OK, 'prev_result': None, 'params': self.context.get('params', {}) } pipeline_context = DotMap(pipeline_context) self.plugin_mgr.trigger('on_pipeline_start', pipeline_context) log.debug('Pipeline starting. context: %s' % pipeline_context) for task in self.tasks: if self._should_run(task, pipeline_context): result_obj = None try: task.args = substitute_variables(pipeline_context, task.args) except TemplateError as e: result_obj = TaskResult(EXECUTION_FAILED, e.message) if not result_obj: result_obj = self._run_task(task) if task.ignore_errors and result_obj.status == EXECUTION_FAILED: log.debug( 'Task has ignore_errors set, overriding to successful' ) # Override to be successful result_obj['status'] = EXECUTION_SUCCESSFUL pipeline_context.results.append(result_obj) pipeline_context['prev_result'] = result_obj if pipeline_context[ 'status'] == PIPELINE_STATUS_OK and result_obj.get( 'status') != 0: pipeline_context['status'] = PIPELINE_STATUS_FAIL else: log.debug('Skipping task: {}'.format(task.name)) log.debug('Pipeline finished. Status: {}'.format( pipeline_context['status'])) self.plugin_mgr.trigger('on_pipeline_finish', pipeline_context) return pipeline_context
def execute(self, args_dict): cmd, timeout = self._parse_args_dict(args_dict) if self.dry_run: return TaskResult(EXECUTION_SUCCESSFUL) try: output, return_obj = self._run_bash(cmd, timeout) status = EXECUTION_SUCCESSFUL msg = 'Bash task finished' except BashExecuteError as e: status = EXECUTION_FAILED # stdout = e.stderr msg = 'Bash task failed: %s' % e.msg output = e.data['stdout'] return TaskResult(status, msg, data={'output': output}, return_obj=return_obj)
def execute(self, args_dict): # try to use task level parameter first, then fallback to the top level slack_webhook = args_dict.get('slack_webhook', self.slack_webhook) if not slack_webhook: raise PluginError( 'SlackExecutor is missing slack_webhook parameter. Can not execute' ) if not isinstance(slack_webhook, str): raise PluginError( 'SlackExecutor has invalid slack_webhook parameter') if 'message' not in args_dict: raise PluginError( 'SlackExecutor got incorrect arguments, got: {}'.format( args_dict.keys())) message = args_dict['message'] if self.dry_run: return TaskResult(EXECUTION_SUCCESSFUL) payload = {'username': '******', 'link_names': 1, 'text': message} for i in range(RETRY_COUNT + 1): resp = requests.post(slack_webhook, json=payload) if resp.ok: log.debug('Successfully sent slack message') break log.debug('Problem sending slack message. Status {}'.format( resp.status_code)) else: log.warning( 'Could not successfully send slack message. Status: {}'.format( resp.status_code)) return TaskResult(EXECUTION_FAILED, 'Sending slack notification failed') return TaskResult(EXECUTION_SUCCESSFUL, 'Sending slack notification successful')