执行本地项目分析
(self)
| 275 | self._output_result(scan_result) |
| 276 | |
| 277 | def run(self): |
| 278 | """执行本地项目分析 |
| 279 | """ |
| 280 | try: |
| 281 | os.environ["TaskScene"] = TaskScene.LOCAL |
| 282 | os.environ["TCA_QUICK_SCAN"] = "True" # 标记为快速扫描模式,方便后续判断 |
| 283 | |
| 284 | # 保存当前环境变量,执行子进程时使用该环境变量,避免被污染 |
| 285 | self._origin_os_env = dict(os.environ) |
| 286 | |
| 287 | # 校验输入的配置信息是否正确,如果有问题,提示重新输入 |
| 288 | self._check_config_info() |
| 289 | |
| 290 | # 获取任务执行参数 |
| 291 | input_params = QuickScan.get_input_params(self._scan_files) |
| 292 | # LogPrinter.info(f">>> input_params: {json.dumps(input_params, indent=2)}") |
| 293 | self._scan_rel_paths, self._path_info = QuickScan.get_scan_paths(input_params, self._source_dir) |
| 294 | self.check_language(input_params) |
| 295 | # LogPrinter.info(f">>> input_params: {json.dumps(input_params, indent=2)}") |
| 296 | if self._scheme_template_id: |
| 297 | if self._token and self._org_sid: # 通过server获取指定的分析方案模板的任务参数 |
| 298 | LogPrinter.info(f"token and scheme_template_id are set, get task config from server ...") |
| 299 | server_url = LocalConfig.get_server_url() |
| 300 | dog_server = RetryDogServer(server_url, self._token).get_api_server(retry_times=2) |
| 301 | proj_conf = dog_server.get_jobconfs_by_scheme_template(self._scheme_template_id, self._org_sid) |
| 302 | else: |
| 303 | raise NodeError(code=errcode.E_NODE_TASK_CONFIG, msg="已输入scheme_template_id, " |
| 304 | "但缺少--token和--org-sid参数, " |
| 305 | "无法获取到分析方案模板, 请补充参数!") |
| 306 | else: |
| 307 | proj_conf = QuickScan.get_proj_config(self._scm_url, self._languages, self._labels, input_params) |
| 308 | |
| 309 | # debug打印调试 |
| 310 | # with open("quickscan_proj_config.json", "w") as wf: |
| 311 | # json.dump(proj_conf, wf, indent=2) |
| 312 | |
| 313 | # 将需要扫描的文件添加到项目过滤路径中 |
| 314 | path_filters = QuickScan.get_path_filters(input_params) |
| 315 | |
| 316 | # 根据参数对项目进行分析 |
| 317 | execute_request_list = self._generate_request(proj_conf, path_filters) |
| 318 | self._scan_project(execute_request_list) |
| 319 | return "OK" |
| 320 | except Exception as err: |
| 321 | # 异常封装处理: |
| 322 | # ScmCommandError 是cmdscm抛的异常,统一封装成 client 异常 E_NODE_TASK_SCM_FAILED 上报 |
| 323 | # 其他未知异常,统一报 E_NODE_TASK |
| 324 | if isinstance(err, ScmCommandError): |
| 325 | error_code = errcode.E_NODE_TASK_SCM_FAILED |
| 326 | else: |
| 327 | error_code = getattr(err, 'code', errcode.E_NODE_TASK) |
| 328 | |
| 329 | description = "%s: %s" % (type(err).__name__, err) |
| 330 | scan_result = { |
| 331 | "status": "error", |
| 332 | "error_code": error_code, |
| 333 | "text": "分析异常", |
| 334 | "description": description, |
no test coverage detected