From 1b273e23ba0a2984296d33a9fbfcdccb3ba047a4 Mon Sep 17 00:00:00 2001 From: miaokaibo Date: Mon, 21 Apr 2025 13:43:32 +0800 Subject: [PATCH] change for coverage --- 3rdparty/config/env_config_template.yaml | 4 +- auto_deploy/config/sault_config.yaml | 6 +- common/default_case_executor.py | 72 +++----- script/case_parser.py | 2 +- script/exec_case_filter.py | 35 ++-- script/run_cases.py | 37 +++- yosemite/aurogon_utils.py | 207 +++++++++++++++++++++++ yosemite/yosemite_main.py | 3 + 8 files changed, 297 insertions(+), 69 deletions(-) create mode 100644 yosemite/aurogon_utils.py diff --git a/3rdparty/config/env_config_template.yaml b/3rdparty/config/env_config_template.yaml index f669b1e..2782b04 100644 --- a/3rdparty/config/env_config_template.yaml +++ b/3rdparty/config/env_config_template.yaml @@ -86,8 +86,8 @@ exec_machine: device_env_var_name: XXXXX device_ids: 0,1,2,3,4,5,6,7 overall_networks: true - dryrun: true - virtuaenv_nums: 8 + dryrun: false + virtuaenv_nums: 1 virtualenv_root: /home/jenkins/sault/virtual_test yosemite_tag: XXX diff --git a/auto_deploy/config/sault_config.yaml b/auto_deploy/config/sault_config.yaml index 9cbcd1a..3b91a21 100644 --- a/auto_deploy/config/sault_config.yaml +++ b/auto_deploy/config/sault_config.yaml @@ -5,7 +5,7 @@ angel: case_exceedtime: 720 case_exceedtime_checkinterval: 10 # angel 超时时间,支持字典模式配置多个超时配置, 字典模型时, key 必须与 用例筛选字段 filter_keyword 的值保持一致 - exceedtime: 7200 + exceedtime: 45000 exceedtime_checkinterval: 10 ip: jump_machine_inner_ip priority_ip: ANGEL_PRIORITY_IP @@ -134,7 +134,7 @@ case_delay: before: ASCEND_X86_EULEROS: 0 ASCEND_X86_UBUNTU: 0 - ASCEND_ARM_EULEROS: 18 + ASCEND_ARM_EULEROS: 12 ASCEND_ARM_EULEROS_910B: 18 GPU_X86_UBUNTU_CUDA9: 0 GPU_X86_UBUNTU_CUDA10: 0 @@ -144,7 +144,7 @@ case_delay: after: ASCEND_X86_EULEROS: 0 ASCEND_X86_UBUNTU: 0 - ASCEND_ARM_EULEROS: 18 + ASCEND_ARM_EULEROS: 6 ASCEND_ARM_EULEROS_910B: 18 GPU_X86_UBUNTU_CUDA9: 0 GPU_X86_UBUNTU_CUDA10: 0 diff --git a/common/default_case_executor.py b/common/default_case_executor.py index 3b0c602..c987916 100644 --- a/common/default_case_executor.py +++ b/common/default_case_executor.py @@ -11,10 +11,14 @@ import sys import time import subprocess import threading +import yaml from .default_log_collection import DefaultLogCollection from yosemite.yosemite_result import YosemiteResult +from yosemite.aurogon_utils import Upload_COV +coverage_config = yaml.load(open("/home/jenkins/config/coverage_config.yaml", mode='r').read(), Loader=yaml.FullLoader) +coverage_utils = Upload_COV(7, coverage_config.get("aurogon_build_name"), coverage_config.get("aurogon_task_name"), coverage_config.get("third_task_id"), token=coverage_config.get("token")) class DefaultCaseExecutor(object): def __new__(cls, *args, **kwargs): @@ -53,6 +57,7 @@ class DefaultCaseExecutor(object): self.case_path = None self.case_delay_cfg = sault_config.get("case_delay") self.last_task_id = None + self.caseNo = 1 def run(self): """ @@ -82,7 +87,6 @@ class DefaultCaseExecutor(object): else: pre_run_case_ops = """ export SAULT_ENV_TYPE={0}; {1} """.format( env_type, pre_run_case_ops) - post_run_case_ops = self.case_info.get('post_run_case_ops', '') if not post_run_case_ops: post_run_case_ops = """ export SAULT_ENV_TYPE={0} """.format( @@ -99,7 +103,6 @@ class DefaultCaseExecutor(object): if not filter_keyword or str(filter_keyword) == "null": filter_keyword = "level0" try: - test_case = self.case_info.get("caseid") + ".py" except TypeError: self.logger.error( @@ -118,7 +121,7 @@ class DefaultCaseExecutor(object): # 单个用例执行超时时间,在超过这个时间,yosemite中止用例执行,执行环境清理 case_timeout = self.case_info.get("case_timeout") - pytest = os.environ.get("PYTEST_PATH", "pytest") + pytest = "python3 -m coverage run --rcfile=/home/jenkins/hitest/coveragerc -m pytest" extra_env = "" # get extra decorators @@ -131,48 +134,6 @@ class DefaultCaseExecutor(object): elif 'GPU' in env_type: extra_env += 'export DEVICE_TARGET=GPU;' - # set core affinity - affinity_list = None - unlimit_affinity = None - core_192_affinity = [ '0-15', '16-31', '32-47', '48-63', '64-79', '80-95', - '96-111', '112-127', '128-143', '144-159', '160-175', '176-191' ] - core_192_unlimit_affinity = '0-127' - core_256_affinity = [ '0-15', '16-31', '32-47', '64-79', '80-95', '96-111', - '128-143', '144-159', '160-175', '192-207', '208-223', '224-239'] - core_256_unlimit_affinity = '0-159' - core_255_affinity = [ '0-15', '16-31', '32-47', '64-79', '80-95', '96-111', - '128-143', '144-159', '160-175', '191-206', '207-222', '223-238'] - core_255_unlimit_affinity = '0-159' - core_count=int(subprocess.check_output(['nproc', '--all'])) - - if core_count == 192: - affinity_list = core_192_affinity - unlimit_affinity = core_192_unlimit_affinity - elif core_count == 256: - affinity_list = core_256_affinity - unlimit_affinity = core_256_unlimit_affinity - elif core_count == 255: - affinity_list = core_255_affinity - unlimit_affinity = core_255_unlimit_affinity - affinity_str = "" - taskset_prefix = "" - if 'no_taskset' not in extra_decorator_info: - if affinity_list and 'overall_networks' not in env_type: - if 'dryrun' in env_type: - affinity_str = affinity_list[7 + int(self.device_id[-1])] - else: - affinity_str = affinity_list[int(self.device_id[-1])] - - if affinity_str: - taskset_prefix = 'taskset -c {}'.format(affinity_str) - - if taskset_prefix: - pytest = '{} {}'.format(taskset_prefix, pytest) - else: - if unlimit_affinity and 'overall_networks' not in env_type: - taskset_prefix = 'taskset -c {}'.format(unlimit_affinity) - pytest = '{} {}'.format(taskset_prefix, pytest) - # dryrun extra env if 'dryrun' in env_type: if 'dryrun_args' not in extra_decorator_info: @@ -232,7 +193,7 @@ class DefaultCaseExecutor(object): timer.cancel() cmd_status = out.decode("utf8", errors="ignore").strip().split("\n") - self.logger.info("run case finish, out: %s, err : %s", out, err) + self.logger.info("run case finish, cmd_status:%s, out: %s, err : %s", cmd_status, out, err) # nosetests进程被杀,返回结果为task id if cmd_status == self.case_info.get("taskid")[-1]: self.logger.error( @@ -282,6 +243,23 @@ class DefaultCaseExecutor(object): "{0} networks wait {1} seconds for device release".format( yose_env_type, seconds)) time.sleep(seconds) + # 清理覆盖率残留数据 + coverage_utils.generate_covdata() + caseName = self.case_path + "/" + self.case_info.get("caseid") + ".py" + if class_info: + caseName += f"::{class_info}" + if func: + caseName += f"::{func}" + caseUri = "Ascend910B_" + caseName + try: + self.logger.info("--------------------%s start time %s" % (caseName, time.time())) + self.logger.info("%s %s %s" %(self.caseNo, caseName, caseUri)) + coverage_utils.cov_data_tar("/home/jenkins/hitest/union/covdata.tar.gz", self.caseNo, caseName, caseUri) + except Exception as e: + self.logger.error(e) + finally: + self.caseNo += 1 + self.logger.info("--------------------%s end time %s" % (caseName, time.time())) return self.result, self.exit_flag, nose_cmd @@ -402,6 +380,8 @@ class DefaultCaseExecutor(object): upload_result_ins = YosemiteResult() self.case_info["end"] = "%.3f" % (time.time()) self.case_info["run_case_cmd"] = self.run_case_cmd + print("============== set result unavailable timeout") + self.logger.error("set result unavailable timeout") self.case_info["result"] = "unavailable" if not upload_result_ins.put_result(result=self.case_info): self.logger.error( diff --git a/script/case_parser.py b/script/case_parser.py index 94687ae..b27499d 100644 --- a/script/case_parser.py +++ b/script/case_parser.py @@ -887,7 +887,7 @@ class CaseParser(object): with SSHHelper(ftp_ip, logger=self.logger, access_name=ftp_user, access_word=ftp_password) as ssh_helper: remote_dir = os.path.join(ftp_log_path, job_name, str(build_num)) - + ssh_helper.run_cmd(r"mkdir -p {0};".format(remote_dir)) # 复制csv文件 self.scp_files(ssh_helper, csv_file, os.path.join(remote_dir, file_name)) # 修改文件权限 diff --git a/script/exec_case_filter.py b/script/exec_case_filter.py index 76b9945..b49923c 100644 --- a/script/exec_case_filter.py +++ b/script/exec_case_filter.py @@ -33,7 +33,7 @@ parser.add_argument("--env_ip", dest="env_ip", required=True, help='env ip', type=str) parser.add_argument("--env_type", dest="env_type", required=True, help='env type', type=str) -parser.add_argument("--is_print_screen", dest="is_print_screen", required=False, +parser.add_argument("--is_print_screen", dest="is_print_screen", required=False, default=True, help='print debug message to screen or not', type=str) @@ -83,6 +83,7 @@ class ExecCaseFilter(object): is_print_screen=is_print_screen) self.logger.info("CaseFilter start at {0}".format( datetime.now().strftime('%Y-%m-%d %H:%M:%S %f'))) + self.logger.info("================================ is_print_screen:%s" % is_print_screen) def create_init_py(self, filepath): init_file = os.path.join(filepath, "__init__.py") @@ -101,6 +102,7 @@ class ExecCaseFilter(object): def clear_last_tmp_file(self): clear_tmp_file_cmd = """ rm -f %s ;rm -f %s """ % ( self.tmp_case_txt, self.tmp_attr_case_json) + self.logger.info(clear_tmp_file_cmd) os.system(clear_tmp_file_cmd) def get_ready_for_filter(self): @@ -139,7 +141,9 @@ class ExecCaseFilter(object): # 先查询本环境是否有配置用例 get_cases_info_cmd = """ grep -rE "%s" %s/* --include="test_*.py" """ % ( search_case_type, self.case_root) + print("============----------get_cases_info_cmd:%s" % get_cases_info_cmd) status, output = getstatusoutput(get_cases_info_cmd) + print("-----------========== status:%s, output:%s" % (status, output)) if int(status) == 1 and not output: msg = "get_singel_env_case_filter :: no suitable cases found for search_case_type:{0}".format( search_case_type) @@ -184,18 +188,18 @@ class ExecCaseFilter(object): else: case_type_filter += " or {0}".format(case_type) case_type_filter += ")" - filter_case_cmd = """ {0};export PYTHONPATH={1}:/home/jenkins/mindspore/testcases/testcases:$PYTHONPATH;""" \ - """cd {1} && {2} --collect-only -m '{3} and {4}' """\ - """ -c {5} {6} 2>&1 >{7}""". \ + """cd {1} && {2} --collect-only -m '{3} and {4}' """\ + """ -c {5} {6} 2>&1 >{7}""". \ format(extend_yosemite_envs, case_path, pytest_path, - self.filter_keyword, case_type_filter, - self.pytest_ini, case_file, tmp_file) + self.filter_keyword, case_type_filter, + self.pytest_ini, case_file, tmp_file) self.logger.info( "filer_case_with_one_dir filter_case_cmd is : {0}".format( filter_case_cmd)) status, output = getstatusoutput(filter_case_cmd) + self.logger.info(output) if int(status) == 5: self.logger.warning( "no any gate test case to be found in {0}".format(case_path)) @@ -233,8 +237,8 @@ class ExecCaseFilter(object): msg = "filer_case_with_files failed, no such env config for ip :{0}".format( self.env_ip) self.logger.error(msg) - print(msg) return False + self.logger.info("extend_yosemite_envs:%s,pytest_path:%s" % (extend_yosemite_envs, pytest_path)) if not extend_yosemite_envs: extend_yosemite_envs = \ self.env_net_config['exec_machine']['env_list']['common'].get( @@ -245,7 +249,7 @@ class ExecCaseFilter(object): 'common'].get('pytest_path', "pytest") extend_yosemite_envs = """ source /etc/profile;{0} """.format( extend_yosemite_envs) - + self.logger.info("extend_yosemite_envs:%s,pytest_path:%s" % (extend_yosemite_envs, pytest_path)) # 每个目录开启一个线程进行筛选 t_thread_list = CommonThread() dir_info = self.get_filter_file_dirs(file_list) @@ -267,20 +271,20 @@ class ExecCaseFilter(object): # 筛选成功,将信息写临时筛选文件,供属性解析使用 fuse_cmd = """ [ -f {0} ] && cat {0} >> {1} ; rm -f {0}""".format( output_path, self.tmp_case_txt) + self.logger.info(fuse_cmd) os.system(fuse_cmd) - + self.logger.info(fail_filter_list) # 有筛选失败文件,打印失败详情 if fail_filter_list: for fail_filter in fail_filter_list: file_path = fail_filter["file_path"] output_path = fail_filter["output_path"] msg = "filter failed for {0}".format(file_path) - print(msg) self.logger.error(msg) print_fail_cmd = "[ -f {0} ] && cat {0} ; rm -f {0}".format( output_path) + self.logger.error(print_fail_cmd) status, output = getstatusoutput(print_fail_cmd) - print(output) self.logger.warning(output) return False @@ -301,16 +305,17 @@ class ExecCaseFilter(object): search_case_type = case_type else: search_case_type += "|{0}".format(case_type) + self.logger.info("search case type:%s" % search_case_type) if not search_case_type: msg = "get_singel_env_case_filter, no suitable case_env_config element found for env : {0}".format( self.env_type) - print(msg) self.logger.error(msg) self.restore_origin_case() return False, None # 先过滤出文件 ret_val, search_file_list = self.get_suitable_file(search_case_type) + self.logger.info(ret_val) # 筛选成功,只是没有一个符合条件的用例文件 if not ret_val and isinstance(search_file_list, ( str,)) and search_file_list == "cases result is null": @@ -327,7 +332,6 @@ class ExecCaseFilter(object): ret_val = self.filer_case_with_files(search_file_list, search_case_type) except Exception as e: msg = "filer_case_with_files exception:{0}".format(e) - print(msg) self.logger.error(msg) ret_val = False finally: @@ -531,7 +535,6 @@ class ExecCaseFilter(object): process_pool.close() else: message = "mul_parser_case_attr failed for process_pool run" - print(message) self.logger.error(message) return None @@ -541,7 +544,6 @@ class ExecCaseFilter(object): if None in cases_attr_info: message = "mul_parser_case_attr :: some case module parser failed" self.logger.error(message) - print(message) return None return cases_attr_info @@ -549,6 +551,7 @@ class ExecCaseFilter(object): def filter_main(self): # 先查询本环境是否有配置用例,没有配置用例也算成功 filer_ret, msg = self.get_env_case_filter() + self.logger.info("filer_ret:%s, msg:%s" % (filer_ret, msg)) if not filer_ret: if not msg: self.logger.error("get_env_case_filter failed") @@ -559,6 +562,7 @@ class ExecCaseFilter(object): return True module_content = self.parser_case_module() + if not module_content: msg = "filter_main parser_case_module failed, no available case for {0}".format( self.filter_keyword) @@ -567,6 +571,7 @@ class ExecCaseFilter(object): # 提炼attr 属性信息 cases_attr_info = self.mul_parser_case_attr(module_content) + self.logger.info("case attr info: %s" % cases_attr_info) if not cases_attr_info: msg = "filter_main parser_case_attr failed, no available case attr for {0}".format( self.filter_keyword) diff --git a/script/run_cases.py b/script/run_cases.py index e66991a..12ec65b 100644 --- a/script/run_cases.py +++ b/script/run_cases.py @@ -9,6 +9,7 @@ import sys import json import argparse import requests +import yaml from datetime import datetime from copy import deepcopy from subprocess import getstatusoutput @@ -20,6 +21,7 @@ sys.path.insert(0, sault_root_path) from script.case_parser import CaseParser from common.common_thread import RhineThread from common.ssh_helper import SSHHelper +from yosemite import aurogon_utils # 解析相关参数 parser = argparse.ArgumentParser() @@ -1236,7 +1238,7 @@ if __name__ == '__main__': sault_root_path, '3rdparty/config/case_env_config.yaml') input_args = (args.case_root, case_env_config_path) - is_print_screen = args.is_print_screen.lower() if args.is_print_screen else "false" + is_print_screen = str(args.is_print_screen).lower() if args.is_print_screen else "false" is_print_screen = True if is_print_screen == "true" else False failed_stop = args.failed_stop if args.failed_stop else "true" @@ -1245,7 +1247,8 @@ if __name__ == '__main__': post_run_case_ops = args.post_run_case_ops post_task_fail_script = args.post_task_fail_script none_case_fail = args.none_case_failed - + if "all" in args.filter_keyword: + args.filter_keyword = "\'(level0 or level1)\'" input_kwargs = { "filter_keyword": args.filter_keyword, "timeout": args.timeout if args.timeout else 0, @@ -1275,7 +1278,37 @@ if __name__ == '__main__': run_case.output_help_info(msg) sys.exit(0) + # 清除由筛选用例所产生的covdata + aurogon_utils.cleanup_covdata() + run_case_result = run_case.run_case_main() + + # 创建版本 用于绑定执行任务 + with open("/home/jenkins/config/coverage_config.yaml", mode='r') as f: + aurogon_config = yaml.load(f.read(), Loader=yaml.FullLoader) + + upload = aurogon_utils.Upload_COV(7, aurogon_config['aurogon_build_name'], aurogon_config['aurogon_task_name'], aurogon_config['third_task_id'], token=aurogon_config['token']) + aurogon_versionId = None + response = upload.create_version(0, 2, f"version-{datetime.now().strftime('%Y%m%d')}", 3) + print(response.json()) + if str(response.json()['code']) in ["200", "201"]: + aurogon_versionId = response.json()['data']['id'] + + # 获取当前taskid + task_response = upload.get_task_by_page() + aurogon_task_id = None + if task_response.json()['code'] == 200: + for task in task_response.json()['list']: + print(task.get("name")) + if task['name'] == upload.task_name: + # aurogon_task_id = task['id'] + aurogon_task_id = task.get("id") + break + + # 绑定任务 + if aurogon_versionId and aurogon_task_id: + upload.merge_task(aurogon_task_id, aurogon_versionId) + if not run_case_result: # logger.error("run case failed for run cases") sys.exit(2) diff --git a/yosemite/aurogon_utils.py b/yosemite/aurogon_utils.py new file mode 100644 index 0000000..a951540 --- /dev/null +++ b/yosemite/aurogon_utils.py @@ -0,0 +1,207 @@ +import requests +import os +import time +import base64 +import json +import subprocess +import yaml + +aurogon_base_path = "/home/jenkins/hitest" + +def cleanup_covdata(): + cmd = "rm -rf {0}/covdata/*".format(aurogon_base_path) + print(cmd) + status, output = subprocess.getstatusoutput(cmd) + if status: + os.popen(cmd).read() + +class Upload_COV(): + + def __init__(self, lang, build_name, task_name, third_task_id, token=None): + self.token = None + if token: + self.token = token + self.base_url="http://8.92.9.31:8080" + self.lang = lang + self.build_name = build_name + self.task_name = task_name + self.third_task_id = third_task_id + self.aurogon_base_path = "/home/jenkins/hitest" + self.task_ids = [] + self.version_id = None + + def login(self, user, passwd): + """ + param: user + param: passwd + """ + # token Valid for 7 days + url = f'{self.base_url}/auth/login' + payload = { + 'account': user, + 'password': str(base64.b64encode(bytes(passwd, encoding = "utf8")), encoding = "utf-8") + } + headers = { + "Content-Type": "application/json" + } + response = requests.post(url, data=json.dumps(payload), headers=headers) + if response.status_code == 200: + self.token = json.loads(response.text)['data'] + + def cov_stub_tar(self, stub_path): + url = f'{self.base_url}/cov/build/create' + headers = { + 'Authorization': self.token + } + + with open(stub_path, 'rb') as f: + payload = { + 'lang': self.lang, + 'name': self.build_name + } + files = {'file': f} + response = requests.post(url, headers=headers, data=payload, files=files) + print(response) + + def cov_data_tar(self, cov_path, caseNo, caseName, caseUri): + url = f'{self.base_url}/test/task_case/auto/upload_case_coverage' + headers = { + 'Authorization': self.token + } + + payload = { + 'taskName': self.task_name, + 'lang': self.lang, + 'thirdTaskId': self.third_task_id, + 'buildName': self.build_name, + 'caseCreateBo.no':caseNo, + 'caseCreateBo.uri':caseUri, + 'caseCreateBo.name':caseName, + 'caseCreateBo.productId': 1 + } + cov_f = open(cov_path, 'rb') + files = { + 'coverFile': cov_f, + } + # print(payload) + response = requests.post(url, headers=headers, data=payload, files=files) + print(response) + if not self.task_ids: + self.task_ids.append(response.json()["data"]["buildId"]) + # print(response) + return response + + def generate_covdata(self): + cmd = "rm -rf {0}/union/covdata.tar.gz; rm -rf {0}/union/covdata/covdata_c_class/*;\ + rm -rf {0}/union/covdata/covdata_python/*; cp -r {0}/covdata/* {0}/union/covdata/covdata_c_class/;\ + mv {0}/covdata/* {0}/union/covdata/covdata_python/ && rm -rf {0}/union/covdata/covdata_python/lltcov;\ + cd {0}/union && tar -zcf covdata.tar.gz covdata".format(self.aurogon_base_path) + print(cmd) + status, output = subprocess.getstatusoutput(cmd) + print("generate_covdata status: %s, output: %s" % (status, output)) + + def create_version(self, coverage_type, parentId, name, version_type): + url = f'{self.base_url}/base/version/create' + headers = { + 'Authorization': self.token, + 'Content-Type': "application/json" + } + payload = { + "almRootType": "", + "almSourceType": None, + "coverageType": coverage_type, # 0:函数 1:行覆盖率 2:分支覆盖率 + "description": "", + "funDomain":"", + "iterationField": None, + "iterationId": None, + "label": None, + "name": name, + "needInherit": False, + "no":"", + "pbi": "", + "reqDomain":"", + "source": 1, + "stubExcludePath":"", + "syncPeriod": 0, + "type": version_type, # 1=产品 2=分支 3=版本 + "unionBase": False, + } + + # 分支或版本 需要parentId + if int(coverage_type) != 1 and parentId: + payload["parentId"] = parentId + + response = requests.post(url, headers=headers, data=json.dumps(payload)) + try: + self.version_id = response.json()["data"]["id"] + except Exception as e: + print(e) + print("Response:") + print(response.text) + return response + + def get_version_list(self, version_type): + # version_type: 1=产品 2=分支 3=版本 + headers = { + 'Authorization': self.token + } + url = f'{self.base_url}/base/version/list?type={version_type}' + response = requests.get(url, headers=headers) + return response.json()["data"] + + def get_task_by_page(self): + headers = { + 'Authorization': self.token + } + url = f'{self.base_url}/test/task/page?current=1&size=10&needDetail=false' + response = requests.get(url, headers=headers) + return response + + def merge_task(self, task_id, version_id): + url = f'{self.base_url}/code_coverage/tree/merge_task' + headers = { + 'Authorization': self.token, + 'Content-Type': "application/json" + } + payload = { + "meregeType": 0, + "taskIds": [task_id], # 测试任务的taskId,通过 cov_data_tar 获取 + "versionId": version_id, # 调用create_version获取 + "groupId": version_id + } + response = requests.post(url, headers=headers, data=json.dumps(payload)) + # 响应: + #{ + # code:200 + # message: "messages" + # success: true + #} + return response + + def commend_case_by_func(self, versionId, funcInfos): + headers = { + 'Authorization': self.token, + 'Content-Type': "application/json" + } + url = f'{self.base_url}/case_recommend/commend_by_func' + payload = { + "versionId": versionId, + "funcInfos": funcInfos, + "selectType": "ALL", + "source": None, + "caseRate": None + } + response = requests.post(url, headers=headers, data=json.dumps(payload)) + return response + + +if __name__ == "__main__": + build_name = os.environ.get('HITEST_BUILD_NAME') + task_name = os.environ.get('HITEST_TASK_NAME') + third_task_id = os.environ.get('HITEST_THIRD_TASK_ID') + cov = Upload_COV(7, build_name, task_name, third_task_id) + cov.login("admin", "admin") + jobdata = {"token": cov.token, "aurogon_build_name": build_name, "aurogon_task_name": task_name, "third_task_id": third_task_id} + with open("/home/jenkins/config/coverage_config.yaml", mode='w') as f: + f.write(yaml.dump(jobdata)) + f.close() \ No newline at end of file diff --git a/yosemite/yosemite_main.py b/yosemite/yosemite_main.py index 5d11fd5..4545e01 100644 --- a/yosemite/yosemite_main.py +++ b/yosemite/yosemite_main.py @@ -18,6 +18,7 @@ try: from yosemite.yosemite_debug import start_debug from yosemite.yosemite_startcheck import EnvStatusCheck from yosemite.yosemite_register import YosemiteRegister + from yosemite.aurogon_utils import Upload_COV except ImportError: raise @@ -134,6 +135,7 @@ class YosemiteMain(object): self.cur_result["run_case_cmd"] = run_case_cmd if not ret: if status == "abort": + print("============= abort") self.cur_result["result"] = "unavailable" else: self.cur_result["result"] = "fail" @@ -175,6 +177,7 @@ class YosemiteMain(object): # 导入执行器,如果导入失败,则使用默认执行器 case_executor_pkg = "sault.{0}.executor.{1}_case_executor".format(yosemite_base.work_version.lower(), exec_platform.lower()) + self.logger.debug(case_executor_pkg) try: case_exec = __import__(case_executor_pkg, fromlist=case_executor_pkg.split(".")[-1:]) case_executor = getattr(case_exec, "{0}CaseExecutor".format(exec_platform.capitalize())) -- 2.33.0