长期支持版本

    社区创新版本

      简介

      用户文档中心

      欢迎浏览EulerMaker用户手册,这个手册主要介绍如何使用EulerMaker现有的功能。

      EulerMaker是什么?

      统一构建(EulerMaker)平台是一款软件包构建平台,实现从源码到二进制软件包的构建平台。该平台通过统一的软件包配置管理,软件包依赖关系分析,实现基于依赖关系的软件包高效构建。帮助开发者与合作伙伴建设用户个人仓,OS核心仓,构建门禁能力。

      关于此文档

      此文档由构建入门指南开始,通过让用户熟悉EulerMaker主要的构建能力来了解EulerMaker。

      除此之外,教程主要向读者介绍如何通过客户端使用命令行完成构建。

      如果读者是一个EulerMaker的初学者,那么入门指南将是一个比较不错的开始,如果想要更多更详细的内容,请查看用户手册。

      EulerMaker入门

      开始使用 EulerMaker

      本导读将向您介绍EulerMaker的主要构建能力。

      准备工作

      第一次使用EulerMaker,您需要访问EulerMaker地址登陆,完成用户注册。注册流程可参考 注册登录

      创建您的第一个构建任务

      说明:该功能可完成软件包源码到二进制包的构建工作

      1. 通过导入yaml文件创建私有工程,该工程可复用,yaml内容可参考创建工程yaml
      2. 触发单包构建,工程详情页面点击软件包名如图1,跳转至软件包详情页面,点击开始构建如图2,接下来您可在构建历史页面中查看构建进展详情。

      图 1 点击需要构建的软件包名 图 2 软件包详情页面 3. 构建完成后可在软件包详情页面,点击“下载”页签,查看软件包详情及下载软件包。

      创建您的第一个包定制任务

      说明:该功能可完成个人自定义包构建工作

      1. 通过导入yaml文件创建工程,yaml内容可参考创建工程yaml
      2. 触发单包构建,工程详情页面点击软件包名,跳转至软件包详情页面,点击开始构建按钮,接下来您可在构建历史页面中查看构建进展详情。

      图 3 工程详情页面

      图 4 工程配置页面

      创建您的第一个镜像定制任务

      说明:该功能可完成自定义版本镜像制作

      1. 通过导入yaml文件创建版本镜像流水线,yaml内容可参考创建流水线yaml
      2. 点击镜像构建按钮,触发镜像构建,接下来您可在构建历史页面查看构建历史。

      图 5 流水线详情定制业务包修改页面

      图 6 流水线构建历史页面

      用户手册概述

      本页提供EulerMaker用户手册文档概述。如果您是初次使用EulerMaker,请参阅【注册登录】完成用户注册 如果您已经是EulerMaker的用户想进一步了解EulerMaker的使用,请参阅独立章节以获取关于EulerMaker核心特性的更多信息。

      常见业务使用场景介绍

      社区软件包单包构建测试

      场景描述

      软件包引入、CVE类问题解决、软件包升级降级、bugfix后快速完成构建测试。

      处理步骤

      此处以软件包python-flask为例

      1. 将python-flask软件仓由python-flask fork到个人私仓。
      2. 创建构建后添加软件包时填写个人私仓的git地址,也可通过继承工程,在工程详情页面修改软件仓地址及分支。
      3. 配置构建环境及软件源。
      4. 触发单包构建,查看构建日志及构建结果。

      批量添加软件包到工程中

      场景描述

      工程中需完成批量添加软件包。

      简易步骤
      1. 创建工程时通过yaml导入方式,yaml内容可参考创建工程,yaml文件多包配置示例如下:
      package_repos:
          # 软件包名(必填)
        - spec_name: bcc
          # 软件包仓库url(必填)
          spec_url: https://gitee.com/src-openeuler/bcc.git
          # 软件包仓库分支(选填, 默认master分支)
          spec_branch: master
        - spec_name: redis
          spec_url: https://gitee.com/src-openeuler/redis.git
          spec_branch: master
         - spec_name: python-flask
          spec_url: https://gitee.com/src-openeuler/python-flask.git
          spec_branch: master 
      
      1. 项目创建成功后只展示package_repos中的软件包如图1,触发一次全量或者增量构建后,在工程详情页面软件包中可查看批量增加的软件包如图2

      2. 对已创建的工程,可使用ccb update命令更新工程中package_repos,添加软件包组仓库。用户提供yaml文件示例如上示例

      3. 在命令行客户端执行如下命令更新工程信息 说明:命令行客户端配置可参考CLI客户端配置参考,创建package_repo_groups.yaml文件,使用命令行完成工程更新。

      ccb update projects os_project=xx --yaml package_repo_groups.yaml
      
      1. 项目更新后,触发一次全量或者增量构建后,在工程详情页面软件包中可查看批量增加的软件包如图2
      其他方式实现多包配置
      1. 创建工程时通过yaml导入方式,yaml内容可参考创建工程yaml,用户根据以下示例内容初始化用户自定义名为pkgbuild-repos的git仓库,并将该地址添加到yaml文件中spec_group_name字段对应的值,仓库目录结构及内容示例如下。

      2. pkgbuild-repos仓库目录结构:第一层为${package_name} 首字母小写,第二层为${package_name}名,第三层为${package_name}.yaml,可参考pkgbuild-repos

      |---a
         |---alex
            ---alex
      |---g
         |---ghc-Diff
            |---ghc-Diff
         |---ghc-Glob
            |---ghc-Glob
         |---ghc-HUnit
            |---ghc-HUnit.yaml
      |---h
         |---happy
      
      1. pkgbuild-repos/a/alex/alex.yaml文件内容示例,添加软件包源码仓地址。
      ---
      url:
      - https://gitee.com/src-openeuler/alex.git
      
      1. 项目创建成功后只展示package_repos中的软件包如图1,触发一次全量或者增量构建后,在工程详情页面软件包中可查看批量增加的软件包如图2

      图 1 展示package_repos中软件包 图 2 展示全部软件包

      1. 对已创建的工程,可使用ccb update命令更新工程中package_repo_groups,添加软件包组仓库。用户提供yaml文件示例如下:
      package_repo_groups:
        - spec_group_name: pkgbuild
          spec_group_url: https://gitee.com/baijing_0022/pkgbuild-repos-lizlin.git
      
      1. 在客户端执行如下命令更新工程信息
      ccb update projects os_project=xx --yaml package_repo_groups.yaml
      
      1. 项目更新后,触发一次全量或者增量构建后,在工程详情页面软件包中可查看批量增加的软件包如图2

      门禁对接EulerMaker

      场景描述

      热补丁,github,gitee上src-openeuler下仓库提交pr触发门禁检查

      处理步骤

      具体场景描述及处理步骤可参考门禁对接eulerMaker

      制作自定义镜像

      场景描述

      根据需求定制自定义镜像

      处理步骤
      1. 创建流水线,可选择服务器场景或边缘计算场景,流水线类型选择镜像定制,镜像格式选择iso_normal为例。
      2. 在定制业务包中配置产品信息,添加repo源及需要添加的rpm包
      3. 触发镜像构建,可在制作系统中查看构建状态及构建日志
      4. 构建成功后,可下载镜像到本地完成镜像安装

      登录EulerMaker构建平台web界面

      本章节以Windows 10操作系统安装的Chrome 109.0浏览器为例介绍登录EulerMaker构建平台Web界面的操作步骤。

      页面概览

      构建工程页面概览

      表 1 按钮说明

      类型按钮说明
      按钮创建继承工程
      触发全量工程构建
      触发增量构建
      用于工程锁定及解锁,工程锁定后不可触发构建、不可删除工程,只可继承工程,继承软件包
      用于删除工程,目前支持软删除,再次添加被删除的工程提示该工程已存在
      用于添加软加包
      用于刷新构建结果
      跳转至repo源下载页面

      工程构建历史页面概览

      表 2 图标/按钮说明

      类型按钮说明
      按钮用于刷新构建详情
      用于导出构建详情为excel表格
      用于查看本次构建包依赖关系
      用于查看本次构建包依赖关系及构建状态

      工程配置页面概览

      表 3 按钮说明

      类型按钮说明
      按钮用于添加工程的构建环境,架构,是否构建及发布
      用于添加构建源地址
      用于添加定制包的定制层及base层地址

      用户管理概览

      表 4 图标/按钮说明

      类型按钮说明
      按钮用于添加用户及设置用户角色

      软件包详情页面概览

      表 5 图标/按钮说明

      类型按钮说明
      按钮用于添加工程的构建环境,架构,是否构建及发布
      用于指定单个包进行增量构建,将本次构建二进制刷新至工程的repo源中
      用于软件包继承,继承包信息及工程配置信息
      用于锁定单个软件包,锁定时在全量构建中该包不进行构建,解锁后可触发构建
      用于删除单个软件包
      用于添加软件包构建环境及配置是否构建

      软件包构建历史概览

      软件包下载页面概览

      镜像定制页面缩览

      版本定制页面缩览 image

      浏览器要求

      浏览器要求如表1所示。

      须知:

      使用低版本浏览器可能会导致迁移工具性能降低或其他不可预知的结果。

      表 1 浏览器要求

      浏览器类型说明
      Google ChromeGoogle Chrome 72.0及以上版本

      注册登录流程

      操作步骤

      说明:

      • 默认情况下,系统超时时间为4小时,即在4小时内,如果您未在WebUI界面执行任何操作,系统将自动登出,此时需输入用户名和密码重新登录WebUI界面。
      1. 注册 用户首次访问WebUI界面,单击"注册"按钮,打开"注册"页面,如图1所示,需配置的参数如表2所示。

        图 1 用户注册
        表 2 创建用户参数说明

        参数说明
        账户名输入新建用户的账号名称。用户名需要满足如下要求:
        • 用户名可输入中英文
        • 长度范围为:6~32字符
        用户名输入新建用户的用户名称。用户名需要满足如下要求
        • 用户名可输入中英文
        • 长度范围为:6~32字符
        公钥保留功能,暂不填写
        • 参考表2配置新用户后,单击“确认”。

          说明:

          • 创建的普通用户数量没有限制。
        • 登录

          说明:

          • 登录前请先在openeuler社区注册社区用户,通过社区用户认证后才可登录EulerMaker平台。
          • openEuler社区用户注册地址:登录openEuler社区,根据页面提示完成注册。

          首页右上角点击“登录”,跳转至openeuler社区登录页面,如图1

          图 1 登录

          输入openeuler社区账号用户名、密码,如图2

          图 2 登录社区

          openeuler授权成功后,根据用户是否已经绑定eulermaker账号,跳转页面。

          • 已绑定:页面返回首页如图3 图 3 登录EulerMaker
          • 未绑定:页面跳转至账号注册页面,填写用户信息,完成注册。 图 4 用户注册

        创建工程

        前提条件

        已成功登录EulerMaker平台。

        说明

        • 普通用户只可以创建私有工程,管理员用户(EulerMakeradmin)可以执行创建公有工程操作。
        • 普通用户是工程maintainer时可对工程进行操作,否则只有读取权限、继承权限。
        操作步骤
        1. 首页点击构建工程的“查看”按钮,进入全部工程总体页面。

        2. 切换至私有工程页签点击"添加工程"按钮,填写工程基本信息,完成创建。

          表 3 创建工程参数说明

          参数说明
          工程名输入新建工程的名称。工程名需要满足如下要求:
          • 用户名只能包含'a-z','A-Z','0-9','-',':','.','_'
          • 默认长度范围为:3~128个字符
          描述输入描述需要满足如下要求:
          • 默认长度范围为:0~50个字符
          • 可输入中英文
          分支输入需要满足如下要求:
          • 分支名为真实存在的分支,不存在的分支名会导致后续构建任务失败
          • 不输入时缺省为master分支
          1. 参考表3完成工程信息填写,单击"确认"。

          说明

          • 同名工程无法创建成功,提示"工程名已存在,请不要重复添加"
          • 被删除项目为软删除,如果创建同名工程会提示"工程名已存在,请不要重复添加"
          1. 成功新建工程后,点击私有工程中列表中该工程名,页面跳转至工程详情页面 工程详情页面添加软件包,继承工程,触发全量、增量构建,锁定工程,删除工程,查看构建详情。
        添加package包
        1. 点击“添加软件包”按钮,打开添加软件包页面。 image

        2. 输入软件包信息,点击“确认”按钮,软件包添加成功。 image 表 4 添加软件包参数说明

          参数说明
          软件包名称输入软件包名称。用户名需要满足如下要求:
          • 软件包名为必填字段
          • 软件包名与git地址中仓库名相同
          • 默认长度范围为:1~50个字符
          描述输入构建包描述信息
          • 默认长度范围为:0~50个字符
          • 可输入中英文
          软件仓软件仓git地址要求:
          • 输入真实存在的git仓库地址
          分支输入需要满足如下要求:
          • 分支名为真实存在的分支,不存在的分支名会导致后续构建任务失败
          • 不输入时缺省为master分支
        工程配置
        1. 点击"工程配置"tab栏,跳转至工程配置页面。

        2. 此页面可编辑构建目标、软件源、分层定制、配置等工程配置信息。

          表 5 系统配置项说明

          配置项说明
          构建目标表示构建过程中的环境信息
          • 构建环境:为执行构建时启动容器的基础镜像
          • 架构:需要构建包的架构,目前系统有5种架构可供选择分别为aarch64,x86_64,loongarch64,riscv64,ppc64le,地基工程提供系统所有私有工程将所选项拼接后作为一个repo源使用
          • 地基工程:会将地基工程选择的项目名称拼接为yum源来使用
          • 构建开关:是否构建该条件下的包,默认为开启构建
          • 发布开关:是否发布为可用的源,默认为开启发布。单包构建任务构建的包不发布
          软件源
          • 软件源名称:可自定义
          • 软件源地址:工程有构建目标,要求至少构建目标一种架构下有效,没有构建目标则是要求至少系统支持的架构下有效
          • 软件源地址示例:https://repo.openeuler.org/openEuler-22.03-LTS/everything/
          分层定制针对定制包业务特定的配置,普通包构建可不配置该项。
          • 分层URL名称可自定义
          • URL为定制层git仓库路径
          工程配置config工程配置config中按照yaml格式可配置缓存开关使能,预安装包列表
          • squid_enable: y/n y为打开squid使能,n为关闭squid使能,软件包安装依赖时使能squid功能,加速编译
          • full_fetch: y/n y为打开强制fetch,n为关闭强制fetch,工程构建前包强制fetch所有的软件包源码
          • ccache_clear: y/n y为打开清除缓存,n为关闭缓存,软件包构建前清除ccache缓存
          • skip_check: y/n y为跳过check,n为不跳过check,软件包构建时跳过check阶段
          • preinstall: 软件包构建前预安装软件包
          • macros: rpm的构建宏配置
          • use_xz: 构建前对于源码包中的文件夹使用tar.xz格式打包,默认使用tar.gz格式打包
          • use_kmod_libs: 构建前安装kmod-libs
          • disable_check_path: 软件包构建时不进行check rpath检查
          • use_git_lfs: 使用git lfs下载仓库
        3. 工程config配置示例

        squid_enable: y
        full_fetch: y
        ccache_clear: 
        skip_check: y
        preinstall: 
        - selinux-policy
        - compat-openssl11-libs
        - openEuler-rpm-config
        - digest-list-tools
        - selinux-policy-targeted
        - pesign-obs-integration
        - glibc
        - bash
        - rpm
        macros:
        - "%packager http://openeuler.org"
        - "%check_target_before_unlink 1"
        - "%_vendor openEuler"
        - "%dist .oe2309"
        - "%with_python3 1"
        - "%python3_pkgversion 3"
        - "%openEuler 1"
        - "%openeuler 1"
        - "%__brp_digest_list /usr/lib/rpm/brp-digest-list %{buildroot}"
        use_xz:
        - openEuler-logos
        use_kmod_libs:
        - systemd
        - ndctl
        - dracut
        - pciutils
        - libblockdev
        - open-iscsi
        disable_check_path:
        - papi
        - kae_driver
        - kunpengsecl
        - texlive-base
        - lensfun
        - openjade
        - numpy
        

        继承工程

        1. 项目继承 工程详情页面点击“继承工程”按钮,填写继承项目名称 image 填写新工程名称,点击“确认”按钮,页面跳转至继承工程工程详情页面 image 项目继承只继承父项目工程配置信息,构建目标中地基工程显示父项目工程名 image
        2. 包继承 软件包详情页面点击“软件包继承”按钮,弹窗中默认显示包继承项目信息 image 弹窗中默认显示包继承项目信息,继承目标项目名称可编辑,点击“确认”按钮完成继承项目创建 image 包继承会继承包信息 image 包继承同时会继承工程配置信息 image

        包构建

        创建构建任务限制说明:

        • BUILD~DAG LIMIT DEFAULT: "2000" 系统全量和增量构建次数最大值
        • BUILD SINGLE LIMIT DEFAULT: "10000" 系统单包构建次数最大值
        • USER BUILD DAG LIMIT DEFAULT: "2" 用户触发全量或增量构建最大值
        • USER BUILD SINGLE LIMIT DEFAULT: "1000" 用户触发单包构建最大值
        • PROJECT BUILD DAG LIMIT DEFAULT: "1" 工程触发全量或增量构建最大值
        • PROJECT BUILD SINGLE LIMIT DEFAULT:"5" 工程触发单包构建最大值

        单包构建

        1. 在工程详情页面软件包列表中选择需要构建的包,点击软件包名进入软件包详情页面。 image
        2. 软件包详情页面软件仓配置中可修改git地址及分支。
          配置项说明
          软件仓配置
          • git地址:显示添加软件包时添加的代码仓地址,可编辑
          • 分支:显示添加软件包时添加的代码分支信息,可编辑
        3. 单包构建环境设置
          配置项说明
          构建目标表示构建过程中的环境信息
          • 构建环境:为执行构建时启动容器的基础镜像
          • 架构:需要构建包的架构,目前系统有3种架构可供选择分别为aarch64,x86_64,loongarch64,riscv64,ppc64le,地基工程提供系统所有私有工程将所选项拼接后作为一个repo源使用
          • 地基工程:会将地基工程选择的项目名称拼接为yum源来使用
          • 构建开关:是否构建该条件下的包,默认为开启构建
          • 发布开关:是否发布为可用的源,默认为开启发布。单包构建任务构建的包不发布
        4. 点击“开始构建”按钮。 image
        5. 切换至构建历史页面中可查看该构建任务执行情况,也可返回该项目的构建历史页面中查看构建状态。

        全量构建

        1. 在工程详情页面点击全量构建按钮,可触发全量构建。 image
        2. 切换至构建历史页面,点击构建历史列表中选择需要查看的构建ID,右侧构建详情中展示该构建任务中待构建包列表及构建状态,点击上方“导出”按钮可将待构建包列表导出为xlsx文件。 iamge

        增量构建

        1. 在工程详情页面点击“增量构建”按钮,可触发增量构建。 image
        2. 切换至构建历史页面,点击构建历史列表中选择需要查看的构建ID,右侧构建详情中展示该构建任务中待构建包列表及构建状态,点击上方“导出”按钮可将待构建包列表导出为xlsx文件。 iamge

        构建历史查看

        工程构建历史查看

        1. 在工程详情页面点击构建历史页签,可查看该工程历史构建任务及构建详情
        2. 点击构建历史中任意一条构建ID, 页面右侧显示该次构建任务构建包的spec名称,状态,构建详情。 image
        3. 点击构建详情页面“DAG关系表”按钮,可查看本次构建任务依赖关系及构建相关信息 image

        获取软件包

        1. 在工程页面软件包列表中选择需要下载的包,点击包名进入软件包详情页面。
        2. 切换至下载tab页,该页面展示最新构建出的软件包,点击“下载”按钮下载包,点击“查看详情”按钮查看软件包详情。 image

        镜像定制

        添加流水线

        1. 创建流水线 首页点击“镜像定制”的查看按钮,跳转页面到流水线列表全部页面。 image

          点击“添加流水线”功能按钮,选择流水线场景,下一步后填写流水线工程基本信息 image

        说明:

        • 其中,镜像定制中的iso镜像是基于ImageTailor工具进行制作,可以针对iso进行深度化定制,包括:添加用户自定义文件、配置内核参数、添加驱动等,详情可以参考章节6高级特性;而iso_normal镜像则是基于oemaker工具进行制作,只进行rpm包粒度的裁剪,只针对iso镜像做浅度化定制。用户可以根据自身需求选择相应的镜像进行定制。 流水线类型可选择版本镜像及镜像定制两种类型,点击确认按钮完成创建 image
        1. 查看新建的流水线工程 成功新建流水线工程后,点击创建后的流水线名称,页面跳转至流水线详情页面 image

        版本镜像类型

        版本参数配置

        1. 点击“版本参数配置”框,右侧跳转至版本参数配置页面,点击“修改”按钮,添加版本参数配置信息,其中表单字段校验规则如下: image
        表单字段校验规则
        repo源地址地址长度小于1000,且配置多个repo源时用空格分割
        镜像类型只针对iso镜像,必填选择框
        产品名称只允许字母数字,且“产品名称-版本号[-Release号]-架构”的字符个数不超过32
        版本号只允许字母数字和“-”和“.”,必须字母或数字开头,且“产品名称-版本号[-Release号]-架构”的字符个数不超过32
        Release号可缺省,若填写,则规则与版本号相同

        镜像定制类型

        定制业务包

        docker/mini_docker/mini_cpio格式
        1. 点击创建好的镜像定制类型流水线名称,进入流水线详情。
        2. 点击定制业务包按钮,右边切换至定制业务包界面,界面如下图,点击修改按钮进入修改界面。 image
        3. 添加repo源,输入需要添加rpm包的repo源的正确url地址。
        4. 添加rpm包:配置好正确的repo源后,点击添加按钮,弹出添加rpm包弹窗,勾选需要的rpm包,也可以通过弹窗右上角搜索需要的rpm包,点击确认即可保存。若要删除已添加的rpm包,点击rpm包表格操作列的移除或者勾选需要删除的rpm包,点击批量移除按钮即可。 image
        5. 填好各项配置后,点击右上角保存按钮。
        iso_normal/raspi/qcow2格式
        1. 点击创建好的镜像定制类型流水线名称,进入流水线详情。
        2. 点击定制业务包按钮,右边切换至定制业务包界面,界面如下图,点击修改按钮进入修改界面。 image
        表单字段校验规则
        产品名称只允许字母数字,且“产品名称-版本号[-Release号]-架构”的字符个数不超过32。
        版本号只允许字母数字和“-”和“.”,必须字母或数字开头,且“产品名称-版本号[-Release号]-架构”的字符个数不超过32。
        Release号可缺省,若填写,则规则与版本号相同。
        添加repo源输入需要添加rpm包的repo源的正确url地址。
        添加rpm包可选择添加rpm包及批量删除rpm包。

        制作系统

        1. 点击“制作系统”框,右侧自动跳转至制作系统页面,点击下方镜像构建按钮,弹出构建弹窗,点击确认按钮,页面显示相应的构建状态以及相关构建日志。 image

        镜像下载及构建日志查询

        1. 方法一:镜像构建完成后,点击流水线中制作系统页面,下方显示构建日志信息,点击镜像下载按钮,将镜像下载至本地。 image

        2. 方法二:镜像构建完成后,点击流水线中的构建历史页面,操作栏显示镜像下载、查看日志选项。点击查看日志可进入构建日志页面。点击镜像下载按钮,将镜像下载至本地。 image

        构建历史

        1. 在流水线详情页面,点击构建历史,跳转至流水线构建历史页面。 image

        2. 根据该页面查看流水线历史的镜像构建信息以及相关的镜像和构建日志。 image

        用户管理

        1. 在流水线详情页面,点击用户管理,跳转至流水线用户管理页面。 image

        2. 点击“添加用户”按钮,填写相关用户名称,并设置相应的用户权限(Maintainer/Reader)。 image

        流水线工程克隆

        1. 点击需要克隆的流水线,进入到流水线详情页面,点击下方“克隆按钮”,填写或选择克隆流水线分组,填写新流水线名称后,点击确认按钮,完成流水线克隆。 image

        2. 页面跳转至克隆的流水线详情页面,流水线克隆了相应的配置参数信息。

        删除流水线

        1. 点击需要删除的流水线,进入到流水线详情页面,点击下方“删除按钮”,弹出确认窗口,点击确认按钮,删除整条流水线,包括相关构建的镜像。 image

        5、基于命令行进行构建

        本地安装EulerMaker客户端

        EulerMaker 将 lkp-tests 作为客户端,通过本地安装 lkp-tests,lkp-tests提交任务依赖ruby,建议安装ruby2.5及以上版本。

        下载安装 lkp-tests

        1. 通过下载lkp-tests rpm包进行安装,服务器要求架构:x86,arm,龙芯,操作系统:openEuler-22.03-LTS,openEuler-22.03-LTS-SP2。
            wget https://eulermaker.compass-ci.openeuler.openatom.cn/api/ems1/repositories/openEuler-packaging/ccb-1.0-6.noarch.rpm
            rpm -i ccb-1.0-6.noarch.rpm
            rpm -qa | grep ccb
        

        配置文件

        本地配置文件配置用户名, 密码、网关等信息:

        • #{ENV['HOME']}/.config/cli/defaults/*.yaml,该文件中需手动添加部分参数完成配置,本文为yaml格式请注意编写规范,冒号后需添加空格。
        • 客户端环境要求:支持x86、arm、龙芯架构的openeuler-22.03-LTS及openEuler-22.03-LTS-SP2服务器
          GATEWAY_IP: eulermaker.compass-ci.openeuler.openatom.cn  #网关配置必填
          GATEWAY_PORT: 443
          SRV_HTTP_REPOSITORIES_HOST: eulermaker.compass-ci.openeuler.openatom.cn
          SRV_HTTP_REPOSITORIES_PORT: 443
          SRV_HTTP_REPOSITORIES_PROTOCOL: https://  #仅用于ccb download子命令,若无下载需求,可以不配置
          SRV_HTTP_RESULT_HOST: 443  存储job日志的微服务
          SRV_HTTP_RESULT_PORT: 443
          SRV_HTTP_RESULT_PROTOCOL: https://   #仅用于ccb log子命令
          ACCOUNT: xx  #配置openeuler社区账号,社区账号及密码若不配置只能执行游客可执行的命令
          PASSWORD: xx  #配置openeuler社区账号密码
          OAUTH_TOKEN_URL: https://omapi.osinfra.cn/oneid/oidc/token
          OAUTH_REDIRECT_URL: https://eulermaker.compass-ci.openeuler.openatom.cn/oauth
          PUBLIC_KEY_URL: https://omapi.osinfra.cn/oneid/public/key?community=openeuler
        

        配置完成后可执行以下命令,查看是否可以正常使用ccb命令。

        ccb -h/--help
        

        CLI 客户端

        命令总览

        # CRUD
        # Elasticsearch 7.x文档基本操作(CRUD) 
         https://www.cnblogs.com/liugp/p/11848408.html
          Elasticsearch CRUD基本操作
         https://www.cnblogs.com/powercto/p/14438907.html
        
        ccb create <index> <os_project> k=v|--json JSON|--yaml YAML # Details see "ccb create -h".
        ccb update <index> <os_project> k=v|--json JSON|--yaml YAML
        
        ccb select <index> <os_project> k=v|--json JSON-file|--yaml YAML-file [-f/--field key1,key2...]
                      [-s/--sort key1:asc/desc,key2:asc/desc...]
        ccb download os_project=<project_name> packages=<package_name> architecture=x86/aarch64 [--sub] [--source] [--debuginfo]
        ccb cancel $build_id
        ccb build  
        ccb log <job_id> 
        ccb build-single os_project=<project_name> packages=<package_name> k=v|--json JSON-file|--yaml YAML-file
        ccb ls -p os_project <repo> -a <arch>
        ccb query -f <info> -r <rpm_path>  #<info> job_id build_id
        ccb local-build key1=val1 key2=val2 ... --rm --debug=bp/bc/bi
        ccb lb key1=val1 key2=val2 ... --rm --debug=bp/bc/bi
        ccb local-rebuild job_id=cbs.001 --showdocker
        ccb lr job_id=cbs.001 --showdocker
        

        命令权限说明

        命令关键字adminmaintanerreaderotherguest备注
        create×N
        update×××同一工程不同角色权限
        selectN
        download×同一工程不同角色权限
        cancel×××同一工程不同角色权限
        log同一工程不同角色权限
        build-single×××同一工程不同角色权限
        build×××同一工程不同角色权限
        local-build×N
        local-rbuild×N

        命令详情

        1. ccb select查询各表信息

        查询所有的projects全部信息

        ccb select projects
        

        注意: rpms和rpm_repos,这两个表由于数据量过大,无法通过ccb select 表名命令直接查询该表的全部信息, 查询rpms表必须使用-f指定过滤字段或者使用key=value指定明确的过滤条件。

        ccb select rpms -f repo_id
        ccb select rpms repo_id=openEuler-22.03-LTS:baseos-openEuler:22.03-LTS-x86_64-313
        

        查询rpm_repos表必须使用key=value指定明确的过滤条件,如果不知道value的值,可以先查询其他表获取,然后再使用key=value查询rpm_repos表。

        ccb select builds -f repo_id  # 先查询builds获得repo_id值
        ccb select rpm_repos repo_id=openEuler-22.03-LTS:baseos-openEuler:22.03-LTS-x86_64-313 # 使用上个命令获得的repo_id值查询rpm_repos表
        

        查询符合要求的projects的全部信息

        ccb select projects os_project=openEuler:Mainline owner=xxx
        

        查询符合要求的projects的部分信息

        ccb select projects os_project=openEuler:Mainline --field os_project,users
        

        查询符合要求的projects的部分信息并排序

        ccb select projects os_project=openEuler:Mainline --field os_project,users --sort create_time:desc,os_project:asc
        

        列出指定project的所有snapshot(快照)

        ccb select snapshots os_project=openEuler:Mainline
        

        注:查看其它表类似

        2.ccb create project

        创建project

        ccb create projects test-project --json config.json  #config.json文件请用户根据下面模板自行创建
        config.json:
        {
            "os_project": "test-project",
            "descrption": "this is a private project of zhangshan",
            "my_specs": [
                {
                    "spec_name": "gcc",
                    "spec_url": "https://gitee.com/src-openeuler/gcc.git",
                    "spec_branch": "openEuler-20.03-LTS"
                },
                {
                    "spec_name": "python-flask",
                    "spec_url": "https://gitee.com/src-openeuler/python-flask.git",
                    "spec_branch": "openEuler-20.03-LTS"
                }
            ],
            "build_targets": [
                {
                    "os_variant": "openEuler_20.03",
                    "architecture": "x86_64"
                },
                {
                    "os_variant": "openEuler_20.03",
                    "architecture": "aarch64"
                }
            ],
            "bootstrap_rpm_repo": [
                {
                    "name": "everything",
                    "repo": "https://repo.openeuler.org/openEuler-22.03-LTS-SP1/everything"
                }
            ],
            "flags": {
                "build": true,
                "publish": true
            }
        }
        

        3. ccb update projects $os_project

        project添加package

        ccb update projects $os_project --json update.json  # os_project为需要更新得工程名
        update.json:
        {
            "my_specs+": [
                {
                	"spec_name": "python-flask",
        		    "spec_url": "https://gitee.com/src-openeuler/python-flask.git",
        		    "spec_branch": "master"
                },
                ...
            ]
        }
        

        project增删user

        ccb update projects $os_project --json update.json
        update.json:
        {
            "users-": ["zhangsan"],
            "users+": {
                "lisi": "reader",
        	    "wangwu": "maintainer"
            }
        }
        

        锁定某个package

        ccb update projects test-project package_overrides.$package.lock=true
        

        解锁某个package

        ccb update projects test-project package_overrides.$package.lock=false
        

        4. 单包构建

        build_targets可以不传,可以有1或多个,如果不传,采用os_project默认配置的build_targets。

        ccb build-single os_project=test-project packages=gcc --json build_targets.json
        build_targets.json:
        {
            "build_targets": [
                {
                    "os_variant": "openEuler:20.03",
                    "architecture": "x86_64"
                },
                {
                    "os_variant": "openEuler:20.03",
                    "architecture": "aarch64"
                }
            ]
        }
        

        5. 全量/增量构建

        指定build_type=full则为全量构建,指定build_type=incremental则为增量构建; build_targets参数与单包构建中的build_targets一样,可以不传,可以有1或多个,如果不传,采用os_project默认配置的build_targets; 如果指定snapshot_id,则os_project可不传,表示基于某个历史快照创建全量/增量构建。

        ccb build os_project=test-project build_type=full --json build_targets.json # 全量构建
        ccb build snapshot_id=xxx build_type=incremental --json build_targets.json # 增量构建
        build_targets.json: 
        {
            "build_targets": [
                {
                    "os_variant": "openEuler:20.03",
                    "architecture": "x86_64"
                },
                {
                    "os_variant": "openEuler:20.03",
                    "architecture": "aarch64"
                }
            ]
        }
        

        6. 下载软件包

        如果指定snapshot_id,则os_project可不传; dest表示指定软件包下载后存放的路径,可不传,默认使用当前路径。

        基本用法:

        ccb download os_project=test-project packages=python-flask architecture=aarch64 dest=/tmp/rpm
        ccb download snapshot_id=123456 packages=python-flask architecture=aarch64 dest=/tmp/rpm
        

        -s的用法:

        # 使用-s 表示下载该packages的源码包。示例如下所示:
        ccb download os_project=test-project packages=python-flask architecture=aarch64 -s
        

        -d的用法:

        # 使用-d 表示下载该packages的debug(debuginfo和debugsource)包。示例如下所示:
        ccb download os_project=test-project packages=python-flask architecture=aarch64 -d
        

        -b的用法:

        # 使用-b all 表示下载该packages的所有子包。示例如下所示:
        ccb download os_project=test-project packages=python-flask architecture=aarch64 -b all
        
        # 使用-b $rpm 表示下载该packages的指定子包$rpm,指定多个子包以逗号分隔。示例如下所示:
        ccb download os_project=test-project packages=python-flask architecture=aarch64 -b python2-flask
        ccb download os_project=test-project packages=python-flask architecture=aarch64 -b python2-flask,python3-flask
        

        -s -d -b 组合使用

        # 使用-b all -s -d 表示下载该packages的debug包,源码包和所有子包。示例如下所示:
        ccb download os_project=test-project packages=python-flask architecture=aarch64 -b all -s -d
        
        # 使用-b $rpm -s -d 表示下载该packages的debug包,源码包和指定子包(指定多个子包以逗号分隔)。示例如下所示:
        ccb download os_project=test-project packages=python-flask architecture=aarch64 -b python2-flask -s -d
        ccb download os_project=test-project packages=python-flask architecture=aarch64 -b python2-flask,python3-flask -s -d
        

        7. cancel 取消构建任务

        ccb cancel $build_id
        

        8. 查看job日志

        ccb log $job_id
        

        9. 通过rpm包查询job相关信息

        ccb query -f job_id -r rpm_path #该rpm包为统一构建平台构建产物, 可查询多个job信息,rpm包路径/srv/repositories/$os_project/... 可使用tab键到对应架构的Packages目录下:
        ccb query -f 'job_id, os_project' -r rpm_path
        

        10. 本地构建

        说明: 1、创建工程时应选择openEuler-22.03-LTS-Next、openEuler-22.03-LTS-SP1、openEuelr-22.03-LTS-SP2、openEuelr-22.03-LTS-SP3、openEuler-20.03-LTS-SP4以上分支

        ccb local-build os_project=xx package=xx --rm --debug=bp/bc/bi  # os_project可选择私有工程列表中已创建的工程,package选择该工程中的软件包
        ccb local-build os_project=xx package=xx spec=gcc.spec --rm --debug=bp/bc/bi
        ccb lb os_project=xx package=xx --rm --debug=bp/bc/bi
        

        使用rm删除本次构建环境,反之构建环境一直保留

        ccb local-build os_project=xx package=xx --rm
        

        使用debug表示可将构建在执行到pre(解压与打补丁), build,install阶段停止,并进入容器进行调试

        ccb local-build os_project=xx package=xx --debug=bp
        ccb local-build os_project=xx package=xx --debug=bc
        ccb local-build os_project=xx package=xx --debug=bi
        

        11. 重复构建

        ccb local-rebuild job_id=cbs.001 --showdocker  # job_id应为系统真是存在的id信息
        ccb lr job_id=cbs.001 --showdocker
        

        使用showdocker构建完成后显示本次构建容器名称和容器id

        ccb local-rebuild job_id=cbs.001 --showdocker
        

        12. 单包指定增量构建

        ccb build os_project=xx build_type=specified --json select_pkgs.json  #os_project可选择私有工程列表中已创建的工程
        

        6、高级特性

        定制包构建

        用户可在软件包官方仓的基础上实现用户自定义改动,不需要fork官方仓库改动源码仓的spec文件,而是通过编写定制化yaml文件实现spec文件的自定义改动,实现一次编写yaml文件多次复用。可通过两种模式完成自定义包构建,目前仅开放spec+yaml模式。

        spec+yaml模式流程介绍

        说明:

        • spec+yaml模式:使用定制包的源码仓作为定制底层,用户通过编写自定义层中的yaml文件,在自定义层中配置合并策略及合并优先级,通过分层定制工具将底层spec与自定义层的yaml进行合并,生成新的spec文件完成spec文件的定制,可以有多个用户自定义层。
        1. 创建定制包工程,在工程详情页面中添加需要定制的包 image
        2. 在工程配置页面,选择构建目标,添加软件源,在分层定制模块中配置用户自定义层的地址 image
        3. 在工程详情页面点击全量构建,增量构建完成定制包构建,也可触发单包构建单独定制某一个包 image
        4. 初步了解分层定制流程后,我们可以参考换标层定制更直观的去体验分层定制功能

        定制层模型介绍(用户自定义层)

        1. 定制层为一个包含libs,pkgs,rpmrc,types的git仓库,可参考定制层 制作用户自定义层。
        • pkgs 软件包目录,其中每个软件包建立自己的文件夹
        • types 给出了全局层模型的定义,定义了各个关键字的类型,合并方法,检验方法;(此处是基础定义,每个包中可以定义自身的合并策略或校验方法)
        • use 全局参数,软件包可以引用全局参数,引用后全局的参数会加载到软件包的配置中(当前还没找到使用方式)
        • lib python类库,这些py为全局使用,因此应当避免出现重复的函数名称
        1. pkgs目录文件创建及说明
        • pkgs目录存放定制软件包yaml文件,层级为pkgs/$package/package.yaml,package.yaml文件中进行定制内容编写 SPEC字段与YAML字段对照表: Name => name Version => version Release => release Epoch => epoch

          Summary => meta.summary Group => meta.group License => meta.license URL => meta.homepage %description => meta.description

          Source0 => source.0[:fetcher] Patch0 => patchset.0

          Provides => provides Requires => requires BuildRequires => buildRequires (new) => testRequires Recommends => recommends Suggests => suggests Supplements => supplements Enhances => enhances Conflicts => conflicts BuildConflicts => buildConflicts Obsoletes => obsoletes

          ExcludeArch => excludeArch ExclusiveArch => exclusiveArch BuildArch => buildArch

          %package => subpackage.

          %prep => phase.unpack + phase.patch %conf => phase.configure %build => phase.build %install => phase.install %check => phase.check

          %files => files %changelog => 放入独立changelog.md文件

          %pre => runtimePhase.pre %post => runtimePhase.post %preun => runtimePhase.preun %postun => runtimePhase.postun %pretrans => runtimePhase.pretrans %posttrans => runtimePhase.posttrans %verify => runtimePhase.verify

        • 定制软件包package.yaml文件语法说明:

          a. version字段的定制和比较: version字段⽀持带横线,即version = 5.10.0-136合法,且5.10.0-136 > 5.10.0-89 当前软件包的version比较⽅法

          @:5.10.0表⽰<=5.10.0
          @5.10.0:表⽰>=
          @5.0.0:5.10.0表⽰5.0.0~5.10.0
          @5.10.0表⽰==
          

          定制常⽤⽅式:

          # 定制层package.yaml 
          version: 4.0.13 
          # 定制层default.yaml
          docType: sw-package  #设置层优先级
          # base层package.yaml  #base层spec经过工具自动转换为yaml文件,不需要手动修改
          version: 4.0.14  
          # types/package.yaml      #定义合并策略
          types.package.version: str
          types.package.version:checkFunc: is_version
          types.package.version:mergeFunc: merge_policy_first  # 替换
          # 合并后
          version: 4.0.13
          

          b. defineFlags 扩展定制
          普通字段的扩展定制:

          # 定制层1/package.yaml
          buildRequires when +ncurses:    
             - aaa 
          
          # 定制层2/package.yaml
          defineFlags:   
             +ncurses: use ncurses library
          
          # base层spec
          buildRequires: bbb 
          
          # types/package.yaml
          types.package.buildRequires: list
          types.package.buildRequires:mergeFunc: merge_policy_pre_extend # 数组前置叠加
          
          # 合并后
          %bcond_without ncurses
          buildRequires: aaa
          buildRequires: bbb
          =======================================
          
          # 定制层1/package.yaml
          buildRequires when not +ncurses:
            - aaa
          
          # 定制层2/package.yaml
          defineFlags:
            +ncurses: use ncurses library
          
          # base层spec
          buildRequires: bbb
          
          # types/package.yaml
          types.package.buildRequires: str
          types.package.buildRequires:mergeFunc: merge_policy_pre_extend # 数组前置叠加
          
          # 合并后
          %bcond_without ncurses
          buildRequires: bbb
          ========================================
          
          # 定制层1/package.yaml
          buildRequires when -ncurses:    
            - aaa 
          
          # 定制层2/package.yaml
          defineFlags:
            -ncurses: not use ncurses library
          
          # base层spec
          buildRequires: bbb 
          
          # types/package.yaml
          types.package.buildRequires: str
          types.package.buildRequires:mergeFunc: merge_policy_extend # 数组前置叠加
          
          # 合并后 
          %bcond_with ncurses
          buildRequires: bbb
          buildRequires: aaa
          

          c. configure字段的扩展定制

          fedora:    
            doc:              #description-fedora     
            values:           # default to bool values: true false; otherwise is a list of words     
            default: true     
            when: f2=xxx      # f1 is only valid when f2 is xxx     
            configurexxx.vars:    --enable-f1 # 适⽤于绝⼤部分情况,⾃动拼装configure选项 
          
          openeuler:     
            configurexxx.options: --with-f3=xxx # 少数情况下,需⼿动拼装configure选项
          

          Examples:

          # 定制层1/package.yaml
          use.f1: true
          
          # 定制层2/package.yaml
          defineFlags:    
              f1:         
                  default: true         
                  configure.vars: --with-cabs  # 对configure的定制前提必须是该软件包有 configure,否则不⽣效,configurexxx.var需要与phash.sh中函数名对应                         
                  buildRequires: musl-devel
          
           # 合并后 
           %global build_configure_flags \     
              --with-cabs 
            BuildRequires: musl-devel
          =============================================================================================================
          # 定制层1/package.yaml
          use.f1: false
          
          # 定制层2/package.yaml
          defineFlags:    
              f1:         
                  default: true         
                  configure.vars: --with-cabs  # 对configure的定制前提必须是该软件包有 configure,否则不⽣效,configurexxx.var需要与phash.sh中函数名对应                         
                  buildRequires: musl-devel
          
           # 合并后 
           %global build_configure_flags \     
              --without-cabs 
          

          d. 变量引⽤及定制

          # 定制层1/package.yaml
          ncurses: true # 合并后patch生效,若改为false,则patch不生效
          
          # 定制层2/package.yaml
          patchset when ${{pkg.ncurses}}: 
              20: aaa.patch
          
          # base层spec
          patch19: bbb.yaml
          
          # 合并后 
          Patch19: bbb.yaml
          Patch20: aaa.yaml
          
          • top.pkgs.xxx(软件包名).xxx(字段)对其他软件包的指定变量进⾏引⽤,例如:
            xxx when ${{top.pkgs.kernel.version}} >= 5.10.0
            
          • pkg.xxx对当前软件包的指定变量进⾏引用
          • ${{xxxx}},匹配为宏,例如${{pkg.version}}

          e. Patch的定制

          # 定制层 
          Patchset:  # 新增Patch字段时,序号只能为数字,且不能与baseOS相同,否则不⽣效     
              0: xxxxxxx      
              2: xxxxxxx  
          
          # base层 
          Patch0: xxxxxxx 
          Patch1: xxxxxxx
          
          # 合并后 
          Patch0: xxxxxxx 
          Patch1: xxxxxxx 
          Patch2: xxxxxxx
          
          f. 设置指定字段的合并策略
          建议不常⽤的合并策略在软件包内部的package.yaml进⾏定义:
          
          Example1:
          # 设置build.opt的策略为以空格为分隔符追加 
          # ⽅法⼀,在types中设定
          types.package.build.optflags: str
          types.package.build.optflags:mergeFunc: merge_policy_concat 
          types.package.build.optflags:meregParams: " " 
          
          # ⽅法⼆,在package.yaml中设定 
          build.optflags:mergeFunc: merge_policy_concat 
          build.optflags:meregParams: " "
          
          Example2:
          # 设置prep的策略为以换⾏为分隔符向后追加(base_layer再前⾯,按顺序加载) 
          # ⽅法⼀,在types中设定 
          types.package.phase: str types.package.pahse:mergeFunc: merge_policy_pre_concat 
          types.package.build.optflags:meregParams: "\n"  
          
          # ⽅法⼆,在package.yaml中设定 
          phase.prep:mergeFunc: merge_policy_concat
          

          g. 宏的定制

          # 定制层package.yaml
          # 以下两种定制方式二选一即可
          # 配置方式1,该定制方式可以在rpmGlobal下同时定制多个宏
          rpmGlobal:
              product_family: test
          
          # 定制方式2
          rpmGlobal.product_family: test
          
          # 定制层types/package.yaml
          # 此处的实例是替换策略,可选其他策略,也可以在${软件包}/package.yaml中定义合并策略,参考前面合并策略的定制
          types.package.rpmMacros:type: list
          types.package.rpmMacros:mergeFunc: merge_policy_first
          
          # base层spec
          %define product_family %{?_vendor:%{_vendor}}%{!?_vendor:openEuler}
          
          # 合并后
          %global product_family test
          

          h. 其他相关语法

          定制软件包的package.yaml不能为空 多重限制条件⽀持when and/or/not和括号

              xxxx when xxx and xxx: 
              xxxx when xxx or xxxx: 
              xxxx when not xxx: 
              xxxx when not (xxx and xxx):
          

          定制make选项:

              build.cmake.flags:     
                  - WITHXXX: XXXX 
              => 
              cmake -WITHXXX=XXXXX
          

          定制configure的CFLAGS选项:build.cflags: xxx

          %pre, %preun, %post, %postun, %files字段在runtimePhase字段下

          Examples:

          # 定制files,其他几个字段类似
          runtimePhase.files: |
            %config /etc/test-latest
            %attr(0444, root, root) /etc/test-latest  
          
          # 在package.yaml中指定files的合并策略为替换,types中设置珂参照合并策略章节
          runtimePhase.files:mergeFunc: merge_policy_first
          
        • pkgs中的default.yaml不可缺少,用于base层和自定义层的优先级设置,当前默认为base层在底层,自定义层在上层。default.yaml文件模板如下

        configFilesPattern: (?P<_pkgname>[-0-9a-zA-Z._]+)(/|\\)(package\.yaml)
        registerConfigSpaceForEachFile:
          pkgs.${{pkg._basename}}:fspath: "${{pkg._filepath}}"
          files."${{pkg._filepath}}":
            name: "${{pkg._basename}}" # can catch spell error if conflict with the name defined in yaml
            docType: sw-package    # 设置层优先级
            includePhase: phase.sh
            includeRuntimePhase: runtimePhase.sh runtimePhase.lua
            include: versions.yaml files.yaml defineFlags.yaml
            :referAttrs: types.package
            meta:referAttrs: types.package.meta
            phase:referAttrs: types.package.phase
            runtimePhase:referAttrs: types.package.runtimePhase
        

        docType 按优先级顺序从高到低定义如下:

        env-user
        env-project
        env-system
        build
        distro
        hw-machine
        hw-board
        hw-chip
        hw-arch
        sw-package
        base
        
        merge_policy_first:替换
        merge_policy_concat:字符串向后追加
        merge_policy_config_concat:配置型字符串追加,默认分隔符为换行符
        merge_policy_pre_concat:字符串前置追加
        merge_policy_extend:数组向后追加
        merge_policy_pre_extend:数组前置叠加
        
        设置指定字段的合并策略,建议不常用的合并策略在软件包内部的package.yaml进行定义

        Example 1:

         # 设置version的策略为字符串向后追加
         types.package.version:type: str
         types.package.version:checkFunc: is_version
         types.package.version:mergeFunc: merge_policy_concat
        

        Example 2:

        # 设置buildrequires的策略为数组前置叠加
         types.package.buildRequires:type: list
         types.package.buildRequires:mergeFunc: merge_policy_pre_extend
        
        1. 分层定制语法特性介绍
        序号特性名称
        变量引用${{pkg.version}}
        ${{top.pkgs.kernel.version}}
        ${{pkg['version']}} => '3.1.0'
        ${{pkg.get('version')}} => '3.1.0'
        ${{pkg.has('version')}} => True
        条件语句>,<,<=,>=,==,=,and,or,not,(),when +xxx,when -xxx,when $${{use.xxx}}
        cmake选项定制build.cmake.flags:
          __PYTHIA__: true
        build.cmake.flags:
          BUILD_SHARED_LIBS:BOOL: ture
        inherit (导入配置)gcc-10.yaml
        include: gcc.yaml
        version: 10
        不同阶段定制untimePhase.post: systemctl stop firewalld
        runtimePhase.preun: systemctl stop numad
        version定制version: 5.10.0
        release定制release: xx
        buildrequires定制buildrequires: Bear
        增加patchpatchset:
          1001: openmp-vectorize-v2.patch
        key角度phase.sh|runtimePhase.sh
        files.yaml
        package.yaml
        make选项定制build.make.flags:
        configure选项定制build.configure.flags
          enable-static: false
        build.configure.flags
          (caps|cap|capabilities|linux-caps|libcap|libcap-ng): true
        build.configure.flags:
          --with-systemdsystemunitdir: /usr/lib/systemd/system
        build.cflags: ####
        build.optflags: -flto
        build.ldflags: -Wl,-q

        ISO/CPIO镜像定制

        iso/cpio格式定制业务包
        1. 创建服务器场景iso/嵌入式场景cpio镜像定制类型流水线,点击创建好的流水线名称,进入流水线详情。
        2. 点击定制业务包按钮,右边切换至定制业务包界面,界面如下图,点击修改按钮进入修改界面。 image
        3. 填写产品名称,填写安装镜像时的所展示的产品名称。
        4. 配置内核参数,为了系统能够更稳定高效地运行,用户可以根据需要修改内核命令行参数,多个参数使用空格分隔。
          例如:"net.ifnames=0 biosdevname=0 crashkernel=512M oops=panic softlockup_panic=1 reserve_kbox_mem=16M crash_kexec_post_notifiers panic=3 console=tty0"
        5. 添加repo源,输入需要添加rpm包的repo源的正确url地址。
        6. 添加rpm包:配置好正确的repo源后,点击添加按钮,弹出添加rpm包弹窗,勾选需要的rpm包,也可以通过弹窗右上角搜索需要的rpm包,点击确认即可保存。若要删除已添加的rpm包,点击rpm包表格操作列的移除或者勾选需要删除的rpm包,点击批量移除按钮即可。 image
        7. 添加驱动:填写驱动文件路径及文件名,多个以空格分隔,可选填。
        <drivers>
                <file name="arch/arm64/crypto/aes-ce-blk.ko"/>
                <file name="arch/arm64/crypto/aes-ce-ccm.ko"/>
                <file name="arch/arm64/crypto/aes-ce-cipher.ko"/>
            ......
        </drivers>
        
        1. 添加命令:填写系统命令,多个以空格分隔,可选填。
        <strip type="tools">
            <file name="aarch64-openEuler-linux-gnu-pkg-config"/>
            <file name="accessdb"/>
            <file name="acyclic"/>
            ......
        </strip>
        
        1. 添加库文件:填写库文件名称,多个以空格分隔,可选填。
        2. 删除其他文件:填写需要删除的文件路径及文件名,多个以空格分隔,可选填。
        3. 配置分区:点击加号图标,新增一条配置分区,根据需要填写以下配置,分区配置只在被安装机器的磁盘能被识别时才有效。 image
        • 磁盘索引:hd磁盘号(磁盘的编号),请按照 hdx 的格式填写,x 指第 x 块盘。
        • 挂载路径:指定分区挂载的路径。用户既可以配置业务分区,也可以对默认配置中的系统分区进行调整。如果不挂载,则设置为 '-'。

          说明:

          • 分区配置中必须有 '/' 挂载路径。其他的请用户自行调整。
          • 采用 UEFI 引导时,在 x86_64 的分区配置中必须有 '/boot' 挂载路径,在 AArch64 的分区配置中必须有 '/boot/efi' 挂载路径。
        • 分区大小:分区大小的取值有四种,可通过点击单位按钮来更换,最大上限为16T。其中MAX为指定将硬盘上剩余的空间全部用来创建一个分区,只能在最后一个分区配置该值。
        • 分区类型:分区有三种,主分区:primary;扩展分区:extended(该分区只需配置hd磁盘号即可);逻辑分区:logical。
        • 文件系统类型:目前支持的文件系统类型有:ext4、vfat。
        • 二次格式化标志位:表示二次安装时是否格式化,选择是或否。
        1. 配置网络:点击加号图标,新增一条配置网络,根据需要填写以下配置。
          image
        • BOOTPROTO:none:引导时不使用协议,不配地址;static:静态分配地址;dhcp:使用DHCP协议动态获取地址。
        • DEVICE:网卡名称,如eth0。
        • IPADDR:IP地址。当 BOOTPROTO 参数为 static 时,该参数必配;其他情况下,该参数不可配置。
        • NETMASK:子网掩码。当 BOOTPROTO 参数为 static 时,该参数必配;其他情况下,该参数不用配置。
        • netconfig: 填入0-9的数字,ISO镜像的网络配置文件中netconfig-0代表eth0的配置信息。
        <netconfig-0>
        BOOTPROTO="dhcp"
        DEVICE="eth0"
        IPADDR=""
        NETMASK=""
        STARTMODE="auto" 
        </netconfig-0>
        
        • STARTMODE:启用网卡的方法。manual:用户在终端执行 ifup 命令启用网卡。auto\hotplug\ifplug\nfsroot:当 OS 识别到该网卡时,便启用该网卡。off:任何情况下,网卡都无法被启用。
        1. 添加用户自定义文件:点击加号图标,弹出文件管理器弹窗,选择需要上传的文件,点击打开按钮即可上传,上传成功后状态变为成功,并且需要填写目标存放路径。若要删除文件,点击操作列的删除字段即可。
        2. 添加hook脚本:点击加号图标,弹出文件管理器弹窗,选择需要上传的hook脚本文件,文件名称需符合“S+数字(至少两位,个位数以0开头)”开头,数字代表hook脚本的执行顺序(脚本名称示例:S01xxx.sh),点击打开按钮即可上传,上传成功后状态变为成功,并且需要选择hook脚本存放的子目录。若要删除文件,点击操作列的删除字段即可。 image
        3. 填好各项配置后,点击右上角保存按钮。

        配置系统参数

        1. 只有ISO/CPIO格式需要配置系统参数。

        2. 进入创建好的流水线后,点击配置系统参数按钮,右边切换至配置系统参数界面,点击修改按钮进入修改界面。 image

        3. 配置主机参数:根据需要填写或选择相关参数,其中主机名为字母、数字、“-”的组合,首字母必须是字母或数字。

        4. 配置root初始密码:【密码校验格式】,两次需保持一致,可点击右边可视图标观测输入密码。

        5. 配置grub初始密码:【密码校验格式】,两次需保持一致,可点击右边可视图标观测输入密码,docker格式不用配置。

        6. 填好各项配置后,点击右上角保存按钮。

        制作系统

        制作系统模块可查看构建任务及日志,可参考制作系统

        镜像构建及下载
        1. 完成定制业务包及配置系统参数后,可点击右下角镜像构建按钮触发构建任务,并在制作系统模块查看任务状态及构建日志。
        2. 构建完成后可在流水线列表中查找该流水线,点击操作列下载安装。跳转至iso镜像下载页面,点击需下载的iso镜像到本地。
        镜像删除及克隆
        1. 点击流水线名称进入流水线详情页面,点击右下角删除按钮,可删除该流水线。
        2. 点击流水线名称进入流水线详情页面,点击右下角克隆按钮,可克隆该流水线类型,场景,镜像格式,架构及流水线配置,生成新的流水线。
        3. 删除及克隆可参考镜像删除克隆

        概念/术语

        构建工程相关术语含义
        project一组包的集合,其中包含build_target配置,软件包的git_url配置。
        public project由admin用户创建的一组包的集合。
        private project由普通用户创建的一组包的集合。
        inherit project继承工程,可继承父工程的配置。
        build_target指定构建目标,包含目标的os系统及版本,cpu架构。
        package软件包,使用spec_name来标识,一个package会生成一个或多个rpm。
        snapshotproject的快照,将记录当前时刻下,各个软件包的commit_id,以及依赖project的snapshot,保障构建一个包所需要的依赖固定,snapshot_id全局唯一。
        build对project的构建任务,基于snapshot来创建,每个build_target会生成一个build,build_id全局唯一。
        full build全量构建,触发构建任务包含工程列表中所有的包
        incremental build增量构建,触发构建任务包含工程中新增软件包,上一次全量构建失败的软件包,软件包有更新
        job每一次build任务会生成一个或多个job,每个job对应一个软件包的构建。
        build_single单包构建,可触发单包构建。
        build_type构建类型,可指定为full/incremental。
        os variant构建任务执行所在的容器镜像版本信息。
        ground project地基工程,可作为本次构建环境的yum使用。
        build flag控制是否在该环境下构建包。
        publish flag控制构建完成后是否发布该环境下构建出的包,目前仅支持全量构建,增量构建包发布,单包构建出的软件包不发布。
        镜像定制相关术语含义
        pipeline group流水线分组,一组流水线的集合。
        pipeline name流水线名称,可自定义。
        pipeline type流水线类型,包括版本镜像,镜像定制两种类型。
        image format镜像格式,目前支持iso,iso_normal,qcow2,docker,stratovirt,cpio,raspi,mini_docker,mini_cpio。
        scenario流水线场景,包含服务器场景,边缘计算场景,云计算场景,嵌入式场景。
        build system制作系统,用于查看镜像构建任务状态及日志。
        config system配置系统参数,可在该模块下配置系统参数,包括需要开启关闭的服务,是否采用UTC时间,配置时区,裁剪rpm包及用户添加的rpm包,主机名,系统启动阶段需加载的驱动,定制gconv,是否裁剪man文档,配置root初始密码,grub初始密码。
        custom packages定制业务包,可在该模块下配置产品名称,内核参数,repo源地址,添加包,驱动,命令,库文件,删除其他文件,配置分区,网络,添加自定义文件及hook脚本。
        parameter config版本参数配置,可在该模块下配置repo源地址,选择镜像类型,配置产品名称,版本号,release号。

        文档捉虫

        “有虫”文档片段

        问题描述

        提交类型 issue

        有点复杂...

        找人问问吧。

        PR

        小问题,全程线上修改...

        一键搞定!

        问题类型
        规范和低错类

        ● 错别字或拼写错误;标点符号使用错误;

        ● 链接错误、空单元格、格式错误;

        ● 英文中包含中文字符;

        ● 界面和描述不一致,但不影响操作;

        ● 表述不通顺,但不影响理解;

        ● 版本号不匹配:如软件包名称、界面版本号;

        易用性

        ● 关键步骤错误或缺失,无法指导用户完成任务;

        ● 缺少必要的前提条件、注意事项等;

        ● 图形、表格、文字等晦涩难懂;

        ● 逻辑不清晰,该分类、分项、分步骤的没有给出;

        正确性

        ● 技术原理、功能、规格等描述和软件不一致,存在错误;

        ● 原理图、架构图等存在错误;

        ● 命令、命令参数等错误;

        ● 代码片段错误;

        ● 命令无法完成对应功能;

        ● 界面错误,无法指导操作;

        风险提示

        ● 对重要数据或系统存在风险的操作,缺少安全提示;

        内容合规

        ● 违反法律法规,涉及政治、领土主权等敏感词;

        ● 内容侵权;

        您对文档的总体满意度

        非常不满意
        非常满意
        提交
        根据您的反馈,会自动生成issue模板。您只需点击按钮,创建issue即可。
        文档捉虫
        编组 3备份