From 50649a8b31296a50902139edfdbc70535fb6b2de Mon Sep 17 00:00:00 2001 From: gitee-cmd Date: Mon, 26 Dec 2022 09:51:17 +0800 Subject: [PATCH 01/11] update release tools --- release-assistant/javcra/cli/commands/createpart.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release-assistant/javcra/cli/commands/createpart.py b/release-assistant/javcra/cli/commands/createpart.py index 95b1401..f85f519 100644 --- a/release-assistant/javcra/cli/commands/createpart.py +++ b/release-assistant/javcra/cli/commands/createpart.py @@ -51,7 +51,7 @@ class CreateCommand(BaseCommand): Args: params: Command line parameters """ - issue = UpdateIssue(GITEE_REPO, params.token) + issue = UpdateIssue(GITEE_REPO, params.token,"xx") create_res = issue.create_update_release() if create_res: logger.info("create release successfully.") -- Gitee From a94830b9d41b39318a6075e1baa29a3de583514c Mon Sep 17 00:00:00 2001 From: gitee-cmd Date: Tue, 3 Jan 2023 14:28:45 +0800 Subject: [PATCH 02/11] update support for openeuler 2203 SP1 --- release-assistant/javcra/common/constant.py | 8 +- .../check_requires/support_branch.yaml | 2 + .../yum.repo/openEuler-22.03-LTS-SP1.repo | 86 +++++++++++++++++++ 3 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 release-assistant/javcra/libs/config/checkpart/check_requires/yum.repo/openEuler-22.03-LTS-SP1.repo diff --git a/release-assistant/javcra/common/constant.py b/release-assistant/javcra/common/constant.py index 60b8559..eeb3c3e 100644 --- a/release-assistant/javcra/common/constant.py +++ b/release-assistant/javcra/common/constant.py @@ -74,7 +74,7 @@ AARCH_FRAME = "aarch64" X86_FRAME = "x86_64" # branch list for standard epol list -BRANCH_LIST = ["openEuler-20.03-LTS-SP1", "openEuler-20.03-LTS-SP3", "openEuler-22.03-LTS"] +BRANCH_LIST = ["openEuler-22.03-LTS-SP1", "openEuler-20.03-LTS-SP1", "openEuler-20.03-LTS-SP3", "openEuler-22.03-LTS"] # lts branch LTS_BRANCH = "openEuler-20.03-LTS" @@ -105,7 +105,8 @@ ACTUATOR_DICT = { "openEuler-20.03-LTS-SP2": "openeuler-20.03-lts-sp2", "openEuler-20.03-LTS-SP3": "openeuler-20.03-lts-sp3", "openEuler-20.03-LTS": "openeuler-20.03-lts", - "openEuler-22.03-LTS": "openeuler-22.03-lts" + "openEuler-22.03-LTS": "openeuler-22.03-lts", + "openEuler-22.03-LTS-SP1": "openeuler-22.03-lts-sp1" } # git warehouse address for release issue @@ -153,7 +154,8 @@ EPOL_DICT = { "openEuler-20.03-LTS-SP1": "EPOL", "openEuler-20.03-LTS-SP2": "EPOL-main", "openEuler-20.03-LTS-SP3": "EPOL-main", - "openEuler-22.03-LTS": "EPOL-main" + "openEuler-22.03-LTS": "EPOL-main", + "openEuler-22.03-LTS-SP1": "EPOL-main" } # comment dict diff --git a/release-assistant/javcra/libs/config/checkpart/check_requires/support_branch.yaml b/release-assistant/javcra/libs/config/checkpart/check_requires/support_branch.yaml index 8ba4925..574761d 100644 --- a/release-assistant/javcra/libs/config/checkpart/check_requires/support_branch.yaml +++ b/release-assistant/javcra/libs/config/checkpart/check_requires/support_branch.yaml @@ -9,3 +9,5 @@ openEuler : obs_alias: "openEuler:20.03:LTS:SP3" openEuler-22.03-LTS: obs_alias: "openEuler:22.03:LTS" + openEuler-22.03-LTS-SP1: + obs_alias: "openEuler:22.03:LTS:SP1" diff --git a/release-assistant/javcra/libs/config/checkpart/check_requires/yum.repo/openEuler-22.03-LTS-SP1.repo b/release-assistant/javcra/libs/config/checkpart/check_requires/yum.repo/openEuler-22.03-LTS-SP1.repo new file mode 100644 index 0000000..c0f0ac8 --- /dev/null +++ b/release-assistant/javcra/libs/config/checkpart/check_requires/yum.repo/openEuler-22.03-LTS-SP1.repo @@ -0,0 +1,86 @@ +#generic-repos is licensed under the Mulan PSL v2. +#You can use this software according to the terms and conditions of the Mulan PSL v2. +#You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +#THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +#PURPOSE. +#See the Mulan PSL v2 for more details. + +#binary repo + +[published-everything] +name=published-everything +baseurl=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/everything/$basearch/ +enabled=1 +gpgcheck=0 +priority=2 +gpgkey=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/everything/$basearch/RPM-GPG-KEY-openEuler + +[published-update] +name=published-update +baseurl=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/update/$basearch/ +enabled=1 +gpgcheck=0 +priority=1 +gpgkey=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/update/$basearch/RPM-GPG-KEY-openEuler + +[published-debuginfo] +name=published-debuginfo +baseurl=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/debuginfo/$basearch/ +enabled=0 +gpgcheck=0 +gpgkey=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/debuginfo/$basearch/RPM-GPG-KEY-openEuler + +[devel-obs] +name=devel-obs +baseurl=http://119.3.219.20:82/openEuler:/22.03:/LTS/standard_$basearch/ +enabled=1 +gpgcheck=0 +priority=3 + +#source repo + +[published-everything-src] +name=published-everything-src +baseurl=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/source +enabled=0 +gpgcheck=0 +gpgkey=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/source/$basearch/RPM-GPG-KEY-openEuler + +[published-update-src] +name=published-update-src +baseurl=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/update/source +enabled=0 +gpgcheck=0 +gpgkey=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/update/source/RPM-GPG-KEY-openEuler + +#EPOL binary repo + +[published-EPOL] +name=published-EPOL +baseurl=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/EPOL/$basearch/ +enabled=0 +gpgcheck=0 +gpgkey=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/OS/$basearch/RPM-GPG-KEY-openEuler + +[published-Epol-src] +name=published-Epol-src +baseurl=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/EPOL/main/source/ +enabled=0 +gpgcheck=0 +gpgkey=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/EPOL/main/source/RPM-GPG-KEY-openEuler + +[published-Epol-update-src] +name=published-Epol-update-src +baseurl=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/EPOL/update/main/source +enabled=0 +gpgcheck=0 +gpgkey=https://repo.openeuler.org/openEuler-22.03-LTS-SP1/EPOL/update/main/source/RPM-GPG-KEY-openEuler + +[devel-obs] +name=devel-obs +baseurl=http://119.3.219.20:82/openEuler:/22.03:/LTS:/SP1:/Epol/standard_$basearch/ +enabled=1 +gpgcheck=0 +priority=3 -- Gitee From b3e001a594960332ab4d9175812f6027a9436300 Mon Sep 17 00:00:00 2001 From: gitee-cmd Date: Tue, 3 Jan 2023 14:31:54 +0800 Subject: [PATCH 03/11] correct gitignore --- .gitignore | 23 +++++++++++++++++++ .../javcra/cli/commands/createpart.py | 2 +- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d84da7b..74d80ad 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,26 @@ */.DS_Store *.pyc *.vscode +/release-assistant/javcra/application/checkpart/.__log_info.lock +/release-assistant/test/test_check/.__log_info.lock +/release-assistant/tools/test.xls +/.idea/workspace.xml +/.idea/vcs.xml +/.idea/inspectionProfiles/Project_Default.xml +/release-assistant/javcra/application/modifypart/.__log_info.lock +/release-assistant/javcra/application/startpart/.__log_info.lock +/.__log_info.lock +/release-assistant/tools/auto_email.py +/release-assistant/tools/email_template.html +/release-assistant/javcra/application/checkpart/log_info.log +/release-assistant/javcra/application/startpart/log_info.log +/release-assistant/test/test_check/log_info.log +/.idea/inspectionProfiles/profiles_settings.xml +/release-assistant/javcra/api/github_api.py +/release-assistant/javcra/application/modifypart/log_info.log +/log_info.log +/release-assistant/javcra/cli/commands/log_info.log +/.idea/misc.xml +/.idea/modules.xml +/release-assistant/doc/backup.py +/.idea/.gitignore diff --git a/release-assistant/javcra/cli/commands/createpart.py b/release-assistant/javcra/cli/commands/createpart.py index f85f519..2fe2f37 100644 --- a/release-assistant/javcra/cli/commands/createpart.py +++ b/release-assistant/javcra/cli/commands/createpart.py @@ -51,7 +51,7 @@ class CreateCommand(BaseCommand): Args: params: Command line parameters """ - issue = UpdateIssue(GITEE_REPO, params.token,"xx") + issue = UpdateIssue(GITEE_REPO, params.token, "xx") create_res = issue.create_update_release() if create_res: logger.info("create release successfully.") -- Gitee From 3596dc195d9f42c18e759818ae3bb3723d0fbf74 Mon Sep 17 00:00:00 2001 From: gitee-cmd Date: Tue, 3 Jan 2023 14:38:30 +0800 Subject: [PATCH 04/11] resolve confict --- .../application/checkpart/repo_version.py | 320 ++++++++++++++++++ 1 file changed, 320 insertions(+) create mode 100644 release-assistant/javcra/application/checkpart/repo_version.py diff --git a/release-assistant/javcra/application/checkpart/repo_version.py b/release-assistant/javcra/application/checkpart/repo_version.py new file mode 100644 index 0000000..5189dc1 --- /dev/null +++ b/release-assistant/javcra/application/checkpart/repo_version.py @@ -0,0 +1,320 @@ +#!/usr/bin/python3 +# ****************************************************************************** +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. +# licensed under the Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +# PURPOSE. +# See the Mulan PSL v2 for more details. +# Author: Jiachen Fan +# Create: 2021-3-19 +# ******************************************************************************/ +import requests +import os +import abc +import logging +import yaml +import subprocess +import pandas as pd + +from src.util.requests_util import requests_get_content +from src.util.spec import Spec, replace_macros +from src.util.osc_utils import get_osc_pkg_nvr +from src.util.dnf_utils import dnf_list_src_version + +VERSION_CONF_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), + "config", + "openEuler_branch.yaml") + +""" +dnf install rpmdevtools +""" + + +class PkgVerInterface(metaclass=abc.ABCMeta): + """ + interface for get version from repo(i.e. gitee/obs/repo.openeuler.org) + """ + + def __init__(self, name, branch): + self.name = name + self.version = "" + self.release = "" + self.epoch = "0" + self.branch = branch + + def get_vr(self): + if not self.version or not self.release: + return "unknow" + return "{ver}-{rel}" \ + .format( + ver=self.version, + rel=self.release + ) + + def get_evr(self): + if not self.version or not self.release: + return "unknow" + return "{epoch}{ver}-{rel}" \ + .format( + epoch="" if self.epoch == "0" else (self.epoch + ":"), + ver=self.version, + rel=self.release + ) + + def __str__(self): + return self.get_evr() + + @abc.abstractmethod + def parse_content(self): + pass + + +class GiteePkgVer(PkgVerInterface): + """ + get pkg version from src-openeuler/pkg -> pkg.spec in xxx branch + parse spec to get Version:str, Release:str, Epoch:str(default 0) + """ + + def __init__(self, name, branch): + super(GiteePkgVer, self).__init__(name, branch) + self.spec_format_url = "https://gitee.com/src-openeuler/{name}/raw/{branch}/{name}.spec".format( + name=self.name, + branch=self.branch + ) + + def _check_branch(self): + openEuler_branch = {} + if not os.path.isfile(VERSION_CONF_FILE): + print("openEuler branch config file:[%s] not exist", openEuler_branch) + return False + with open(VERSION_CONF_FILE, "r") as f: + openEuler_branch = yaml.safe_load(f) + if not openEuler_branch or not openEuler_branch["openEuler_branch"].get(self.branch, None): + print("[%s] is not a openEuler branch name", self.branch) + return False + return True + + def _rpmspec_parse(self, file_name): + if not os.path.isfile(file_name): + print("spec file %s not exist", os.path.basename(file_name)) + return + + cmd_list = ["rpmspec", "--parse", file_name] + try: + proc = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + except OSError as e: + print("oserror: %s", str(e)) + return None, None + stdout, stderr = proc.communicate() + returncode = proc.returncode + proc.poll() + if returncode == 0: + inputspec = Spec.from_string(stdout.decode("utf-8", "ignore")) + else: + inputspec = Spec.from_file(file_name) + self.version = replace_macros(inputspec.version, inputspec) + self.release = replace_macros(inputspec.release, inputspec) + + def _parse_spec(self, content, savedir="/tmp/update-package", save=False): + _ = not os.path.exists(savedir) and os.makedirs(savedir) + file_name = os.path.join(savedir, "{}.spec".format(self.name)) + if os.path.isfile(file_name): + os.remove(file_name) + with open(file_name, "a") as f: + f.write(content) + self._rpmspec_parse(file_name) + if not save and os.path.exists(file_name): + os.remove(file_name) + + def parse_content(self): + if not self.name or not self.branch: + print("name or branch fields not exists") + return + print(self.spec_format_url) + if not self._check_branch(): + print("check branch failed") + return + status_code, content = requests_get_content(self.spec_format_url, timeout=30) + print(status_code) + print(content) + if not content: + return + self._parse_spec(content) + + +class OBSPkgVer(PkgVerInterface): + """ + get pkg version from repo + """ + REPO_ARCH_DICT = { + "arm": { + "repo": "standard_aarch64", + "arch": "aarch64" + }, + "x86": { + "repo": "standard_x86_64", + "arch": "x86_64" + } + } + + def __init__(self, name, branch): + super(OBSPkgVer, self).__init__(name, branch) + + def _check_parse_branch(self): + pass + + def _get_repo_arch(self, arch_key): + if arch_key not in self.REPO_ARCH_DICT: + print("[%s] key is not support", arch_key) + return "", "" + return self.REPO_ARCH_DICT[arch_key].get("repo", ""), \ + self.REPO_ARCH_DICT[arch_key].get("arch", "") + + def parse_content(self): + self._check_parse_branch() + arch_list = self.REPO_ARCH_DICT.keys() + print(arch_list) + for key in arch_list: + repo, arch = self._get_repo_arch(key) + name, ver, rel = get_osc_pkg_nvr(self.name, self.branch, repo=repo, arch=arch) + print("obs info:",name,ver,rel) + if ver: + self.version, self.release = ver, rel + break + + +class DNFPkgVer(PkgVerInterface): + def __init__(self, name, repo_list): + super(DNFPkgVer, self).__init__(name, repo_list) + + def parse_content(self): + self.epoch, self.version, self.release = dnf_list_src_version(self.name, self.branch) + + +class RepoPkgVer(object): + """ + to simply dip + use this case to get repo version and + """ + + def __init__(self, repo_pkg_ver): + self.repo_pkg_ver = repo_pkg_ver + + def parse_ver_info(self): + """ + use this function to fill version info into repo_pkg_ver + use this after init this function + """ + self.repo_pkg_ver.parse_content() + + def get_version(self): + """ + get pkg [version] from self.repo_pkg_ver + """ + return self.repo_pkg_ver.version + + def get_release(self): + """ + get pkg [release] from self.repo_pkg_ver + """ + return self.repo_pkg_ver.release + + def get_epoch(self): + """ + get pkg [epoch] from self.repo_pkg_ver + """ + return self.repo_pkg_ver.epoch + + def get_vr(self): + """ + get pkg [version-release] from self.repo_pkg_ver + """ + return self.repo_pkg_ver.get_vr() + + def get_evr(self): + """ + get pkg [epoch:version-release] from self.repo_pkg_ver + """ + return self.repo_pkg_ver.get_evr() + + def __str__(self): + """ + usage same as get_evr + print(RepoPkgVer) -> [epoch:version-release] + """ + return self.repo_pkg_ver.get_evr() + + +def get_pkgs(): + pkg_list = [] + try: + file = open("update_pkgs.txt") + for line in file: + if line.strip(): + pkg_list.append(line.strip()) + except FileNotFoundError: + print("update_pkgs.txt can not found") + except UnicodeDecodeError as err: + print(err) + return pkg_list + + +def get_pkgs_csv(repo_info_list): + total_DF = pd.DataFrame(columns=['pkgs', 'gitee-SP1', 'obs-SP1', "sp1-res", 'gitee-SP2', 'obs-SP2', "sp2-res", 'obs-SP3', "sp3-res", "gitee-2203", "obs-2203", "2203-res"]) + for pkg_repo in repo_info_list: + for pkg, repo_info in pkg_repo.items(): + data_dict = {'pkgs': pkg, + "gitee-SP1": repo_info[0], + "obs-SP1": repo_info[1], + "sp1-res": repo_info[2], + "gitee-SP2": repo_info[3], + "obs-SP2": repo_info[4], + "sp2-res": repo_info[5], + + "gitee-SP3": repo_info[6], + "obs-SP3": repo_info[7], + "sp3-res": repo_info[8], + "gitee-2203": repo_info[9], + "obs-2203": repo_info[10], + "2203-res": repo_info[11] + } + build_DF = pd.DataFrame(data=data_dict, index=[0]) + if len(build_DF): + total_DF = pd.concat([total_DF, build_DF], axis=0) + total_DF.index = range(len(total_DF)) + total_DF.to_csv("update_pkgs_repo.csv") + + +def compare_pkg_ver(origin_repo=GiteePkgVer, new_repo=OBSPkgVer): + pkg_list = get_pkgs() + gitee_branch_list = ["openEuler-20.03-LTS-SP1", "openEuler-20.03-LTS-SP2","openEuler-20.03-LTS-SP3", "openEuler-22.03-LTS"] + obs_branch_list = ["openEuler:20.03:LTS:SP1", "openEuler:20.03:LTS:SP2","openEuler:20.03:LTS:SP3", "openEuler-22.03-LTS"] + + repo_info_dict = [] + for pkg in pkg_list: + + pkg_version_list = [] + for branch_index in range(len(gitee_branch_list)): + old_pkg_repo = RepoPkgVer(origin_repo(pkg, gitee_branch_list[branch_index])) + new_pkg_repo = RepoPkgVer(new_repo(pkg, obs_branch_list[branch_index])) + old_pkg_repo.parse_ver_info() + new_pkg_repo.parse_ver_info() + + pkg_version_list.append(old_pkg_repo.get_vr()) + pkg_version_list.append(new_pkg_repo.get_vr()) + if old_pkg_repo.get_vr() == new_pkg_repo.get_vr(): + pkg_version_list.append("same") + else: + pkg_version_list.append("not same") + repo_info_dict.append({pkg: pkg_version_list}) + + return repo_info_dict + + +res = compare_pkg_ver() +get_pkgs_csv(res) + -- Gitee From 4004d727eaa629a62adf7a506db1cc3113d1cb88 Mon Sep 17 00:00:00 2001 From: gitee-cmd Date: Tue, 3 Jan 2023 14:38:51 +0800 Subject: [PATCH 05/11] resolve confict --- .../javcra/cli/commands/checkpart.py | 111 +++++++++++++++++- 1 file changed, 110 insertions(+), 1 deletion(-) diff --git a/release-assistant/javcra/cli/commands/checkpart.py b/release-assistant/javcra/cli/commands/checkpart.py index c2cc682..7ef197c 100644 --- a/release-assistant/javcra/cli/commands/checkpart.py +++ b/release-assistant/javcra/cli/commands/checkpart.py @@ -15,15 +15,20 @@ Description: check method's entrance for custom commands Class:CheckCommand """ import os +import smtplib import stat import uuid + +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from email.header import Header + from javcra.api.jenkins_api import JenkinsJob from javcra.application.checkpart.checkentrance import CheckEntrance from javcra.application.checkpart.checktest import CheckTest from javcra.application.modifypart.modifyentrance import IssueOperation from javcra.application.serialize.serialize import CheckSchema from javcra.cli.base import BaseCommand - from javcra.cli.commands import parameter_permission_validate from javcra.common import constant from javcra.common.constant import ( @@ -308,6 +313,9 @@ class CheckCommand(BaseCommand): Description: operation for check the version of pacakges Args: params: Command line parameters + + Returns: + jenkins_job_res: jenkins_job_res """ issue = self.issue(params) judege_res = self.judge_cve_bugfix_comment(issue, params) @@ -322,6 +330,107 @@ class CheckCommand(BaseCommand): with os.fdopen(os.open('update_packages.txt', flags, modes), 'w') as f: for pkg in update_pkgs: f.write("{}\n".format(pkg)) + f.close() + + def email_operation(self, params): + """ + Generate test email operation for update. + Args: + params: Command line parameters + + Returns: + + """ + issue_list = params.issue_list + frozen_date = params.frozen_date + + self.send_email(issue_list, frozen_date) + + def send_email(self, issues, frozen_date): + """ + Generate test email and send it to version manager. + Args: + issues: dict of release issues + frozen_date: forzen date of update + + Returns: + + """ + # SMTP Server + mail_host = "smtp.qq.com" + # sender email + mail_sender = "772193803@qq.com" + # auth license of the sender email + mail_license = "mxjpsbycwrtgbfbg" + # receiver email + mail_receivers = ["772193803@qq.com"] + + mm = MIMEMultipart("test_email") + # title + subject_content = "openEuler-20.03-LTS-SP1/" \ + "openEuler-20.03-LTS-SP3/" \ + "openEuler-22.03-LTS {} 版本转测".format(frozen_date) + + # set sender name + mm["From"] = "synox<772193803@qq.com>" + # set reveiver + mm["To"] = "synox<772193803@qq.com>" + # set title + mm["Subject"] = Header(subject_content, 'utf-8') + + # mail body + body_content = open("email_template.html", "r").read().format(sp1_issue=issues["openEuler-20.03-LTS-SP1"], + sp3_issue=issues["openEuler-20.03-LTS-SP3"], + lts_2203_issue=issues["openEuler-22.03-LTS"], + frozen_date=frozen_date) + + # 构造文本,参数1:正文内容,参数2:文本格式,参数3:编码方式 + # message_text = MIMEText(body_content, "plain","utf-8") + message_text = MIMEText(body_content, "html", "utf-8") + # 向MIMEMultipart对象中添加文本对象 + mm.attach(message_text) + + # 构造附件 + atta = MIMEText(open('test.xls', 'rb').read(), 'base64', 'utf-8') + # 设置附件信息 + atta["Content-Disposition"] = 'attachment; filename="sample.xlsx"' + # 添加附件到邮件信息当中去 + mm.attach(atta) + + # 创建SMTP对象 + stp = smtplib.SMTP() + # 设置发件人邮箱的域名和端口,端口地址为25 + stp.connect(mail_host, 25) + # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息 + stp.set_debuglevel(1) + # 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码 + stp.login(mail_sender, mail_license) + # 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为str + stp.sendmail(mail_sender, mail_receivers, mm.as_string()) + print("邮件发送成功") + # 关闭SMTP对象 + stp.quit() + + def generate_excel(self, issue_list, params): + """ + Generate excel for test + Args: + params: parameters of command line + issue_list: issue list of update release + + Returns: + + """ + for issue_id in issue_list: + issue = IssueOperation("release-management", params.token, issue_id) + issue_url = issue.externel_gitee_api_url("get_issue_url", owner=issue.owner, issue_id=issue.issue_num) + post_res = issue.gitee_api_request("post", issue_url) + if not post_res: + logger.error("failed to get the issue: {}".format(issue_url)) + return None + + post_res.json().get("body") + def requires_operation(self, params): """ -- Gitee From 5cf40ed6ffea660da98fd65e178a45790a284f93 Mon Sep 17 00:00:00 2001 From: mdche Date: Tue, 3 Jan 2023 06:46:02 +0000 Subject: [PATCH 06/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20re?= =?UTF-8?q?lease-assistant/javcra/application/checkpart/repo=5Fversion.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/checkpart/repo_version.py | 320 ------------------ 1 file changed, 320 deletions(-) delete mode 100644 release-assistant/javcra/application/checkpart/repo_version.py diff --git a/release-assistant/javcra/application/checkpart/repo_version.py b/release-assistant/javcra/application/checkpart/repo_version.py deleted file mode 100644 index 5189dc1..0000000 --- a/release-assistant/javcra/application/checkpart/repo_version.py +++ /dev/null @@ -1,320 +0,0 @@ -#!/usr/bin/python3 -# ****************************************************************************** -# Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. -# licensed under the Mulan PSL v2. -# You can use this software according to the terms and conditions of the Mulan PSL v2. -# You may obtain a copy of Mulan PSL v2 at: -# http://license.coscl.org.cn/MulanPSL2 -# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR -# PURPOSE. -# See the Mulan PSL v2 for more details. -# Author: Jiachen Fan -# Create: 2021-3-19 -# ******************************************************************************/ -import requests -import os -import abc -import logging -import yaml -import subprocess -import pandas as pd - -from src.util.requests_util import requests_get_content -from src.util.spec import Spec, replace_macros -from src.util.osc_utils import get_osc_pkg_nvr -from src.util.dnf_utils import dnf_list_src_version - -VERSION_CONF_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), - "config", - "openEuler_branch.yaml") - -""" -dnf install rpmdevtools -""" - - -class PkgVerInterface(metaclass=abc.ABCMeta): - """ - interface for get version from repo(i.e. gitee/obs/repo.openeuler.org) - """ - - def __init__(self, name, branch): - self.name = name - self.version = "" - self.release = "" - self.epoch = "0" - self.branch = branch - - def get_vr(self): - if not self.version or not self.release: - return "unknow" - return "{ver}-{rel}" \ - .format( - ver=self.version, - rel=self.release - ) - - def get_evr(self): - if not self.version or not self.release: - return "unknow" - return "{epoch}{ver}-{rel}" \ - .format( - epoch="" if self.epoch == "0" else (self.epoch + ":"), - ver=self.version, - rel=self.release - ) - - def __str__(self): - return self.get_evr() - - @abc.abstractmethod - def parse_content(self): - pass - - -class GiteePkgVer(PkgVerInterface): - """ - get pkg version from src-openeuler/pkg -> pkg.spec in xxx branch - parse spec to get Version:str, Release:str, Epoch:str(default 0) - """ - - def __init__(self, name, branch): - super(GiteePkgVer, self).__init__(name, branch) - self.spec_format_url = "https://gitee.com/src-openeuler/{name}/raw/{branch}/{name}.spec".format( - name=self.name, - branch=self.branch - ) - - def _check_branch(self): - openEuler_branch = {} - if not os.path.isfile(VERSION_CONF_FILE): - print("openEuler branch config file:[%s] not exist", openEuler_branch) - return False - with open(VERSION_CONF_FILE, "r") as f: - openEuler_branch = yaml.safe_load(f) - if not openEuler_branch or not openEuler_branch["openEuler_branch"].get(self.branch, None): - print("[%s] is not a openEuler branch name", self.branch) - return False - return True - - def _rpmspec_parse(self, file_name): - if not os.path.isfile(file_name): - print("spec file %s not exist", os.path.basename(file_name)) - return - - cmd_list = ["rpmspec", "--parse", file_name] - try: - proc = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) - except OSError as e: - print("oserror: %s", str(e)) - return None, None - stdout, stderr = proc.communicate() - returncode = proc.returncode - proc.poll() - if returncode == 0: - inputspec = Spec.from_string(stdout.decode("utf-8", "ignore")) - else: - inputspec = Spec.from_file(file_name) - self.version = replace_macros(inputspec.version, inputspec) - self.release = replace_macros(inputspec.release, inputspec) - - def _parse_spec(self, content, savedir="/tmp/update-package", save=False): - _ = not os.path.exists(savedir) and os.makedirs(savedir) - file_name = os.path.join(savedir, "{}.spec".format(self.name)) - if os.path.isfile(file_name): - os.remove(file_name) - with open(file_name, "a") as f: - f.write(content) - self._rpmspec_parse(file_name) - if not save and os.path.exists(file_name): - os.remove(file_name) - - def parse_content(self): - if not self.name or not self.branch: - print("name or branch fields not exists") - return - print(self.spec_format_url) - if not self._check_branch(): - print("check branch failed") - return - status_code, content = requests_get_content(self.spec_format_url, timeout=30) - print(status_code) - print(content) - if not content: - return - self._parse_spec(content) - - -class OBSPkgVer(PkgVerInterface): - """ - get pkg version from repo - """ - REPO_ARCH_DICT = { - "arm": { - "repo": "standard_aarch64", - "arch": "aarch64" - }, - "x86": { - "repo": "standard_x86_64", - "arch": "x86_64" - } - } - - def __init__(self, name, branch): - super(OBSPkgVer, self).__init__(name, branch) - - def _check_parse_branch(self): - pass - - def _get_repo_arch(self, arch_key): - if arch_key not in self.REPO_ARCH_DICT: - print("[%s] key is not support", arch_key) - return "", "" - return self.REPO_ARCH_DICT[arch_key].get("repo", ""), \ - self.REPO_ARCH_DICT[arch_key].get("arch", "") - - def parse_content(self): - self._check_parse_branch() - arch_list = self.REPO_ARCH_DICT.keys() - print(arch_list) - for key in arch_list: - repo, arch = self._get_repo_arch(key) - name, ver, rel = get_osc_pkg_nvr(self.name, self.branch, repo=repo, arch=arch) - print("obs info:",name,ver,rel) - if ver: - self.version, self.release = ver, rel - break - - -class DNFPkgVer(PkgVerInterface): - def __init__(self, name, repo_list): - super(DNFPkgVer, self).__init__(name, repo_list) - - def parse_content(self): - self.epoch, self.version, self.release = dnf_list_src_version(self.name, self.branch) - - -class RepoPkgVer(object): - """ - to simply dip - use this case to get repo version and - """ - - def __init__(self, repo_pkg_ver): - self.repo_pkg_ver = repo_pkg_ver - - def parse_ver_info(self): - """ - use this function to fill version info into repo_pkg_ver - use this after init this function - """ - self.repo_pkg_ver.parse_content() - - def get_version(self): - """ - get pkg [version] from self.repo_pkg_ver - """ - return self.repo_pkg_ver.version - - def get_release(self): - """ - get pkg [release] from self.repo_pkg_ver - """ - return self.repo_pkg_ver.release - - def get_epoch(self): - """ - get pkg [epoch] from self.repo_pkg_ver - """ - return self.repo_pkg_ver.epoch - - def get_vr(self): - """ - get pkg [version-release] from self.repo_pkg_ver - """ - return self.repo_pkg_ver.get_vr() - - def get_evr(self): - """ - get pkg [epoch:version-release] from self.repo_pkg_ver - """ - return self.repo_pkg_ver.get_evr() - - def __str__(self): - """ - usage same as get_evr - print(RepoPkgVer) -> [epoch:version-release] - """ - return self.repo_pkg_ver.get_evr() - - -def get_pkgs(): - pkg_list = [] - try: - file = open("update_pkgs.txt") - for line in file: - if line.strip(): - pkg_list.append(line.strip()) - except FileNotFoundError: - print("update_pkgs.txt can not found") - except UnicodeDecodeError as err: - print(err) - return pkg_list - - -def get_pkgs_csv(repo_info_list): - total_DF = pd.DataFrame(columns=['pkgs', 'gitee-SP1', 'obs-SP1', "sp1-res", 'gitee-SP2', 'obs-SP2', "sp2-res", 'obs-SP3', "sp3-res", "gitee-2203", "obs-2203", "2203-res"]) - for pkg_repo in repo_info_list: - for pkg, repo_info in pkg_repo.items(): - data_dict = {'pkgs': pkg, - "gitee-SP1": repo_info[0], - "obs-SP1": repo_info[1], - "sp1-res": repo_info[2], - "gitee-SP2": repo_info[3], - "obs-SP2": repo_info[4], - "sp2-res": repo_info[5], - - "gitee-SP3": repo_info[6], - "obs-SP3": repo_info[7], - "sp3-res": repo_info[8], - "gitee-2203": repo_info[9], - "obs-2203": repo_info[10], - "2203-res": repo_info[11] - } - build_DF = pd.DataFrame(data=data_dict, index=[0]) - if len(build_DF): - total_DF = pd.concat([total_DF, build_DF], axis=0) - total_DF.index = range(len(total_DF)) - total_DF.to_csv("update_pkgs_repo.csv") - - -def compare_pkg_ver(origin_repo=GiteePkgVer, new_repo=OBSPkgVer): - pkg_list = get_pkgs() - gitee_branch_list = ["openEuler-20.03-LTS-SP1", "openEuler-20.03-LTS-SP2","openEuler-20.03-LTS-SP3", "openEuler-22.03-LTS"] - obs_branch_list = ["openEuler:20.03:LTS:SP1", "openEuler:20.03:LTS:SP2","openEuler:20.03:LTS:SP3", "openEuler-22.03-LTS"] - - repo_info_dict = [] - for pkg in pkg_list: - - pkg_version_list = [] - for branch_index in range(len(gitee_branch_list)): - old_pkg_repo = RepoPkgVer(origin_repo(pkg, gitee_branch_list[branch_index])) - new_pkg_repo = RepoPkgVer(new_repo(pkg, obs_branch_list[branch_index])) - old_pkg_repo.parse_ver_info() - new_pkg_repo.parse_ver_info() - - pkg_version_list.append(old_pkg_repo.get_vr()) - pkg_version_list.append(new_pkg_repo.get_vr()) - if old_pkg_repo.get_vr() == new_pkg_repo.get_vr(): - pkg_version_list.append("same") - else: - pkg_version_list.append("not same") - repo_info_dict.append({pkg: pkg_version_list}) - - return repo_info_dict - - -res = compare_pkg_ver() -get_pkgs_csv(res) - -- Gitee From 59534c87454e60c57ece5f9adb2e119cb7bafdf4 Mon Sep 17 00:00:00 2001 From: mdche Date: Tue, 3 Jan 2023 06:46:09 +0000 Subject: [PATCH 07/11] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20.g?= =?UTF-8?q?itignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 74d80ad..0000000 --- a/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -.DS_Store -*/.DS_Store -*.pyc -*.vscode -/release-assistant/javcra/application/checkpart/.__log_info.lock -/release-assistant/test/test_check/.__log_info.lock -/release-assistant/tools/test.xls -/.idea/workspace.xml -/.idea/vcs.xml -/.idea/inspectionProfiles/Project_Default.xml -/release-assistant/javcra/application/modifypart/.__log_info.lock -/release-assistant/javcra/application/startpart/.__log_info.lock -/.__log_info.lock -/release-assistant/tools/auto_email.py -/release-assistant/tools/email_template.html -/release-assistant/javcra/application/checkpart/log_info.log -/release-assistant/javcra/application/startpart/log_info.log -/release-assistant/test/test_check/log_info.log -/.idea/inspectionProfiles/profiles_settings.xml -/release-assistant/javcra/api/github_api.py -/release-assistant/javcra/application/modifypart/log_info.log -/log_info.log -/release-assistant/javcra/cli/commands/log_info.log -/.idea/misc.xml -/.idea/modules.xml -/release-assistant/doc/backup.py -/.idea/.gitignore -- Gitee From 228c17134708fd21e9582a93752be4ef10580bec Mon Sep 17 00:00:00 2001 From: mdche Date: Tue, 3 Jan 2023 06:49:35 +0000 Subject: [PATCH 08/11] update release-assistant/javcra/cli/commands/checkpart.py. Signed-off-by: mdche --- .../javcra/cli/commands/checkpart.py | 88 +------------------ 1 file changed, 1 insertion(+), 87 deletions(-) diff --git a/release-assistant/javcra/cli/commands/checkpart.py b/release-assistant/javcra/cli/commands/checkpart.py index 7ef197c..f3fa8d7 100644 --- a/release-assistant/javcra/cli/commands/checkpart.py +++ b/release-assistant/javcra/cli/commands/checkpart.py @@ -15,20 +15,16 @@ Description: check method's entrance for custom commands Class:CheckCommand """ import os -import smtplib import stat import uuid -from email.mime.text import MIMEText -from email.mime.multipart import MIMEMultipart -from email.header import Header - from javcra.api.jenkins_api import JenkinsJob from javcra.application.checkpart.checkentrance import CheckEntrance from javcra.application.checkpart.checktest import CheckTest from javcra.application.modifypart.modifyentrance import IssueOperation from javcra.application.serialize.serialize import CheckSchema from javcra.cli.base import BaseCommand + from javcra.cli.commands import parameter_permission_validate from javcra.common import constant from javcra.common.constant import ( @@ -314,8 +310,6 @@ class CheckCommand(BaseCommand): Args: params: Command line parameters - Returns: - jenkins_job_res: jenkins_job_res """ issue = self.issue(params) judege_res = self.judge_cve_bugfix_comment(issue, params) @@ -330,86 +324,6 @@ class CheckCommand(BaseCommand): with os.fdopen(os.open('update_packages.txt', flags, modes), 'w') as f: for pkg in update_pkgs: f.write("{}\n".format(pkg)) - f.close() - - def email_operation(self, params): - """ - Generate test email operation for update. - Args: - params: Command line parameters - - Returns: - - """ - issue_list = params.issue_list - frozen_date = params.frozen_date - - self.send_email(issue_list, frozen_date) - - def send_email(self, issues, frozen_date): - """ - Generate test email and send it to version manager. - Args: - issues: dict of release issues - frozen_date: forzen date of update - - Returns: - - """ - # SMTP Server - mail_host = "smtp.qq.com" - # sender email - mail_sender = "772193803@qq.com" - # auth license of the sender email - mail_license = "mxjpsbycwrtgbfbg" - # receiver email - mail_receivers = ["772193803@qq.com"] - - mm = MIMEMultipart("test_email") - # title - subject_content = "openEuler-20.03-LTS-SP1/" \ - "openEuler-20.03-LTS-SP3/" \ - "openEuler-22.03-LTS {} 版本转测".format(frozen_date) - - # set sender name - mm["From"] = "synox<772193803@qq.com>" - # set reveiver - mm["To"] = "synox<772193803@qq.com>" - # set title - mm["Subject"] = Header(subject_content, 'utf-8') - - # mail body - body_content = open("email_template.html", "r").read().format(sp1_issue=issues["openEuler-20.03-LTS-SP1"], - sp3_issue=issues["openEuler-20.03-LTS-SP3"], - lts_2203_issue=issues["openEuler-22.03-LTS"], - frozen_date=frozen_date) - - # 构造文本,参数1:正文内容,参数2:文本格式,参数3:编码方式 - # message_text = MIMEText(body_content, "plain","utf-8") - message_text = MIMEText(body_content, "html", "utf-8") - # 向MIMEMultipart对象中添加文本对象 - mm.attach(message_text) - - # 构造附件 - atta = MIMEText(open('test.xls', 'rb').read(), 'base64', 'utf-8') - # 设置附件信息 - atta["Content-Disposition"] = 'attachment; filename="sample.xlsx"' - # 添加附件到邮件信息当中去 - mm.attach(atta) - - # 创建SMTP对象 - stp = smtplib.SMTP() - # 设置发件人邮箱的域名和端口,端口地址为25 - stp.connect(mail_host, 25) - # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息 - stp.set_debuglevel(1) - # 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码 - stp.login(mail_sender, mail_license) - # 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为str - stp.sendmail(mail_sender, mail_receivers, mm.as_string()) - print("邮件发送成功") - # 关闭SMTP对象 - stp.quit() def generate_excel(self, issue_list, params): """ -- Gitee From 7ab0ebd4fe7fdae0d7daa5eb393e7f3ffefc137a Mon Sep 17 00:00:00 2001 From: mdche Date: Tue, 3 Jan 2023 06:50:20 +0000 Subject: [PATCH 09/11] update release-assistant/javcra/cli/commands/checkpart.py. Signed-off-by: mdche --- .../javcra/cli/commands/checkpart.py | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/release-assistant/javcra/cli/commands/checkpart.py b/release-assistant/javcra/cli/commands/checkpart.py index f3fa8d7..9a5b187 100644 --- a/release-assistant/javcra/cli/commands/checkpart.py +++ b/release-assistant/javcra/cli/commands/checkpart.py @@ -325,27 +325,6 @@ class CheckCommand(BaseCommand): for pkg in update_pkgs: f.write("{}\n".format(pkg)) - def generate_excel(self, issue_list, params): - """ - Generate excel for test - Args: - params: parameters of command line - issue_list: issue list of update release - - Returns: - - """ - for issue_id in issue_list: - issue = IssueOperation("release-management", params.token, issue_id) - issue_url = issue.externel_gitee_api_url("get_issue_url", owner=issue.owner, issue_id=issue.issue_num) - post_res = issue.gitee_api_request("post", issue_url) - if not post_res: - logger.error("failed to get the issue: {}".format(issue_url)) - return None - - post_res.json().get("body") - - def requires_operation(self, params): """ Description: operation for get requires -- Gitee From 1a378f477ea457df9169554b70de7b4825e7320f Mon Sep 17 00:00:00 2001 From: mdche Date: Tue, 3 Jan 2023 06:51:05 +0000 Subject: [PATCH 10/11] update release-assistant/javcra/cli/commands/createpart.py. Signed-off-by: mdche --- release-assistant/javcra/cli/commands/createpart.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release-assistant/javcra/cli/commands/createpart.py b/release-assistant/javcra/cli/commands/createpart.py index 2fe2f37..95b1401 100644 --- a/release-assistant/javcra/cli/commands/createpart.py +++ b/release-assistant/javcra/cli/commands/createpart.py @@ -51,7 +51,7 @@ class CreateCommand(BaseCommand): Args: params: Command line parameters """ - issue = UpdateIssue(GITEE_REPO, params.token, "xx") + issue = UpdateIssue(GITEE_REPO, params.token) create_res = issue.create_update_release() if create_res: logger.info("create release successfully.") -- Gitee From 63993199b5435eed17d400d103ead0c87b733168 Mon Sep 17 00:00:00 2001 From: mdche Date: Tue, 3 Jan 2023 06:52:33 +0000 Subject: [PATCH 11/11] update release-assistant/javcra/cli/commands/checkpart.py. Signed-off-by: mdche --- release-assistant/javcra/cli/commands/checkpart.py | 1 - 1 file changed, 1 deletion(-) diff --git a/release-assistant/javcra/cli/commands/checkpart.py b/release-assistant/javcra/cli/commands/checkpart.py index 9a5b187..ce3138f 100644 --- a/release-assistant/javcra/cli/commands/checkpart.py +++ b/release-assistant/javcra/cli/commands/checkpart.py @@ -309,7 +309,6 @@ class CheckCommand(BaseCommand): Description: operation for check the version of pacakges Args: params: Command line parameters - """ issue = self.issue(params) judege_res = self.judge_cve_bugfix_comment(issue, params) -- Gitee