EPEL 10 launched about a year and half ago. By all accounts it has been a tremendous success. After an initial soft launch period, it officially launched with over 10k packages available. It has since grown to over 25k packages. Notably, EPEL 10 introduced minor versions, which is the biggest changes in EPEL’s history. Many maintainers have expressed their appreciation for how this has improved their workflow.
As can be expected with a change of this magnitude, there have been a few minor rough spots with the transition. Our original plan was to have CentOS systems request the major version repo, and have RHEL systems request the major.minor version corresponding to the OS. We eventually realized that this would cause upgrade problems going from one minor version to the next, and had to make a small pivot to the implementation.
We settled on a solution using a combination of MirrorManager redirects and mirror symlinks. The DNF variable $releasever_minor is defined on RHEL, but not defined on CentOS. Using DNF’s parameter expansion, we insert additional characters if that variable is defined. That works out as follows for the current minor versions:
| metalink repo name | redirected to | used by |
|---|---|---|
epel-z-10 |
epel-z-10.2 |
RHEL |
epel-10 |
epel-z-10.3 |
CentOS |
| example baseurl path | symlinked to | used by |
|---|---|---|
pub/epel/10z |
pub/epel/10.2 |
RHEL |
pub/epel/10 |
pub/epel/10.3 |
CentOS |
This works well enough and has been in production for over a year now. Users generally don’t need to understand these implementation details, and can just install epel-release as they always have.
However, some users consume EPEL by syncing the content to a private mirror rather than using epel-release. We’re starting to see reports of these users making the mistake of mirroring pub/epel/10 (instead of pub/epel/10z) for use on RHEL. Often times this will work initially, then later result in package dependency issues.
That sets the background for two ideas I want to put forward.
Can we do this better in EPEL 11?
I think the EPEL 10 minor version design has overall proven itself and should remain the foundation for EPEL 11. I also think we can iterate and improve on the redirect and symlink portion of the implementation.
I mentioned before that we keyed off the $releasever_minor variable in EPEL 10. Hypothetically we can instead key off the $stream variable for EPEL 11, which is set on CentOS but not on RHEL. That would invert which distro uses extra characters in its redirects and symlinks, as well as simplifying the repo names in MirrorManager.
| metalink repo name | redirected to | used by |
|---|---|---|
epel-11 |
epel-11.0 |
RHEL |
epel-11s |
epel-11.1 |
CentOS |
| example baseurl path | symlinked to | used by |
|---|---|---|
pub/epel/11 |
pub/epel/11.0 |
RHEL |
pub/epel/11s |
pub/epel/11.1 |
CentOS |
The change in the repo file would look something like this:
-#baseurl=https://download.example/pub/epel/$releasever${releasever_minor:+z}/Everything/$basearch/
+#baseurl=https://download.example/pub/epel/$releasever${stream:+s}/Everything/$basearch/
-metalink=https://mirrors.fedoraproject.org/metalink?repo=epel${releasever_minor:+-z}-$releasever&arch=$basearch
+metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-$releasever${stream:+s}&arch=$basearch
There would be no change for users utilizing epel-release, they would just install it and get the appropriate repos, just like they do today. Users creating private mirrors can use the previously pattern of pub/epel/$major to get the appropriate content for RHEL. We would be shifting the “I mirrored the wrong path and got the wrong content” problem to CentOS users, but I’m not terribly worried about that for two reasons:
- I think it is significantly less likely for CentOS users than RHEL users to be using a private EPEL mirror.
- Package dependency issues are less likely when using an older EPEL minor version than you should on CentOS, compared to using a newer EPEL minor version than you should on RHEL.
If we change this for EPEL 11, should we change EPEL 10 to match?
I’m a sucker for consistency, so naturally I’ve been asking myself if we can transition EPEL 10 to work the same way. Asking people who create private EPEL mirrors to change their behavior for EPEL 10, and then change it again for EPEL 11, is not ideal. Granted some are already doing that, but the vast majority of CentOS/RHEL users are not using 10 yet. These users will likely never become aware of these infrastructure implementation details if we make this change in EPEL 10 before they start using it.
I do think there is a realistic migration path we can use here. Normally we are moving the redirects and symlinks forward as we transition through EPEL minor versions. For example, next month we will be creating EPEL 10.4, and under the current process will be changing epel-10 and pub/epel/10 to point to 10.4. But what if we left those references at 10.3, and created new ones with the 10s pattern pointing to 10.4?
Here’s how that would look at the creation of EPEL 10.4 (while RHEL is still on 10.2):
| metalink repo name | redirected to | used by |
|---|---|---|
epel-z-10 |
epel-z-10.2 |
RHEL |
epel-10 |
epel-z-10.3 |
CentOS with old epel-release |
epel-10s |
epel-z-10.4 |
CentOS with new epel-release |
| example baseurl path | symlinked to | used by |
|---|---|---|
pub/epel/10z |
pub/epel/10.2 |
RHEL |
pub/epel/10 |
pub/epel/10.3 |
CentOS with old epel-release |
pub/epel/10s |
pub/epel/10.4 |
CentOS with new epel-release |
Once RHEL 10.3 is released in the fall, it would look like this:
| metalink repo name | redirected to | used by |
|---|---|---|
epel-z-10 |
epel-z-10.3 |
RHEL with old epel-release |
epel-10 |
epel-z-10.3 |
RHEL with new epel-release, CentOS with old epel-release |
epel-10s |
epel-z-10.4 |
CentOS with new epel-release |
| example baseurl path | symlinked to | used by |
|---|---|---|
pub/epel/10z |
pub/epel/10.3 |
RHEL with old epel-release |
pub/epel/10 |
pub/epel/10.3 |
RHEL with new epel-release, CentOS with old epel-release |
pub/epel/10s |
pub/epel/10.4 |
CentOS with new epel-release |
epel-release would be updated with these new patterns, but only published in the EPEL 10.3 repo. CentOS users would switch to the new pattern once they update epel-release. Once RHEL 10.3 is released, epel-z-10 and pub/epel/10z would move forward to 10.3 resources as expected. RHEL users would switch to the new pattern as they upgrade, using epel-10 and pub/epel/10 going forward. We can keep moving the epel-z-10 and pub/epel/10z references forward as well for compatibility.
Interestingly, this also aligns better with the changes that will happen when RHEL 10 reaches maintenance phase. After that there will be no more minor versions of RHEL 10, and epel-10 and pub/epel/10 will point to the 10.10 repos. This move would be aligning the no-suffix references with the current RHEL minor version early, made possible by CentOS switching to the suffixed references of epel-10s and pub/epel/10s.
Summary
Please share your feedback on these ideas. In particular, I’m interested in any drawbacks I’ve overlooked, how this would impact any third-party tooling, and other impacts on consumers of EPEL.
I also want to emphasize that this isn’t an all-or-nothing proposal. While I think both are good ideas, it’s also reasonable to conclude that the change only makes sense for EPEL 11 going forward, and EPEL 10 should be left as-is. When I bring this to the EPEL Steering Committee I’ll explicitly ask for separate votes.