# openeuler-jenkins
**Repository Path**: dchii/openeuler-jenkins
## Basic Information
- **Project Name**: openeuler-jenkins
- **Description**: This repository is used to store the jenkins scripts in openEuler community.
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 144
- **Created**: 2024-04-10
- **Last Updated**: 2024-04-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 一、门禁功能介绍
## 1. 门禁功能
openEuler社区代码均托管在gitee上,为了保证代码提交质量,开发者在gitee提交PR时,会自动触发门禁执行编码规范检查、构建、安装、接口变更等检查,最后将门禁检查结果返回到PR评论中,帮助开发者定位问题及maintainer检视代码。
门禁代码开源 https://gitee.com/openeuler/openeuler-jenkins
## 2. src-openeuler门禁检查项
### 2.1 门禁触发方式
首次提交PR,或评论/retest
### 2.2 门禁开始运行标志
开发者可通过链接查看实时门禁构建日志。
### 2.3 门禁检查结果
基本检查项
接口变更检查
门禁基本检查项包括6项,如表1所示。接口变更检查因为子项较多,单独以一个表格显示。
### 2.4 检查项对应门禁代码位置
| 检查项 | 功能描述 | 主要代码位置 |
| ----------------------- | ---------------------- | ------------------------------------------------------------ |
| check_binary_file | 二进制文件检查 | [check_binary_file.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/binary/check_binary_file.py) |
| check_package_license | license合法性检查 | [check_license.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/package_license/check_license.py)、[check_openeuler_license.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/package_license/check_openeuler_license.py)、[package_license.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/package_license/package_license.py) |
| check_package_yaml_file | yaml文件格式检查 | [check_yaml.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/package_yaml/check_yaml.py)、[check_repo.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/package_yaml/check_repo.py) |
| check_spec_file | spec文件格式检查 | [check_spec.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/spec/check_spec.py) |
| check_consistency | 源码文件一致性检查 | [check_consistency.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/source_consistency/check_consistency.py) |
| check_build | 包构建 | [osc_build_k8s.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/build/osc_build_k8s.py)、 |
| check_install | 验证构建出的包能否安装 | [extra_work.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/build/extra_work.py) |
| compare_package | 接口变更检查 | [compare_package.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/utils/compare_package.py) |
此外,门禁目前支持部分检查项(check_code_style、check_package_license、check_package_yaml_file和check_spec_file)的选择性配置,配置文件位于[ac.yaml](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/framework/ac.yaml)。负责检查项PR回显的代码位于[gitee_comment.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/build/gitee_comment.py)
### 2.5 基本检查项功能描述
| 检查项 | 功能 | SUCCESS | FAILED | WARNING |
| ----------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------- | ----------------------------------------------- |
| check_binary_file | 检查仓库中是否存在二进制文件 | 不存在以.pyc、.jar、.ko、.o为后缀的文件(包括压缩包内,但不包括以链接形式给出的上游社区) | 不符合SUCCESS的情况 | 不涉及 |
| check_package_license | 检查license合法性 | 全部为白名单,并且源码和spec描述的license保持一致 | 存在黑名单license | 全部为白名单,但是源码和spec描述的license不一致 |
| check_package_yaml_file | 检查yaml格式 | version_control、src_repo、tag_prefix、seperator字段完整,并且version_control字段内容与spec文件中url对应的域名一致 | 不符合SUCCESS的情况 | 不涉及 |
| check_spec_file | 检查sepc合法性 | 版本号不变时,release号必须递增;版本号变化时,release必须置为1;补丁在编译时必须全部应用;changelog格式正确 | 不符合SUCCESS的情况 | 不涉及 |
| check_consistency | 通过远端和本地源码文件的sha256值是否一致来判断源码包是否发生变更 | 远端和本地源码文件的sha256值一致 | 不符合SUCCESS的情况 | 不涉及 |
| check_build | 验证编译 | 构建rpm包成功 | 不符合SUCCESS的情况 | 不涉及 |
| check_install | 验证安装 | 成功安装构建出的rpm包 | 不符合SUCCESS的情况 | 不涉及 |
### 2.6 接口变更检查各检查项功能描述
| 检查项 | 功能 | SUCCESS | FAILED | WARNING |
| ------------ | ------------------------------------------- | ------------------------------------------------------------ | ------------------- | ------- |
| add_rpms | 检查PR是否新增rpm包 | 相比于同分支上一个成功合入pr,无新增rpm包 | 不符合SUCCESS的情况 | 不涉及 |
| delete_rpms | 检查pr是否删除rpm包 | 相比于同分支上一个成功合入pr,无删除rpm包 | 不符合SUCCESS的情况 | 不涉及 |
| rpm | rpm包文件比较结果目录 | 相比于同分支上一个成功合入pr,rpm包文件比较无变化 | 不符合SUCCESS的情况 | 不涉及 |
| check_abi | 检查pr生成的rpm包二进制接口是否变化(C++) | 相比于同分支上一个成功合入pr,每个rpm的二进制接口无变化 | 不符合SUCCESS的情况 | 不涉及 |
| rpm_cmd | rpm包命令文件比较结果目录 | 相比于同分支上一个成功合入pr,每个rpm的命令文件无变化 | 不符合SUCCESS的情况 | 不涉及 |
| rpm_files | 检查pr生成的rpm包是否新增或者删除文件 | 相比于同分支上一个成功合入pr,每个rpm的文件列表无增减(不检查文件变化) | 不符合SUCCESS的情况 | 不涉及 |
| rpm_header | rpm包头文件比较结果目录 | 相比于同分支上一个成功合入pr,每个rpm提供的头文件无变化 | 不符合SUCCESS的情况 | 不涉及 |
| rpm_lib | rpm包so库文件比较结果目录 | 相比于同分支上一个成功合入pr,每个rpm提供的so库文件无变化 | 不符合SUCCESS的情况 | 不涉及 |
| rpm_provides | 检查pr生成的rpm包提供的组件名,是否变化组件 | 相比于同分支上一个成功合入pr,每个rpm提供的组件名称无变化 | 不符合SUCCESS的情况 | 不涉及 |
| rpm_requires | 检查pr生成的rpm包依赖组件名是否变化 | 相比于同分支上一个成功合入pr,每个rpm依赖的组件名称无变化 | 不符合SUCCESS的情况 | 不涉及 |
| rpm_symbol | 检查pr生成的rpm包二进制接口是否变化(C++) | 相比于同分支上一个成功合入pr,每个rpm的二进制接口无变化 | 不符合SUCCESS的情况 | 不涉及 |
## 3 openeuler门禁检查项
### 3.1 门禁检查项PR回显
### 3.2 检查项对应门禁代码位置
| 检查项 | 功能描述 | 主要代码位置 |
| --------------------- | ------------------------------- | ------------------------------------------------------------ |
| check_code | 编码规范检查 | [check_code.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/openlibing/check_code.py) |
| check_package_license | 检查license合法性 | [check_license.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/package_license/check_license.py)、[check_openeuler_license.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/package_license/check_openeuler_license.py)、[package_license.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/package_license/package_license.py) |
| check_sca | 代码片段扫描 | [check_sca.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/acl/sca/check_sca.py) |
| x86-64/仓库名 | x86-64环境下包构建及构建后检查 | 维护者自行实现,不属于门禁代码 |
| aarch64/仓库名 | aarch64环境下包构建及构建后检查 | 同上 |
此外,门禁支持检查项check_openlibing和check_sca的选择性配置,配置文件位于[ac.yaml](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/ac/framework/ac.yaml)。负责检查项PR回显的代码位于[gitee_comment.py](https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/build/gitee_comment.py)
当前[check_openlibing](https://majun.osinfra.cn:8384/api/openlibing/codecheck)、[check_sca](https://sca-beta.osinafra.cn)均是调用远端服务实现的。
# 二、 门禁结果答疑&&误报反馈
## 1. 门禁责任田划分
| 责任田 | Maintainer |
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| 门禁总接口人 | [wanghuan158](https://e.gitee.com/open_euler/members/trend/wanghuan158) |
| community仓库维护人员 | [georgecao](https://gitee.com/open_euler/dashboard/members/georgecao), [liuqi469227928](https://gitee.com/open_euler/dashboard/members/liuqi469227928), [dakang_siji](https://e.gitee.com/open_euler/members/trend/dakang_siji) |
| obs_meta仓库维护人员 | [dongjie110](https://e.gitee.com/open_euler/members/trend/dongjie110) |
| release_management仓库维护人员 | [dongjie110](https://e.gitee.com/open_euler/members/trend/dongjie110) |
| 软件包单仓门禁维护人员 | [wanghuan158](https://e.gitee.com/open_euler/members/trend/wanghuan158), [MementoMoriCheng](https://e.gitee.com/open_euler/members/trend/MementoMoriCheng) |
| 基础设施维护(包括obs、gitee、jenkins基础服务,也包括硬件和网络)人员 | [georgecao](https://gitee.com/open_euler/dashboard/members/georgecao), [liuqi469227928](https://gitee.com/open_euler/dashboard/members/liuqi469227928), [dakang_siji](https://e.gitee.com/open_euler/members/trend/dakang_siji) |
| obs工程维护人员 | [wangchong1995924](https://gitee.com/open_euler/dashboard/members/wangchong1995924), [small_leek](https://e.gitee.com/open_euler/members/trend/small_leek), [dongjie110](https://e.gitee.com/open_euler/members/trend/dongjie110) |
| majun维护人员 | [openlibing@163.com](openlibing@163.com) |
注:1. 软件包单仓门禁中的代码片段扫描(check_sca)和编码规范检查(check_code)是通过调用majun平台服务实现的
2. 软件包单仓门禁维护人员是作为openeuler以及src-openeuler单仓门禁接口人,单仓门禁问题都可以找他们;如果是obs或者是基础设施服务问题,则需要再联系相应的维护人员。常见问题及解决方案可参考[门禁问题排查手册](https://gitee.com/openeuler/openeuler-jenkins/blob/master/doc/%E9%97%A8%E7%A6%81%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5%E6%89%8B%E5%86%8C.md)。
## 2. 门禁结果
如果对门禁结果有疑问或者认为门禁结果不准确,可以向相关负责人反馈问题,我们会尽快解决,无法短时间解决的可以向门禁仓库[https://gitee.com/openeuler/openeuler-jenkins](https://gitee.com/openeuler/openeuler-jenkins)提issue跟踪进展。之后,您可以通过pr评论反馈门禁误报情况,这些统计数据便于我们以后能做得更好。
标记误报的评论格式为:/ci_unmistake build_no或者/ci_mistake build_no
注:
1. ci_mistake用于标记误报,ci_unmistake用于撤回标记,必选其一
2. build_no指的是trigger工程的构建号,门禁开始执行时会在评论中打印门禁任务链接及构建号,由于同一个pr可以有多次构建结果,因此通过构建号区分。必选参数
3. mistake_type表示误报类型。可选参数,可以选择ci,obs,infra或者不填,这里将误报结果划分为门禁本身,obs以及基础设施三类
4. ci_mistake_stage表示误报阶段。可选参数,check_binary_file, check_package_license, check_package_yaml_file, check_spec_file, check_build, check_install, compare_package, build_exception选一项或多项,也可不填,除build_exception外均与门禁检查项一一对应,而build_exception表示门禁运行异常(如门禁结果不返回)。
5. mistake_type和ci_mistake_stage的填写顺序没有要求,可以调换
# 三、门禁代码上线流程
依次包括3个步骤:向门禁代码仓提交并合入PR(找maintainer);为此次提交生成tag(找maintainer);更新容器镜像(找门禁看护人员[wanghuan158](https://e.gitee.com/open_euler/members/trend/wanghuan158), [MementoMoriCheng](https://e.gitee.com/open_euler/members/trend/MementoMoriCheng)。少数情况下需要门禁看护人员修改jenkins配置。
## 1. 提交并合入PR
门禁代码放在[https://gitee.com/openeuler/openeuler-jenkins](https://gitee.com/openeuler/openeuler-jenkins),找maintainer合入代码。
## 2. 生成tag
理论上每次提交,均可以生成tag(tag相比于commit号,更易读);一般情况下,不是每个PR合入都是需要立即上线的,因此不必每个commit均生成一个tag。
## 3. 生成容器镜像
目前门禁代码机器环境已经放到了容器镜像中,因此每次更新门禁代码时均需要更新容器镜像代码才能生效,镜像版本通过tag区分。
# 四、运行节点定制
## 1. 当前节点/镜像列表
下表列出了与门禁相关的节点:
| 节点 | 工程 |
| ------------------------------------------------------------ | -------------------------------------- |
| k8s-x86-soe和k8s-aarch64-soe | src-openeuler全部门禁工程 |
| k8s-x86-oe | openeuler中trigger和comment工程 |
| **k8s-x86-openeuler、k8s-x86-openeuler-20.03-lts、k8s-x86-openeuler-20.03-lts-sp1、k8s-x86-openeuler-20.03-lts-sp2、k8s-x86-openeuler-20.03-lts-sp3、k8s-x86-openeuler-20.09、k8s-x86-openeuler-21.03、k8s-aarch64-openeuler、k8s-aarch64-openeuler-20.03-lts、k8s-aarch64-openeuler-20.03-lts-sp1、k8s-aarch64-openeuler-20.03-lts-sp2、k8s-aarch64-openeuler-20.03-lts-sp3、k8s-aarch64-openeuler-20.09、k8s-aarch64-openeuler-21.03** | **openeuler中x86-64和aarch64构建工程** |
注:1. 当前src-openeuler全部门禁工程、openeuler中trigger和comment工程,全部代码有门禁侧统一配置,使用环境相同,因此节点固定
2.openeuler中x86-64和aarch64构建工程执行的代码是相关sig组自行管理的,使用的环境各不相同,节点可在**加粗部分**自由选择,请不要使用其他节点,以免干扰其他jenkins任务的功能
## 2. 节点定制
部分任务可能需要定制门禁运行节点。
### 2.1 基础镜像缺乏依赖包,运行时安装比较耗时
门禁提供的容器环境是可以在运行时安装依赖包的,因此少量依赖包建议直接在运行脚本中使用sudo yum install -y xxx安装。当缺乏的依赖包比较多时,则建议向门禁仓库[https://gitee.com/openeuler/openeuler-jenkins](https://gitee.com/openeuler/openeuler-jenkins)提交一个dockfile,由门禁侧检视合入后重新制作镜像,并创建一个新的运行节点。
dockerfile格式可参考https://gitee.com/openeuler/openeuler-jenkins/blob/master/src/dockerfile/release-tools-dockerfile, 通常只需要修改前两条语句即可:
```
FROM swr.cn-north-4.myhuaweicloud.com/openeuler/openjdk/OPENJDK:TAG
RUN set -eux; \
yum install -y python3-pip cpio bsdtar expect openssh sudo vim git strace python-jenkins python3-requests python-concurrent-log-handler python3-gevent python3-marshmallow python3-pyyaml python-pandas python-xlrd python-retrying python-esdk-obs-python git
```
### 2.2 基础镜像版本不是openeuler
此时除了编写dockerfile外,还需要提供对应版本的基础镜像。
### 2.3 机器架构不符合要求
在前面的基础上还需要额外提供对应架构的机器,然后完成步骤2.2和2.1,此时门禁代码需要做适配。