koji使用外部仓库

2023-10-11 17:59
文章标签 使用 仓库 外部 koji

本文主要是介绍koji使用外部仓库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

序言

使用koji来编译rpm包时,因为rpm包会依赖很多的其他的rpm包,而这时我们自己的build tag对应的rpm包又不足够时,我们就会使用外部仓库来提供依赖包,那么koji如何选择依赖包来自于build tag对应仓库还是来自于外部仓库呢?同时又会有什么样的条件呢?这就和我们引进外部仓库时使用的合并模式(merge mode)及优先级等等一些选项相关了。

引进外部仓库

使用指令就可以新建外部仓库

$ koji add-external-repo -t dist-foo-build dist-foo-external-repo http://repo-server.example.com/path/to/repo/for/foo/\$arch/

我们看下add-external-repo的help:

$ koji add-external-repo --help
Usage: koji add-external-repo [options] <name> [<url>]
(Specify the --help global option for a list of other help options)Options:-h, --help            show this help message and exit-t TAG, --tag=TAG     Also add repo to tag. Use tag::N to set priority-p PRIORITY, --priority=PRIORITYSet priority (when adding to tag)-m MODE, --mode=MODE  Set merge mode-a ARCH1,ARCH2, ..., --arches=ARCH1,ARCH2, ...Use only subset of arches from given repo

koji add-external-repo [options] [],options指定一些选项,name就是你给这个外部仓库的命名,url即为仓库的网址

看下option:

  • -t则指定为哪一个build tag引进的这个外部仓库
  • -a即为体系结构
  • -p是优先级,比如说你增加了几个外部仓库,如果有一个包在这几个外部仓库都有,如何选择可能就和优先级有关,选择优先级高的那个仓库来获取包。不指定的话,koji按照FIFO的形式指定优先级(值越小优先级越高)
  • -m 合并仓库的模式,koji列出来三个模式koji, bare, simple, 不指定的话默认是koji

合并模式

添加了外部仓库,koji就会将原来的仓库(build tag对应的)和外部仓库进行合并,然后使用时就会从这个新的仓库里边取用rpm包,如何合并就是和我们下边讲到的合并模式有关了。

1. koji

这里koji是指合并模式,即使用-m koji指定,也是最基本的模式。合并到新仓库的包并不是说简单把所有的仓库的包混进来,选择包的条件要对应到srpm,首先会从仓库中的rpm包对应的srpm中选择一个srpm,找到这个srpm(可能不同仓库都有这个srpm<比对全名>)下对应的所有rpm包添加到新仓库,相同的包只添加一次。那么按照什么顺序选择这一个srpm呢,就是按照“原来仓库”到“外部仓库”顺序,外部仓库按照优先级顺序依次。找这个srpm下对应rpm包也是按照以上相同规则顺序来添加,相同的rpm包只会添加一次。这种模式下的包是基本上不会出现同名的包,除非说某一个仓库下srpm编译出来的多个相同名字的rpm包。

这里及后边所说的“原来的仓库”其实是指改tag下对应rpm包,也即被打进这个tag的所有的rpm包形成的仓库

内部使用的是mergerepos_c --koji命令

2. bare

使用此合并模式,就会将所有的包合并到一处,但是当如果相同包名,需要他的EVRA(epoch-version-release-arch)(其实主要是relase或者version)不一样才可以合并。这样的话仓库就会出现很多有着相同名字,但是版本(version)或者发行(release)不同的包。这很适合用在centos8引入的module的概念。即: 使用一个仓库,可以切换不同的version/release的软件。

内部使用的是mergerepos_c --pkgorigins --all命令,不过需要安装createrepo_c的0.14版本(支持libmodule)及以上,不然就是如果拥有相同NEVRA(name-epoch-version-release-arch)那就只选择第一个rpm。选择的规则和koji模式还是一样,首先选择原仓库,原仓库没有再按找优先级从外部仓库开始选用。

3.simple

这中模式限制比较少,甚至可以接受相同的NEVRA(name-epoch-version-release-arch)的包

内部使用的是 mergerepos_c --mode simple 指令,simple是createrepo_c 0.13引入的组件,使用它的理由有:a). 想要使用bare,但是版本比较低,用来替代bare模式,b). 你真的就是想要仓库的包有着相同的NEVRA(name-epoch-version-release-arch)的包

总结一下就是正常情况下就是使用koji,如果你希望你的仓库有相同包名但是不同版本(version)或者发行(release)就使用bare,基本不会用到simple,要么用来达到bare的功能,要么就是希望仓库中有的包有相同的NEVRA(name-epoch-version-release-arch)。

实验一下

1. 创建本地仓库

首先我们先创建一个本地的build tag:

$ koji add-tag --arches="x86_64 aarch64" test-merge-mode-build-tag

然后我们往这个tag里增加一个包libuser:

$ koji add-pkg --owner=[你的账号] test-merge-mode-build-tag libuser
$ koji tag-build test-merge-mode-build-tag libuser-0.62-23.el8
$ koji regen-repo test-merge-mode-build-tag

然后我们就生成了仓库,关于yum仓库详细信息,参考这里),我们看下这个仓库的包的情况,下载仓库的primary.xml.gz打开查看:

隐藏了一些信息,libuser-0.62-23.el8的srpm会编译三个包,那我们这里就可以看到libuser,libuser-devel,python3-libuser这三个包。location表示包所在的位置,可以看到是在当前仓库的/toplink/packages/libuser/0.62/23.el8/x86_64/这里找到

如果你编译只需要libuser这一个包的话,就可以用test-merge-mode-build-tag作为build tag来编译了,不过实际情况下肯定不会是只依赖这一个包。

2. 添加外部仓库

我们添加rocky和fedora的镜像下的仓库进来。首先使用koji的合并模式

$ koji add-external-repo -t test-merge-mode-build-tag -p 5 -m koji -a "x86_64 aarch64" test_merge_mode_rocky_base http://mirrors.sjtug.sjtu.edu.cn/rocky/8/BaseOS/\$arch/os/
Created external repo 58
Added external repo test_merge_mode_rocky_base to tag test-merge-mode-build-tag (priority 5)$ koji add-external-repo -t test-merge-mode-build-tag -p 10 -m koji -a "x86_64 aarch64" test_merge_mode_fedora http://mirror.sjtu.edu.cn/fedora/linux/development/36/Everything/\$arch/os/
Created external repo 59
Added external repo test_merge_mode_fedora to tag test-merge-mode-build-tag (priority 10)

我们新加了优先级是5的test_merge_mode_rocky_base和优先级是10的test_merge_mode_fedora的仓库,test_merge_mode_rocky_base优先级高于test_merge_mode_fedora

然后看下这个tag下的信息:

然后我们再重新生成下这个repo:

$ koji regen-repo test-merge-mode-build-tag
2.1 验证koji合并模式

继续下载下来primary.xml.gz文件查看,不过这次文件就非常大了,打开也要很久

这次看到这个repo下就有66612个包了,我们看到第一个rpm的名字0ad,然后位置是在https://mirror.sjtu.edu.cn/fedora/linux/development/36/Everything/x86_64/os/Packages/0/这里。是因为0ad这个包在原来仓库和test_merge_mode_rocky_base仓库没有,所以才会选择来自test_merge_mode_fedora仓库。

这样就完成了合并,那其实关心的是libuser这个包现在是选择哪个仓库的呢:

可以看到libuser(x86_64)这个仓库依然来自于本地仓库。证明说如果每个仓库都有这个文件,优先选择原仓库。但是还有一个libuser(i686)的这就是说test_merge_mode_rocky_base仓库真的编译了同名两个包,首先libuser在原来的仓库选择rpm后,会继续到外部仓库去选择,如果之前没有选择就会加进来。

另外我们加入的test_merge_mode_fedora的仓库下的authselect这个rpm包比test_merge_mode_rocky_base高,但是是选用的test_merge_mode_rocky_base的仓库的包。所以证明适合rpm版本高低没有关系,只是和仓库的优先级有关。

2.2 验证bare合并模式

那我们把模式切换成bare,重新生成下仓库

$ koji edit-external-repo -m bare test_merge_mode_fedora --tag test-merge-mode-build-tag
$ koji edit-external-repo -m bare test_merge_mode_rocky_base --tag test-merge-mode-build-tag
$ koji regen-repo test-merge-mode-build-tag

生成完之后我们继续下载primary.xml.gz文件,这次文件比上次的还大,我们直接来看下libuser这个rpm包:

可以看到有好多libuser包,首先我们新建的tag包含libuser这个rpm包时x86_64中的arch只有x86_64,但是我们引入的外部仓库还有i686这个arch。首先要声明的是我们选择的libuser是和test_merge_mode_rocky_base中一样的,只是缺少i686的包,所以libuser-0.62-23.el8.x86_64.rpm这个包是来自于原来的仓库,没有的i686包(libuser-0.62-23.el8.i686.rpm)就会引入test_merge_mode_rocky_base仓库中的包。但是test_merge_mode_fedora仓库中libuser又是和其他仓库的版本不一样,所以test_merge_mode_fedora中的libuser也会包含进来。总结下就是如果有一个包的相同NEVRA(name-epoch-version-release-arch)同时存在于大于等于两个仓库时,就会遵循首先原始仓库,原始仓库如果没有就按照优先级选用外部仓库的策略。如果一个包存在NEVRA不同,就会统统包含进来。

关于simple用的比较少,大家可以自行去实验一下。

3. yum/dnf安装一下

上边我们从仓库内部已经看到了合并后的仓库,那我们从这个仓库安装又会是什么样呢?我们来实验一下,以bare模式为例(其他的模式类似):

首先我们把合并后的仓库放到/etc/yum.repos.d/中

$ cd /etc/yum.repos.d/
$ cat << EOF > test_koji_repo.repo
> [test-koji-repo]
> name=test-koji-repo
> baseurl=http://xxxxxx[你的koji地址]/kojifiles/repos/test-merge-mode-build-tag/latest/x86_64/
> enabled=1
> gpgcheck=0
> EOF

然后把其他的repo文件备份后删掉,使得这个文件夹下只有这一个repo文件

然后使用dnf安装libuser试试:

$ dnf clean all
$ dnf install libuser --allowerasing

安装当然会不成功,首先我本机有安装libuser,另外我们创建的这个仓库还有有些依赖包缺失,最后本地安装的包还有冲突。我们就简单测试安装一下,使用–allowerasing(allowerasing表示覆盖冲突的包),我们仅仅列出来不做安装,然后看下结果:

Last metadata expiration check: 0:06:05 ago on Fri 11 Mar 2022 02:59:09 PM CST.
Dependencies resolved.
================================================================================Package     Architecture      Version        Repository           Size
================================================================================
Installing:libuser      x86_64          0.63-7.fc35     test-koji-repo       380 k

哈,可以看到拉取的仓库是test-koji-repo,但是安装的版本却是0.63-7.fc35,因为我们仓库里有这个包,且这个包版本还大于我们原本仓库的包。

当然我们也可以指定需要的版本的包:

$ dnf install libuser-0.62-23.el8 --allowerasing
Last metadata expiration check: 0:11:20 ago on Fri 11 Mar 2022 02:59:09 PM CST.
Dependencies resolved.
=================================================================================Package       Architecture       Version         Repository        Size
=================================================================================
Installing:libuser         x86_64          0.62-23.el8     test-koji-repo      413 k

这样也可以证明我们仓库同时拥有两个版本的libuser包。

总结

本篇文章我们讲述了如果添加外部仓库为我们所用,当我们需要用到的包不够用,就需要借助外部仓库来使用。那么就会涉及到选用包是从哪个仓库来选择,当我们添加外部仓库会指定一个合并模式及优先级,根据不同的这些选项我们会产生一个新的仓库。我们着重的讲解了不同的合并模式,koji模式包名不会重复,bare模式下包名可能会重复,只要NEVRA其中一个不一样就可以,simple模式下就是把所有的包简单的混合一下,不做什么处理。另外我们也根据例子详细罗列一下。

这篇关于koji使用外部仓库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/189835

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四