From Fedora Project Wiki

Revision as of 20:07, 17 February 2023 by Bcotton (talk | contribs) (Add trackers)

Mass Retire Golang Leaves

Summary

As of Jan 2023, 275/1660 (17%) library only Go source packages are leaves. Overall, these packages are maintained by 35 different maintainers along with the Go SIG. These leaves (by maintainer) will be mass retired in Fedora 39.

Owner

Current status

Definitions

  • library only source package -- a component/source package that only contains noarch golang *-devel subpackages.
  • binary subpackage -- an arched subpackage that contains go binaries.
  • source package with binaries - a component/source package that contains at least one binary subpackage; may also contain library subpackages.
  • leaf -- a library only source package whose subpackages don't have any dependents

Detailed Description

The Go SIG maintains over 2000 source packages. 275 of these packages are leaves. Overall, these packages are assigned to 35 different maintainers. We'd like to clean up these unneeded packages to allow us to better direct our time and unclutter the distribution. Handling this large number of leaves one by one and maintainer by maintainer proved ineffective, so we're taking a more heavy handed approach and mass retiring these leaf packages prior to the release of Fedora 39.

Source packages with binaries will be excluded even if the binary subpackage(s) and/or the -devel subpackage(s) are leaves.

See the next section for more information on how we plan to implement this. In short:

Implementation

Finding the leaves:

(go_leaves.py)

  1. Find the source packages that BuildRequire go-rpm-macros or any golang.src subpackage
  2. Iterate over the source packages list and find the subpackages for each one
  3. If all of a source package's subpackages are noarch and contain "-devel", it is considered a leaf.
  4. Remove packages from the leaves list if they've opted out.
  5. Store the output in https://pagure.io/GoSIG/go-leaves/blob/main/f/leaves. Update it periodically.

Confirmation:

  1. Create a blank blocker package that Conflicts with the to be removed packages.
  2. Create a new Copr with the blocker package in its default buildroot. This will simulate the actual removal of these packages.
  3. Rebuild all of the non leaf packages.
  4. Investigate new failures and rebuild in a control Copr.

Opt outs:

  1. A list of opt outs will be kept in https://pagure.io/GoSIG/go-leaves. Go SIG members will have commit.
  2. As explained in the aforementioned repo's README, packagers can simply push an opt-out/{component} text file with a short justification to opt out.


Mass Retirement:

  1. Shallow clone the leaves' distgit repositories and run fedpkg retire on each.
  2. Double check that the packages are properly blocked/retired in Koji and PDC.


Feedback

This was briefly discussed in a Go SIG meeting (minutes). Feedback was generally positive.

Benefit to Fedora

This change will allow the Go SIG to focus its limited people power on maintaining packages that are actually needed. Fedora won't waste resources uselessly rebuilding these packages. Hopefully, the other packages will be better maintained.


Scope

  • Proposal owners:
    • ✅ Write a script to determine leaves. (go_leaves.py)
    • ✅ Store an updated list of leaves in https://pagure.io/GoSIG/go-leaves
    • Directly contact affected maintainers and devel-announce. Ensure opt outs are properly accounted for.
    • Simulate the removal of these packages and rebuild the Golang stack in Copr. Investigate any new failures.
    • Mass retire packages after waiting a few weeks for maintainers to opt out. Aim to have this completed before the mass rebuild.
  • Release engineering: #11253
    • After we preform the mass retirement, releng will allow any Go SIG member to unretire a leaf within eight weeks even if they're not the main admin.
    • The change owners will mass retire the packages themselves using go-sig/provenpackager membership.
    • Ensure that the packages are properly blocked/retired in Koji and PDC.

Upgrade/compatibility impact

There should be none. These library packages are not meant for end users. We will not Obsolete these packages, so they won't be removed from existing systems.


Contingency Plan

The change can be deferred if the prep work isn't completed in time.

The change owners are taking multiple measures to avoid retiring packages that are not actually leaves (i.e. false positives). In the event of unforeseen issues, some or all of the packages can be unretired and rebuilt. Retagging builds from F38 is also possible, as Golang library packages only contain source code and are architecture independent.


Documentation

The current draft of the package leaves script is available.


Release Notes

Remove unused Golang libraries from the repositories. These packages are not meant for end user consumption to begin with. We will not Obsolete these packages, so they won't be removed from existing systems.