为什么选择 GitHub 作为 YUM 仓库?

  • 免费托管:GitHub 提供免费的文件存储和 HTTP 服务。
  • CDN:结合 jsDelivr 等 CDN 服务,可以加速用户的访问速度。
  • 无成本:无需自己搭建服务器,降低维护成本。
  • 使用便利:可以一条命令完成安装,无需再上传安装包了,也可以用来制作下线版本的 yum 仓库。

基本思路

YUM 仓库的核心是文件索引(repodata)和 HTTP 服务。GitHub 提供静态文件托管和 HTTP 访问支持,可以作为 YUM 仓库的存储平台。此外,可以通过 CDN 服务(如 jsDelivr)加速访问(可选)。

  • 存储:将 RPM 包和仓库索引文件存储在 GitHub 仓库中。
  • 访问:通过 GitHub 的 raw 文件访问路径或 jsDelivr 提供 HTTP 服务。
  • 生成索引:使用 createrepo 工具生成 YUM 仓库的元数据(repodata)。

步骤 1:生成 repodata

安装 createrepo 工具

确保已安装 createrepo 工具,用于生成 YUM 仓库的元数据。

bash
1
sudo yum install createrepo -y

创建目录结构

为不同发行版(这里为 CentOS 7 和 Rocky 9)创建对应的目录结构:

text
1
2
3
4
5
6
├── 7
│   ├── repodata
│   └── rpm
├── 9
│   ├── repodata
└── └── rpm

执行以下命令创建目录:

bash
1
mkdir -p repo/{7,9}/rpm

准备 RPM 包

将需要托管的 RPM 包放入对应的 rpm 目录。例如,将 pfcli-1.0-1.el9.noarch.rpm 放入 repo/9/rpm/。

生成 repodata

使用 createrepo 命令生成 YUM 仓库索引。以下是命令语法:

text
1
2
3
createrepo [OPTION...] <directory_to_index>
-o, --outputdir=URL        Optional output directory for repodata.
-u, --baseurl=URL         Optional base URL location for RPM files.

示例命令(以 Rocky 9 为例):

bash
1
2
3
createrepo 9/rpm/ \
-o ./9/ \
--baseurl=https://github.com/{your_github_username}/ops-tools/raw/main/9/rpm
tips
  • –baseurl 指定 RPM 包的下载路径,必须与 GitHub 仓库的实际路径一致。
  • 如果 –baseurl 配置错误,可能导致 YUM 客户端下载失败
bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
=================================================================================================================================================================
 Package                             Architecture                         Version                                    Repository                             Size
=================================================================================================================================================================
Installing:
 pfcli                               noarch                               1.0-1.el9                                  centos9                               9.7 k

Transaction Summary
=================================================================================================================================================================
Install  1 Package

Total download size: 9.7 k
Installed size: 7.4 k
Is this ok [y/N]: y
Downloading Packages:
[MIRROR] pfcli-1.0-1.el9.noarch.rpm: Status code: 404 for https://github.com/{username}/ops-tools/raw/main/9/pfcli-1.0-1.el9.noarch.rpm (IP: 20.205.243.166) 

这里的是在生产索引时候指定,如果你执行的目录不对的话,例如在 repo/7 目录下执行 createrepo

bash
1
createrepo -o ./9/ 9/rpm/

这个命令将出现上面的错误,地址缺失 rpm

上传到 GitHub

最后将整个 repo 目录上传到 GitHub 仓库。上传后,GitHub 会为每个文件生成可通过 HTTP 访问的 URL。

步骤 2:使用 jsDelivr 加速(可选)

jsDelivr 是一个免费的 CDN 服务,可以加速 GitHub 仓库的访问速度,尤其适合全球用户。

配置 jsDelivr

将 GitHub 的 URL 替换为 jsDelivr 的格式:

  • GitHub URL: “https://github.com/{username}/{repo}/raw/main/{path}”
  • jsDelivr URL: “https://cdn.jsdelivr.net/gh/{username}/{repo}@{branch}/{path}”

例如,Rocky 9 的 RPM 路径为:

text
1
https://cdn.jsdelivr.net/gh/{username}/ops-tools@main/9/rpm/

在 YUM 客户端配置中使用此 URL,可显著提升下载速度。

  • 全球 CDN 节点(中国大陆不可用)。
  • 更高的带宽和可靠性,适合生产环境。

步骤 3:配置 YUM 客户端

在客户端配置 YUM 仓库,指向 GitHub 或 jsDelivr 的 URL。

创建 .repo 文件

在客户端的 /etc/yum.repos.d/ 目录下创建配置文件。例如,创建 ops-extra-repo.repo

text
1
2
3
4
5
6
7
tee /etc/yum.repos.d/centos7-ops-extra-repo.repo << EOF
[centos7]
name=Extra ops tools
baseurl=https://github.com/{your_github_username}/ops-tools/raw/main/7/rpm/
enabled=1
gpgcheck=0
EOF

如果使用 jsDelivr:

text
1
2
3
4
5
6
7
tee /etc/yum.repos.d/centos7-ops-extra-repo.repo << EOF
[centos7]
name=Extra ops tools
baseurl=https://cdn.jsdelivr.net/gh/{your_github_username}/ops-tools@main/7/rpm/
enabled=1
gpgcheck=0
EOF

为支持多版本系统,可以使用 YUM/DNF 的 $releasever 变量动态选择仓库路径:

text
1
2
3
4
5
6
7
sudo tee /etc/yum.repos.d/ops-tools.repo << EOF
[ops-tools]
name=OPS Tools Repository
baseurl=https://github.com/your-username/ops-tools/raw/main/$releasever/rpm/
enabled=1
gpgcheck=0
EOF

$releasever 会根据系统版本自动替换为 7 或 9,与官方镜像(如 阿里云镜像的http://mirrors.aliyun.com/centos/$releasever/extras/x86_64/)的行为一致。

安装尝试

text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Last metadata expiration check: 0:26:45 ago on Mon 30 Jun 2025 04:37:11 PM CST.
Dependencies resolved.
=============================================================================================
 Package          Architecture    Version            Repository           Size
=============================================================================================
Installing:
 pfcli            noarch          1.0-1.el9          ops-tools           9.6 k

Transaction Summary
=============================================================================================
Install  1 Package

Total download size: 9.6 k
Installed size: 7.4 k
Is this ok [y/N]: y
Downloading Packages:
pfcli-1.0-1.el9.noarch.rpm                       9.7 kB/s | 9.6 kB     00:00    
---------------------------------------------------------------------------------------------
Total                                            9.7 kB/s | 9.6 kB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                     1/1 
  Installing       : pfcli-1.0-1.el9.noarch                              1/1 
  Running scriptlet: pfcli-1.0-1.el9.noarch                              1/1 
  Verifying        : pfcli-1.0-1.el9.noarch                              1/1 

Installed:
  pfcli-1.0-1.el9.noarch                                                     

Complete!

步骤 4:进一步优化 - 打包仓库配置为 RPM

为了简化客户端配置,可以将 .repo 文件打包为 RPM 包,类似 EPEL 仓库的安装方式。

创建 RPM 构建目录

text
1
mkdir -p rpmbuild/{RPMS,SOURCES,SPECS,SRPMS}

创建 .repo 文件

将仓库配置文件放入 SOURCES 目录:

bash
1
2
3
4
5
6
7
tee rpmbuild/SOURCES/ops-extra-repo.repo << EOF
[ops-tools]
name=OPS tools Repository
baseurl=https://github.com/your-username/my-yum-repo/raw/main/$releasever/rpm/
enabled=1
gpgcheck=0
EOF

使用 jsDelivr 加速(可选)

为提高访问速度,可以使用 jsDelivr 作为 CDN。jsDelivr 提供对 GitHub 仓库文件的加速访问。

将 baseurl 修改为 jsDelivr 的路径

text
1
2
3
4
5
6
7
tee rpmbuild/SOURCES/ops-extra-repo.repo << EOF
[ops-tools]
name=OPS tools Repository
baseurl=https://cdn.jsdelivr.net/gh/{your_github_username}/ops-tools@main/$releasever/rpm/
enabled=1
gpgcheck=0
EOF

编写 .spec 文件

创建 rpmbuild/SPECS/ops-tools-repo.spec 文件,定义 RPM 包的元数据:

text
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
tee rpmbuild/SPEC/ops-tools-repo.spec
Name:           ops-tools-repo
Version:        1.0
Release:        1%{?dist}
Summary:        YUM repository configuration for OPS tools

License:        GPL
URL:            https://github.com/hardng/ops-tools
Group:          System Environment/Base
Packager:       CylonChau <cylonchau@outlook.com>
Source0:        ops-extra-repo.repo

%description
This package provides the YUM repository configuration file for OPS tools, which points to a custom GitHub-hosted repository.

%install
%{__install} -p -D %{SOURCE0} %{buildroot}/etc/yum.repos.d/ops-extra-repo.repo

%files
%attr(0744,root,root) /etc/yum.repos.d/ops-extra-repo.repo

%clean
rm -rf %{buildroot}

%changelog
* Thu Jun 30 2025 CylonChau <cylonchau@outlook.com> - 1.0-1
- Initial package for github-hosted YUM repo configuration
EOF

构建 RPM 包

安装必要的 RPM 构建工具:

text
1
rpmbuild -ba rpmbuild/SPECS/ops-tools-repo.spec

生成的文件位于 rpmbuild/RPMS/noarch/ 目录,例如 ops-tools-repo-1.0-1.el9.noarch.rpm。

放置到 github 仓库中后,可以直接使用 yum install 进行安装

text
1
sudo rpm -ivh https://github.com/your-username/ops-tools/raw/main/9/rpm/ops-tools-repo-1.0-1.el9.noarch.rpm

总结

通过以上步骤,你可以使用 GitHub 快速搭建一个 YUM 仓库,支持 CentOS 7, Rocky 9 等系统。进一步优化可以通过打包 .repo 文件为 RPM 包,或使用 jsDelivr 加速访问。这种方法很适合个人项目并易于维护。