From 4356eb7e33ef69271541dad9bf6e564706b7a454 Mon Sep 17 00:00:00 2001 From: MementoMori <1003350679@qq.com> Date: Tue, 29 Nov 2022 16:49:56 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E8=B0=83=E6=95=B4doc=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E4=B8=AD=E5=A4=B1=E6=95=88=E7=9A=84=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...205\215\347\275\256\350\257\264\346\230\216.md" | 4 ++-- ...205\215\347\275\256\346\214\207\345\257\274.md" | 6 +++--- ...212\202\347\202\271\351\225\234\345\203\217.md" | 4 ++-- ...216\222\346\237\245\346\211\213\345\206\214.md" | 14 +++++++------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git "a/doc/jenkins-comment\351\205\215\347\275\256\350\257\264\346\230\216.md" "b/doc/jenkins-comment\351\205\215\347\275\256\350\257\264\346\230\216.md" index ba23789..ca78bcf 100644 --- "a/doc/jenkins-comment\351\205\215\347\275\256\350\257\264\346\230\216.md" +++ "b/doc/jenkins-comment\351\205\215\347\275\256\350\257\264\346\230\216.md" @@ -121,9 +121,9 @@ set +e 此操作重新安排失败的构建。 注意:立即重新安排失败的构建, 配置适当的延迟或限制最大重试次数。 -**Fixed delay:**对不稳定的构建和失败重新运行构建,延迟时间为60秒 +**Fixed delay:** 对不稳定的构建和失败重新运行构建,延迟时间为60秒 -**Maximum number of successive failed builds:**限制连续失败的构建重试。 设置为 0 表示没有限制。 +**Maximum number of successive failed builds:** 限制连续失败的构建重试。 设置为 0 表示没有限制。 diff --git "a/doc/trigger\351\205\215\347\275\256\346\214\207\345\257\274.md" "b/doc/trigger\351\205\215\347\275\256\346\214\207\345\257\274.md" index 24bf35e..161bb9f 100644 --- "a/doc/trigger\351\205\215\347\275\256\346\214\207\345\257\274.md" +++ "b/doc/trigger\351\205\215\347\275\256\346\214\207\345\257\274.md" @@ -48,7 +48,7 @@ https://openeulerjenkins.osinfra.cn/job/multiarch/job/src-openeuler/job/trigger/ ### 构建主流程代码配置 -此处为构建的主要流程,当前代码路径在https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/lib/trigger.sh,该代码在门禁docker创建上会自动部署。 +此处为构建的主要流程,当前代码路径在https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/lib/trigger.sh ,该代码在门禁docker创建上会自动部署。 其中如果需要自己调试的话,可以放开下面注释内容,把代码换成自己要验证的代码路径 @@ -64,7 +64,7 @@ https://openeulerjenkins.osinfra.cn/job/multiarch/job/src-openeuler/job/trigger/ ### 构建后操作 -**Projects to build:**trigger工程完成后会自动启动此处配置的工程,一般为x86和aarch64两个架构的build工程。如果只需要某个仓库只支持一个架构构建,此处只填写支持架构的工程即可,另外需要在https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/jobs/soe_exclusive_config.yaml里的arch_config把这个包加上。 +**Projects to build:**trigger工程完成后会自动启动此处配置的工程,一般为x86和aarch64两个架构的build工程。如果只需要某个仓库只支持一个架构构建,此处只填写支持架构的工程即可,另外需要在https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/jobs/soe_exclusive_config.yaml 里的arch_config把这个包加上。 **Trigger when build is:**Stable,unstable or failed,but not aborted @@ -114,5 +114,5 @@ SSH Username with private key - SSH 公钥/私钥对 Certificate - a PKCS#12 证书文件 和可选密码 -**ID:**在 ID 字段中,必须指定一个有意义的Credential ID,注意: 该字段是可选的。 如果没有指定值, Jenkins 则Jenkins会分配一个全局唯一ID(GUID)值。 +**ID:** 在 ID 字段中,必须指定一个有意义的Credential ID,注意: 该字段是可选的。 如果没有指定值, Jenkins 则Jenkins会分配一个全局唯一ID(GUID)值。 diff --git "a/doc/\346\233\264\346\226\260\351\227\250\347\246\201\347\216\257\345\242\203\350\212\202\347\202\271\351\225\234\345\203\217.md" "b/doc/\346\233\264\346\226\260\351\227\250\347\246\201\347\216\257\345\242\203\350\212\202\347\202\271\351\225\234\345\203\217.md" index 2b605b1..bb23fd1 100644 --- "a/doc/\346\233\264\346\226\260\351\227\250\347\246\201\347\216\257\345\242\203\350\212\202\347\202\271\351\225\234\345\203\217.md" +++ "b/doc/\346\233\264\346\226\260\351\227\250\347\246\201\347\216\257\345\242\203\350\212\202\347\202\271\351\225\234\345\203\217.md" @@ -43,7 +43,7 @@ jenkins_ci_soe包含4个任务: ### 1.1 调用方法 -工程链接https://openeulerjenkins.osinfra.cn/job/multiarch/job/build-docker-image/job/jenkins-ci-soe/job/_trigger/,点击构建时需要选择要打成镜像的tag版本号,此处绑定的是openeuler-jenkins代码的tag。 +工程链接https://openeulerjenkins.osinfra.cn/job/multiarch/job/build-docker-image/job/jenkins-ci-soe/job/_trigger/ ,点击构建时需要选择要打成镜像的tag版本号,此处绑定的是openeuler-jenkins代码的tag。 这个任务会调用build-image-aarch64和build-image-x86-64的执行。 @@ -51,7 +51,7 @@ jenkins_ci_soe包含4个任务: 参数化构建:添加下拉框选择源码中的tag号。 -源码管理:连接的是jenkins门禁代码:https://gitee.com/openeuler/openeuler-jenkins,添加代码账号凭证获取代码。 +源码管理:连接的是jenkins门禁代码:https://gitee.com/openeuler/openeuler-jenkins ,添加代码账号凭证获取代码。 build:build中没有什么实际操作 diff --git "a/doc/\351\227\250\347\246\201\351\227\256\351\242\230\346\216\222\346\237\245\346\211\213\345\206\214.md" "b/doc/\351\227\250\347\246\201\351\227\256\351\242\230\346\216\222\346\237\245\346\211\213\345\206\214.md" index 35b02ba..1703bdc 100644 --- "a/doc/\351\227\250\347\246\201\351\227\256\351\242\230\346\216\222\346\237\245\346\211\213\345\206\214.md" +++ "b/doc/\351\227\250\347\246\201\351\227\256\351\242\230\346\216\222\346\237\245\346\211\213\345\206\214.md" @@ -70,7 +70,7 @@ Provides和Requires信息 **注意:pr合入后,obs会自动启动编译,但是归档到二进制仓库中可能有延迟。** - **obs的repo源:http://119.3.219.20:82/,这个repo源在工程稳定的时候会自动更新。** + obs的repo源:http://119.3.219.20:82/,这个repo源在工程稳定的时候会自动更新。 #### 3.1.3 check_install过程中缺少依赖包 @@ -84,7 +84,7 @@ nothing provides libperl.so.5.34()(64bit) needed by perl-version-8:0.99.29-1.oe1 **定位解决:** -从上图可以看出来,安装过程中有依赖perl相关的包,但是在repo源:http://119.3.219.20:82/openEuler:/对应的分支目录下没有对应的包,查找是否存在缺少的依赖包,如果该repo确实不存在,请联系obs接口 +从上图可以看出来,安装过程中有依赖perl相关的包,但是在repo源:http://119.3.219.20:82/openEuler:/ 对应的分支目录下没有对应的包,查找是否存在缺少的依赖包,如果该repo确实不存在,请联系obs接口 ### 3.2 pr触发没显示结果 @@ -108,19 +108,19 @@ PR中打了ci_processing标签,但是长时间没有门禁结果的回显信 如果pr中已经打了ci_processing标签,说明门禁工程正在运行中,可以根据**附件2:门禁入口链接**分别进入trigger、x86-64、aarch64、comment工程中查看工程是否正在运行: -a. 如果进度条在不停刷新,但是进度条为蓝色,如下图,表示门禁正在运行中,耐心等待即可; +a. 进度条在不停刷新,但是进度条为蓝色,如下图,表示门禁正在运行中,耐心等待即可; ![1648707133573](images/ci_processing_blue.png) -b. 如果进度条在执行,但是进度条变红,说明执行时间太长,可能出现卡死情况; +b. 进度条在执行,但是进度条变红,如下图,说明执行时间太长,可能出现卡死情况,请联系门禁接口人处理; ![1648716532044](images/ci_processing_red.png) -c. 如果没有分配到资源,如下图提示,请耐心等待,长时间还没有分配到资源的话,请联系基础设施接口人处理; +c. 没有分配到资源,如下图提示,请耐心等待,长时间还没有分配到资源的话,请联系基础设施接口人处理; ![1648707620036](images/no_excuter.png) -d. 如果出现如下图提示,表示当前仓库已经有pr正在构建,请等待执行;(同一仓库的门禁是串行的,非同一仓库的门禁任务可以并行) +d. 出现如下图提示,表示当前仓库已经有pr正在构建,请等待执行(同一仓库的门禁是串行的,非同一仓库的门禁任务可以并行); ![1648707269226](images/in_processing.png) -e. 如果出现如下图提示,表示当前节点可能在重启,如果长时间保持这种状态,请联系基础设施接口人处理: +e. 出现如下图提示,表示当前节点可能在重启,如果长时间保持这种状态,请联系基础设施接口人处理; ![1648707517272](images/excuter_offline.png) #### 3.3.3 门禁任务执行完成,但结果不回显 -- Gitee From f688d4c816dd2dd94a5b7677afb1cc228e325b2c Mon Sep 17 00:00:00 2001 From: Edward Wang Date: Mon, 5 Dec 2022 11:39:05 +0800 Subject: [PATCH 2/5] add CI support for BiShengCLanguage --- openeuler-ci/BiShengCLanguage.yaml | 8 ++++++++ src/ac/framework/ac.yaml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 openeuler-ci/BiShengCLanguage.yaml diff --git a/openeuler-ci/BiShengCLanguage.yaml b/openeuler-ci/BiShengCLanguage.yaml new file mode 100644 index 0000000..651763d --- /dev/null +++ b/openeuler-ci/BiShengCLanguage.yaml @@ -0,0 +1,8 @@ +repo_name: BiShengCLanguage +container_level: l2 +init_shell: "echo Hello BiShengC\necho $?" +users: + - login_name: EdwardWang + name: EdwardWang + email: wangyantao4@huawei.com + gitee_id: plt42 diff --git a/src/ac/framework/ac.yaml b/src/ac/framework/ac.yaml index 991cb07..f94da7b 100644 --- a/src/ac/framework/ac.yaml +++ b/src/ac/framework/ac.yaml @@ -62,7 +62,7 @@ openeuler: "yocto-poky", "bishengjdk-17", "bishengjdk-8", "bishengjdk-11", "bishengjdk-riscv", "powerapi", "eagle", "dcs", "astream", "QARobot", "oec-application", "gala-gopher", "gala-anteater", "gala-spider", "gala-ragdoll", "aops-zeus", "aops-ceres", "aops-apollo", "aops-diana", "aops-hermes", - "aops-vulcanus", "Kmesh"] + "aops-vulcanus", "Kmesh", "BiShengCLanguage"] commit_msg: hint: commit_msg module: commit_msg.check_commit_msg -- Gitee From 9cc67e6509a60a4abe6a2ecd5ee7290661c884b3 Mon Sep 17 00:00:00 2001 From: wwx1101975 Date: Tue, 6 Dec 2022 17:44:12 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E9=80=82=E9=85=8D2209=20repo=E6=BA=90?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/conf/project_host_mapping.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/conf/project_host_mapping.yaml b/src/conf/project_host_mapping.yaml index 4b1ae94..8e997dd 100644 --- a/src/conf/project_host_mapping.yaml +++ b/src/conf/project_host_mapping.yaml @@ -6,9 +6,6 @@ main: - openEuler:22.03:LTS:SP1:Epol - openEuler:22.03:LTS:LoongArch - openEuler:22.03:LTS:LoongArch:selfbuild:BaseOS - - openEuler:22.09 - - openEuler:22.09:Epol - - openEuler:22.09:Epol:Multi-Version:obs-server:2.10.11 - openEuler:Epol - openEuler:Extras - openEuler:Factory @@ -45,6 +42,9 @@ backend_002: - openEuler:22.03:LTS:Next:Epol:Multi-Version:OpenStack:Wallaby - openEuler:22.03:LTS:Next:Extras - openEuler:22.03:LTS:Next:selfbuild:BaseOS + - openEuler:22.09 + - openEuler:22.09:Epol + - openEuler:22.09:Epol:Multi-Version:obs-server:2.10.11 backend_003: host: "http://121.36.94.113:82" project_list: -- Gitee From 59b74f4567a7951cebb1f26d32227bd5e95b115e Mon Sep 17 00:00:00 2001 From: MementoMori <1003350679@qq.com> Date: Wed, 14 Dec 2022 10:22:48 +0800 Subject: [PATCH 4/5] doc add build error --- doc/images/obs_broken_package.png | Bin 0 -> 38843 bytes ...22\346\237\245\346\211\213\345\206\214.md" | 20 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 doc/images/obs_broken_package.png diff --git a/doc/images/obs_broken_package.png b/doc/images/obs_broken_package.png new file mode 100644 index 0000000000000000000000000000000000000000..ab943754c13dc254252e624e5754c6dc3db29c31 GIT binary patch literal 38843 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

II}KhwHy@cBwG&M5^lH;eV4Lj$brXYlLK?t0U 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 literal 0 HcmV?d00001 diff --git "a/doc/\351\227\250\347\246\201\351\227\256\351\242\230\346\216\222\346\237\245\346\211\213\345\206\214.md" "b/doc/\351\227\250\347\246\201\351\227\256\351\242\230\346\216\222\346\237\245\346\211\213\345\206\214.md" index 1703bdc..42cb44f 100644 --- "a/doc/\351\227\250\347\246\201\351\227\256\351\242\230\346\216\222\346\237\245\346\211\213\345\206\214.md" +++ "b/doc/\351\227\250\347\246\201\351\227\256\351\242\230\346\216\222\346\237\245\346\211\213\345\206\214.md" @@ -22,7 +22,9 @@ **报错信息:** -Error: Failed to retrieve plexus-archiver-3.6.0-3.oe1.noarch.rpm from the following locations (in order):http://117.78.1.88/build/openEuler:selfbuild:BaseOS/mainline_standard_x86_64/x86_64/_repository/plexus-archiver +Error: Failed to retrieve plexus-archiver-3.6.0-3.oe1.noarch.rpm from the following locations (in order): + +http://117.78.1.88/build/openEuler:selfbuild:BaseOS/mainline_standard_x86_64/x86_64/_repository/plexus-archiver **定位解决:** @@ -86,6 +88,22 @@ nothing provides libperl.so.5.34()(64bit) needed by perl-version-8:0.99.29-1.oe1 从上图可以看出来,安装过程中有依赖perl相关的包,但是在repo源:http://119.3.219.20:82/openEuler:/ 对应的分支目录下没有对应的包,查找是否存在缺少的依赖包,如果该repo确实不存在,请联系obs接口 +#### 3.1.4 编译依赖包有问题 + +![](images/obs_broken_package.png) + +**报错信息:** + +buildinfo is broken... it says: + +unresolvable: have choice for libcom_err.so.2()(64bit) needed by libtirpc: e2fsprogs libcom_err + +have choice for libcom_err.so.2()(64bit) needed by krb5-libs: e2fsprogs libcom_err + +**定位解决:** + +安装依赖包有问题,请联系obs接口 + ### 3.2 pr触发没显示结果 #### 3.2.1 门禁触发没有任何反应,retest也没有反应 -- Gitee From b1efe536a155db90f1140983ff6c30da0f056c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B1=E5=A0=82=E7=8F=82?= Date: Thu, 29 Dec 2022 19:33:17 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=8Espectool?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E4=B8=AD=E8=8E=B7=E5=8F=96source=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../source_consistency/check_consistency.py | 92 ++++++++++++++++--- src/ac/framework/ac.yaml | 4 +- 2 files changed, 80 insertions(+), 16 deletions(-) diff --git a/src/ac/acl/source_consistency/check_consistency.py b/src/ac/acl/source_consistency/check_consistency.py index 0e5cc92..16b604e 100644 --- a/src/ac/acl/source_consistency/check_consistency.py +++ b/src/ac/acl/source_consistency/check_consistency.py @@ -5,9 +5,9 @@ import re import stat import shutil import sqlite3 +import subprocess from sqlite3 import Error -from src.ac.common.gitee_repo import GiteeRepo from src.ac.framework.ac_base import BaseCheck from src.ac.framework.ac_result import FAILED, SUCCESS, WARNING @@ -48,18 +48,12 @@ class CheckSourceConsistency(BaseCheck): self.con.close() self.clear_temp() - @staticmethod - def get_package_from_source(url): - """ - 从url中获取包名 - """ - package_name = url.split("/")[-1].strip() - return package_name - @staticmethod def get_sha256sum(package): """ 计算文件的sha256sum值 + :param package:包路径 + :return: """ logger.info("getting sha256sum of native source package...") native_sha256sum = "" @@ -77,32 +71,51 @@ class CheckSourceConsistency(BaseCheck): logger.warning(e) return native_sha256sum.strip() + def get_package_name(self, url): + """ + 从文件列表或者url中获取包名 + """ + package_name = os.popen("ls -S {0} |grep -v .spec |grep -v .yaml |grep -v .patch |grep -v .md |head -n " + "1".format(self._work_dir)).read().split()[0] + if package_name == "": + package_name = os.path.basename(url) + return package_name + def check_source_consistency(self): """ 检查源码包是否一致 + :return: """ - os.makedirs(os.path.join(self.rpmbuild_dir, "SOURCES"), exist_ok=True) + if not os.path.exists(os.path.join(self.rpmbuild_dir, "SOURCES")): + os.makedirs(os.path.join(self.rpmbuild_dir, "SOURCES")) source_url = self.get_source_url() if source_url == "": logger.warning("no valid source url") + logger.info("Check source consistency warning: If you have some questions, you can ask WX1154966!") return WARNING - package_name = self.get_package_from_source(source_url) + package_name = self.get_package_name(source_url) if package_name not in os.listdir(self._work_dir): - logger.warning("no source package file") + logger.warning("no source package file in the repo, the package name is " + package_name) + logger.info("Check source consistency warning: If you have some questions, you can ask WX1154966!") return WARNING native_sha256sum = self.get_sha256sum(os.path.join(self._work_dir, package_name)) if native_sha256sum == "": logger.warning("get sha256sum of native source package failed") + logger.info("Check source consistency warning: If you have some questions, you can ask WX1154966!") return WARNING remote_sha256sum = self.get_sha256sum_from_url(source_url) if remote_sha256sum == "": - logger.warning("no url in source_clean.db") + logger.warning("no url in source_clean.db, please add it into source_clean.db in the web: " + "https://majun.osinfra.cn/sourceClean/index") + logger.info("Check source consistency warning: If you have some questions, you can ask WX1154966!") return WARNING if native_sha256sum != remote_sha256sum: - logger.error("repo is inconsistency") + logger.error("repo is inconsistency, please check the sha256sum in the web: " + "https://majun.osinfra.cn/sourceClean/index") + logger.info("Check source consistency warning: If you have some questions, you can ask WX1154966!") return FAILED return SUCCESS @@ -110,6 +123,7 @@ class CheckSourceConsistency(BaseCheck): def get_source_url(self): """ 获取spec文件中的Source URL + :return: """ spec_name = "" files_list = os.listdir(self._work_dir) @@ -125,12 +139,17 @@ class CheckSourceConsistency(BaseCheck): if spec_name == "": logger.error("no spec file, please check!") return "" - source_url = self.get_source_from_rpmbuild(spec_name) + source_url = self.get_source_from_spec(spec_name) + # If program can't get source url from spec, try to get source url by rpmbuild + if source_url == "": + source_url = self.get_source_from_rpmbuild(spec_name) return source_url def get_source_from_rpmbuild(self, spec_name=""): """ rpmbuild解析出可查询的Source URL + :param spec_name:spec文件名 + :return: """ if spec_name == "": spec_name = self._repo + ".spec" @@ -139,9 +158,45 @@ class CheckSourceConsistency(BaseCheck): source_url = self.do_rpmbuild() return source_url + def get_source_from_spec(self, spec_name=""): + """ + spec文件中得到可查询的Source URL + :param spec_name:spec文件名 + :return: + """ + if spec_name == "": + spec_name = self._repo + ".spec" + spec_file = os.path.join(self._work_dir, spec_name) + if not os.path.exists(spec_file): + temp_file_list = os.listdir(self._work_dir) + spec_file_list = [] + for temp_file in temp_file_list: + if temp_file.endswith(".spec"): + spec_file_list.append(temp_file) + if len(spec_file_list) == 1: + spec_file = os.getcwd() + os.path.sep + "gitee_code" + os.path.sep + self._repo + os.path.sep + \ + spec_file_list[0] + elif len(spec_file_list) > 1: + for s_file in spec_file_list: + if self._repo in s_file or s_file in self._repo: + spec_file = os.getcwd() + os.path.sep + "gitee_code" + os.path.sep + self._repo + os.path.sep +\ + s_file + else: + return "" + ret = subprocess.check_output(["/usr/bin/spectool", "-S", spec_file], shell=False) + content = ret.decode('utf-8').strip() + source_url = content.split(os.linesep)[0].strip() if os.linesep in content else content.strip() + if ":" in source_url: + source_url = ":".join(source_url.split(":")[1:]).strip() + elif "No such file or directory" in source_url: + return "" + return source_url + def generate_new_spec(self, spec_file): """ 读取spec文件并生成新的spec文件 + :param spec_file:spec文件名 + :return: """ logger.info("reading spec file : %s ...", os.path.basename(spec_file)) @@ -169,6 +224,8 @@ class CheckSourceConsistency(BaseCheck): def get_prep_function(self, url): """ 生成spec文件%prep部分的内容 + :param url:source0的值 + :return: """ logger.info("generating %prep function") function_content = "%prep" + os.linesep @@ -180,6 +237,7 @@ class CheckSourceConsistency(BaseCheck): def do_rpmbuild(self): """ 对新生成的spec文件执行rpmbuild + :return: """ logger.info("start to do rpmbuild") new_spec_file = os.path.join(self.rpmbuild_sources_path, "get_source.spec") @@ -195,6 +253,7 @@ class CheckSourceConsistency(BaseCheck): def create_connection(self): """ 与数据库建立连接 + :return: """ logger.info("getting connection with source_clean.db ...") try: @@ -208,6 +267,8 @@ class CheckSourceConsistency(BaseCheck): def get_sha256sum_from_url(self, url): """ 查询数据库,获取url的sha256sum值 + :param url:source0的值 + :return: """ logger.info("getting sha256sum of remote source package from source_clean.db ...") if self.con is None: @@ -223,6 +284,7 @@ class CheckSourceConsistency(BaseCheck): def clear_temp(self): """ 清理生成的中间文件 + :return: """ if os.path.exists(self._work_dir): shutil.rmtree(self._work_dir) diff --git a/src/ac/framework/ac.yaml b/src/ac/framework/ac.yaml index f94da7b..6a7c18f 100644 --- a/src/ac/framework/ac.yaml +++ b/src/ac/framework/ac.yaml @@ -30,7 +30,9 @@ src-openeuler: commit_msg: exclude: True source_consistency: - exclude: True + hint: check_consistency + module: source_consistency.check_consistency + entry: CheckSourceConsistency openeuler: spec: exclude: True -- Gitee