Bootstrap i686
默认情况下,Koji 不会将软件包构建为多架构,它期望一个 i686 存储库/构建根,因为这是 **mock** 所期望的。看起来它需要一个 32 位引导程序来启动。但是,Enterprise Linux 8 **没有** 32 位存储库。为了解决这个问题,必须使用至少 Fedora 28(以及在某些情况下使用 Fedora 29)来引导软件包。
设置¶
安装 Mock 和配置¶
安装 mock...
% yum install epel-release
% yum install mock createrepo_c httpd -y
% useradd rpmbuild
% usermod -aG mock rpmbuild
添加正确的 mock 配置...
% cat >> /etc/mock/rocky-8-i686.cfg << "EOF"
# A lot of these values do not matter as they will be overridden later
# with koji's mock settings
config_opts['root'] = 'rocky-8-i686'
config_opts['target_arch'] = 'i686'
config_opts['legal_host_arches'] = ('i386', 'i486', 'i586', 'i686', 'x86_64',)
config_opts['chroot_setup_cmd'] = 'install bash bzip2 coreutils cpio diffutils system-release findutils gawk gcc gcc-c++ grep gzip info make patch redhat-rpm-config rpm-build sed shadow-utils tar unzip util-linux which xz'
config_opts['dist'] = 'el8' # only useful for --resultdir variable subst
config_opts['macros']['%dist'] = ".el8"
config_opts['%centos_ver'] = "8"
config_opts['macros']['%centos_ver'] = "8"
config_opts['macros']['%rhel'] = "8"
config_opts['macros']['%el8'] = "1"
config_opts['macros']['%redhat'] = "8"
config_opts['macros']['%_vendor'] = "redhat"
config_opts['macros']['%_vendor_host'] = "redhat"
config_opts['macros']['%_host'] = "i686-redhat-linux-gnu"
config_opts['macros']['%vendor'] = "Rocky Linux"
config_opts['macros']['%packager'] = "Louis Abel <label@rockylinux.org>"
#config_opts['package_manager'] = 'yum'
# no ccache in base repo
#config_opts['plugin_conf']['ccache_enable'] = False
#config_opts['plugin_conf']['yum_cache_enable'] = False
config_opts['yum.conf'] = """
[main]
cachedir=/var/cache/yum
keepcache=1
debuglevel=2
reposdir=/dev/null
logfile=/var/log/yum.log
retries=20
obsoletes=1
gpgcheck=0
assumeyes=1
syslog_ident=mock
syslog_device=
exclude=*.x86_64
# We are using Fedora 28 or 29 as our bases. 28 is what we use mainly. There are
# a few cases where I needed 29 instead, but they were far and few between.
# In majority of builds now with the current bootstrap, Fedora is rarely used.
# Even though this is the case, we still need to exclude specific packages as
# they have epochs or dnf decides to use Fedora instead for whatever reason.
[base_29]
name=fedora 29 base
baseurl=https://archives.fedoraproject.org/pub/archive/fedora-secondary/releases/29/Everything/i386/os/
enabled=0
gpgcheck=0
cost=2000
exclude=gcc*,fedora-release*,gdbm-devel,gdbm,gdbm-libs,python3-libs,unbound*,gnutls*,python*,generic-release,fedora-repos,fedora-gpg-keys,perl*
[updates_29]
name=fedora 29 updates
baseurl=https://archives.fedoraproject.org/pub/archive/fedora-secondary/updates/29/Everything/i386/
enabled=0
gpgcheck=0
cost=2000
exclude=gcc*,fedora-release*,gdbm-devel,gdbm,gdbm-libs,python3-libs,unbound*,gnutls*,python*,generic-release,fedora-repos,fedora-gpg-keys,perl*
[base_28]
name=fedora 28 base
baseurl=https://archives.fedoraproject.org/pub/archive/fedora-secondary/releases/28/Everything/i386/os/
enabled=1
gpgcheck=0
cost=2000
priority=99
exclude=gcc*,fedora-release*,gdbm-devel,gdbm,gdbm-libs,python3-libs,unbound*,gnutls*,python*,generic-release,fedora-repos,fedora-gpg-keys,perl*
[updates_28]
name=fedora 28 updates
baseurl=https://archives.fedoraproject.org/pub/archive/fedora-secondary/updates/28/Everything/i386/
enabled=1
gpgcheck=0
cost=2000
priority=99
exclude=gcc*,fedora-release*,gdbm-devel,gdbm,gdbm-libs,python3-libs,unbound*,gnutls*,python*,generic-release,fedora-repos,fedora-gpg-keys,perl*
# These aren't ever used, but it doesn't hurt to have them here disabled.
[modular]
name=fedora 28 modular
baseurl=https://archives.fedoraproject.org/pub/archive/fedora-secondary/releases/28/Modular/i386/os/
enabled=0
gpgcheck=0
cost=2500
[modular_updates]
name=fedora 28 modular updates
baseurl=https://archives.fedoraproject.org/pub/archive/fedora-secondary/updates/28/Modular/i386/
enabled=0
gpgcheck=0
cost=2500
# Sometimes I enable this, but usually I just copy what's there into /reqs and
# createrepo.
[i686]
name=i686 only
baseurl=file:///var/www/html/src/i686
enabled=0
gpgcheck=0
cost=1000
# Everything we're building into a single repo. This has higher priority.
[recursive]
name=recursive
baseurl=file:///var/www/html/src/reqs
enabled=1
gpgcheck=0
cost=1000
priority=1
module_hotfixes=0
"""
设置递归存储库¶
因此,我们可以创建一个空存储库,以便 mock/dnf 可以正常使用它。但是,这并不能解决所有问题。我们首先需要几个 RPM。我们可以拉取 centos 目前拥有的 noarch 软件包来开始。
% mkdir -p /var/www/html/src/{reqs,logs,mirror,hidden}
# Pull required RPM's
% wget http://mirror.centos.org/centos/8.3.2011/AppStream/x86_64/os/Packages/redhat-rpm-config-123-1.el8.noarch.rpm
# Generate repo data
% createrepo /var/www/html/src/reqs
拉取所需的隐藏依赖项¶
我们仍然需要一些隐藏的依赖项。并且其中许多可以在上述设置完成后毫无问题地构建。下面列出了一个列表,可以在我们的 临时 copr 上找到。您应该下载源 RPM 并构建它们。
您不会在 copr 中找到 rocky-logos 或 rocky-release。但是您可以在我们的 koji 中找到它们。强烈建议从 koji 下载并构建它们。
-rw-r--r-- 1 root root 569161 Apr 7 04:09 atf-0.20-11.el8.src.rpm
-rw-r--r-- 1 root root 2198827 Apr 7 04:01 fonttools-3.28.0-2.el8.src.rpm
-rw-r--r-- 1 root root 670398 Apr 7 04:34 kyua-0.13-1.el8.src.rpm
-rw-r--r-- 1 root root 149325484 Mar 15 22:41 libabigail-1.4-2.el8.src.rpm
-rw-r--r-- 1 root root 500728 Apr 7 04:19 lutok-0.4-10.el8.src.rpm
-rw-r--r-- 1 root root 1107360 Aug 7 2020 nspr-4.25.0-2.el8_2.src.rpm
-rw-r--r-- 1 root root 143424626 Apr 8 06:56 nss-3.53.1-17.el8.src.rpm
-rw-r--r-- 1 root root 100839 Mar 14 22:38 pam_wrapper-1.0.7-1.el8.src.rpm
-rw-r--r-- 1 root root 149272 Dec 21 03:56 polkit-gnome-0.106-0.2.20170423gita0763a2.el8.src.rpm
-rw-r--r-- 1 root root 1507527 Mar 15 17:38 rocky-logos-83.0-1.el8.src.rpm
-rw-r--r-- 1 root root 23678 Apr 9 04:04 rocky-release-8.3-5.el8.src.rpm
-rw-r--r-- 1 root root 3527211 Apr 7 03:52 ttfautohint-1.8.1-3.el8.src.rpm
可选:从存储库中拉取所有源代码¶
您可能需要从存储库中拉取所有源代码。我使用 httrack 来完成此操作。请注意,此链接可能会失效,您可能需要自己构建它。
另一件事是,在下载完源代码后,我删除了所有旧内容并将所有模块软件包移到了其他位置。
% cd /var/www/html/src/mirror
# -sN 0 helps ignore robots
% httrack https://vault.centos.org/8.3.2011/BaseOS/Source/SPackages/ -sN 0
% httrack https://vault.centos.org/8.3.2011/AppStream/Source/SPackages/ -sN 0
% httrack https://vault.centos.org/8.3.2011/HighAvailability/Source/SPackages/ -sN 0
% httrack https://vault.centos.org/8.3.2011/PowerTools/Source/SPackages/ -sN 0
# Now we need to move some things
% mv vault.centos.org/8.3.2011/BaseOS/Source/SPackages/ BaseOS
% mv vault.centos.org/8.3.2011/AppStream/Source/SPackages/ AppStream
% mv vault.centos.org/8.3.2011/HighAvailability/Source/SPackages/ HighAvailability
% mv vault.centos.org/8.3.2011/PowerTools/Source/SPackages/ PowerTools
% rm -rf vault.centos.org index.html
# I don't want to build modules. I'm doing that in koji, so instead, I'm moving them away.
% mkdir modules
% find . -type f -regextype sed -regex '.*module.*\.rpm' -exec mv {} modules/ \;
# Now I need to remove all the old stuff
# You can use repomanage on directories that are not actual repos and it will operate properly.
% for x in AppStream BaseOS HighAvailability PowerTools ; do rm $(repomanage --keep=1 ${x}) ; done
实际构建¶
我有一个有点 hacky 的脚本可以帮我处理这个问题。您可以一次为它提供一个。
# ~/bin/build-a-rpm
#!/bin/bash
PACKAGE=$1
LOGDIR=/var/www/html/src/logs/${NAME//.src.rpm/}
MOCKDIR=/var/lib/mock/rocky-8-i686
mock -r rocky-8-i386 $1
if [ $? -eq 0 ]; then
rm ${MOCKDIR}/result/*.src.rpm
cp ${MOCKDIR}/result/*.rpm /var/www/html/src/reqs
createrepo /var/www/html/src/reqs
echo $1 >> /tmp/DONE
else
mkdir ${LOGDIR}
cp ${MOCKDIR}/result/*.log ${LOGDIR}
echo $1 >> /tmp/FAIL
fi
% build-a-rpm /var/www/html/src/mirror/BaseOS/tar-1.30-5.el8.src.rpm