"""
# **********************************************************************************
# Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
# [openeuler-jenkins] 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.
# Author:
# Create: 2020-09-29
# Description: report obs package build info
# **********************************************************************************
"""
import logging.config
import logging
import argparse
import os
import yaml
class ObsPackageBuildReport(object):
"""
obs包构建状态上报
"""
GITEE_OWNER = "src-openeuler"
def __init__(self, project, state, real_name_mapping_file):
"""
:param project: obs项目名
:param state: 构建状态
:param real_name_mapping_file: 码云账号真实姓名映射文件
"""
self._project = project
self._state = state
self._real_name_mapping = self._load_real_name_of_gitee_id(real_name_mapping_file)
self._package_last_committer = {}
@staticmethod
def _load_real_name_of_gitee_id(real_name_mapping_file):
"""
加载用户名和码云账号映射表
:param real_name_mapping_file:
:return:
"""
try:
with open(real_name_mapping_file, "r") as f:
return yaml.safe_load(f)
except IOError:
logger.exception("real name mapping file not exist")
except yaml.YAMLError:
logger.exception("load real name mapping file exception")
return {}
def get_last_committer(self, gitee_api_token):
"""
计算最后的pr提交人
:param gitee_api_token: 码云api token
:return:
"""
branch = "master"
packages = OBSProxy.list_packages_of_state(self._project, self._state)
logger.info("project %s state %s, find %s packages", self._project, self._state, len(packages))
for index, package in enumerate(packages):
logger.info("%s: %s", index, package)
gp = GiteeProxy(self.GITEE_OWNER, package, gitee_api_token)
committer = gp.get_last_pr_committer(branch)
real_name = self._real_name_mapping.get(committer, "N/A")
self._package_last_committer[package] = {"committer": committer, "real_name": real_name}
def dump(self):
"""
导出
:return:
"""
print("{:<25}{:<25}{:<15}{:<20}{:<20}".format("project", "package", "state", "gitee", "charger"))
for package in self._package_last_committer:
committer = self._package_last_committer[package]["committer"]
real_name = self._package_last_committer[package]["real_name"].encode("utf-8")
print("{:<25}{:<25}{:<15}{:<20}{:<20}".format(self._project, package, self._state, committer, real_name))
if "__main__" == __name__:
args = argparse.ArgumentParser()
args.add_argument("-p", type=str, dest="project", nargs="+", help="obs project")
args.add_argument("-s", type=str, dest="state", nargs="+", help="package build state")
args.add_argument("-c", type=str, dest="real_name_mapping_file", help="gitee real name mapping")
args.add_argument("-t", type=str, dest="token", help="gitee api token")
args = args.parse_args()
not os.path.exists("log") and os.mkdir("log")
logger_conf_path = os.path.realpath(os.path.join(os.path.realpath(__file__), "../../conf/logger.conf"))
logging.config.fileConfig(logger_conf_path)
logger = logging.getLogger("build")
from src.proxy.obs_proxy import OBSProxy
from src.proxy.gitee_proxy import GiteeProxy
for prj in args.project:
for states in args.state:
report = ObsPackageBuildReport(prj, states, args.real_name_mapping_file)
report.get_last_committer(args.token)
report.dump()