As many new Ubuntu Developers you may wonder what happens when you upload a new package to the Ubuntu Archive?
You may have encountered a flurry of acronyms and jargon that didn’t make things much clearer:
- “Upload”
- “FTBFS”
- “proposed migration”
- “release pocket”
- “Autopkgtest”
- “Britney”
- “excuses”
Ubuntu package upload journey
While this is a simplified view, the diagram below represents the basic flow of how package updates make it to the Ubuntu development release.
-
Packages attempt to be merged from Debian unstable and if they fail to do so, they end up on our merges tracker but if no conflict happens, they will move to the “proposed” pocket.
-
In the next step, packages go in the proposed pocket, which is also where other standard uploads go. There they attempt to be compiled against all supported architectures. In case of failure, they become FTBFS: Failed To Build From Sources
-
If packages successfully build from source, they start running autopkgtest. This is a mechanism to test Debian packages using per-package defined DEP-8 tests. The beauty of autopkgtest is the fact that all the dependencies of a changed package are tested against that changed package as installed rather than part of the build process. For example: a glibc upload would likely trigger thousands of tests.
Why Packages Don’t Migrate
The main point of this post is to discuss packages that are going through the migration process from the proposed pocket to the release pocket (proposed migration). These packages could be “stuck in proposed” for many reasons called Excuses, such as :
- FTBFS: doesn’t build on one or all architectures
- autopkgtest failure: package fails its own DEP-8 tests
- dependency autopkgtest failure: one of the package dependencies is failing against the new package
- depends: the package needs another package to migrate
- and others that I’m still discovering…
Identifying which packages to fix quickly is important to unblock other contributors and make the new packages available to all Ubuntu users as soon as possible.
Today, that list of excuses can be reviewed in different ways:
- All Excuses: All the packages stuck in proposed sorted newer to older (web page)
- Excuses by team: Shows all outstanding packages in proposed by team (web page)
- Excuses Yaml: That large yaml file contains all the details about why packages are not migrating. that file is several Mb and easily includes hundreds thousands of lines
- Update Output.txt: that is truly more advanced but useful to some
While these resources contain all the information you probably need to choose a package to fix, it can sometimes require time to either decipher the reason or follow a long dependency chain leading to the package blocking a cluster of packages.
There has to be a better way…
Visual excuses
I always had a personal interest in data visualization and how it can help display complex problems and in some cases highlight unexpected patterns. So, with this in mind I started to implement a tool to visualize Ubuntu excuses as nodes on a graph and identify dependencies as arrows. The result is called visual-excuses
and can be installed as a snap:
🐧 ▶ snap install visual-excuses
Then running visual-excuses
opens your web browser and shows all the packages currently stuck in proposed:
🐧 ▶ visual-excuses
Beautiful!
Ok… to the naked eye it may not be easier than a wall of text, but you can zoom in and discover interesting phenomena.
Now, this is getting good. You can see a cluster of dependencies with rust packages with a few packages blocking most rust packages: rust-rustls-pemfile blocking about eight packages, for example.
Another nice touch are the details available with tooltips and colors.
Here are a few examples:
The cogl
package is not building on amd64 and pp64el architectures and is subscribed by the Desktop Team (desktop-packages):
graph-tool
is failing its own autopkgtest on arm64 and s390x. Note that you can access the package, buildlog, and details straight from the links in the tooltips:
unicorn
is blocked with an autopkgtest regression from rainbows
. Fixing them would likely unblock two packages:
But wait, there’s more …
Many of us are quite fond of the command line, so since I had all that data structure available, I thought I would make a CLI for it…
Ubuntu Excuses
In the same manner, you can install ubuntu-excuses
with:
🐧 ▶ snap install `ubuntu-excuses`
For starters, let’s see all the command arguments (which are also available with visual-excuses
by the way):
🐧 ▶ ubuntu-excuses --help
usage: ubuntu-excuses [-h] [--inspect INSPECT] [--name NAME] [--component COMPONENT] [--team TEAM] [--ftbfs] [--min-age DAYS] [--max-age DAYS] [--limit LIMIT] [--reverse] [--json]
[--cache-dir DIR]
Ubuntu Excuses (Proposed Migration) Viewer
options:
-h, --help show this help message and exit
--inspect INSPECT Get details about a specific package
--name NAME Regex to filter package names (case-insensitive)
--component COMPONENT
Archive component (main, restricted, universe, multivere)
--team TEAM Show only packages subscribed by this Ubuntu team
--ftbfs Show only FTBFS packages
--min-age DAYS Only include packages at least this many days old
--max-age DAYS Only include packages no older than this many days
--limit LIMIT Limit the number of results shown
--reverse Show excuses from older to more recent
--json Output in JSON format
--cache-dir DIR The directory under which to cache the excuses data (default: /home/mclemenceau/snap/ubuntu-excuses/50/.cache/visual-excuses)
As you can see, there’s quite a few options. For example, let’s say you are a Ubuntu contributor who wants to focus on rust packages in universe that have been stuck for more than two weeks and are not building from source (FTBFS):
🐧 ▶ ubuntu-excuses --component universe --name rust --min-age 14 --ftbfs
Downloading https://people.canonical.com/~ubuntu-archive/proposed-migration//update_excuses.yaml.xz
Excuses Cache up to date!
╒════════╤════════════════════════════╤═════════════╤════════════════╤═════════╤══════════════╕
│ Days │ Package │ Component │ New Version │ FTBFS │ Excuse Bug │
╞════════╪════════════════════════════╪═════════════╪════════════════╪═════════╪══════════════╡
│ 20 │ rust-hurl │ universe │ 6.0.0-1 │ ✅ │ │
│ 20 │ rust-hurl-core │ universe │ 6.0.0-1 │ ✅ │ │
│ 30 │ arm-trusted-firmware │ universe │ 2.12.1+dfsg-1 │ ✅ │ │
│ 31 │ rust-spytrap-adb │ universe │ 0.3.4-1 │ ✅ │ │
│ 38 │ rust-forensic-adb │ universe │ 0.8.0-1 │ ✅ │ │
│ 40 │ rust-debian-repro-status │ universe │ 0.2.1-1ubuntu1 │ ✅ │ │
│ 92 │ rust-symphonia-format-riff │ universe │ 0.5.4-1 │ ✅ │ │
│ 123 │ rust-symphonia-format-caf │ universe │ 0.5.4-1 │ ✅ │ │
│ 128 │ rust-termwiz │ universe │ 0.22.0-2 │ ✅ │ │
│ 138 │ rust-cargo-test-support │ universe │ 0.3.0-1 │ ✅ │ │
╘════════╧════════════════════════════╧═════════════╧════════════════╧═════════╧══════════════╛
In this other example, you list all the packaged blocked in main:
🐧 ▶ ubuntu-excuses --component main
Downloading https://people.canonical.com/~ubuntu-archive/proposed-migration//update_excuses.yaml.xz
Excuses Cache up to date!
╒════════╤════════════════════════╤═════════════╤══════════════════════╤═════════╤══════════════╕
│ Days │ Package │ Component │ New Version │ FTBFS │ Excuse Bug │
╞════════╪════════════════════════╪═════════════╪══════════════════════╪═════════╪══════════════╡
│ 11 │ ubuntu-advantage-tools │ main │ 35.1ubuntu0 │ │ │
│ 14 │ snapd │ main │ 2.68.3+ubuntu25.04.3 │ │ LP: #2106009 │
│ 18 │ ruby-sinatra │ main │ 4.1.1-5 │ ✅ │ LP: #2097028 │
│ 36 │ python-psutil │ main │ 7.0.0-1 │ ✅ │ LP: #2106466 │
│ 60 │ bpftrace │ main │ 0.21.2-2ubuntu4 │ ✅ │ LP: #2099792 │
│ 89 │ libunwind │ main │ 1.8.1-0.1 │ ✅ │ LP: #2095325 │
╘════════╧════════════════════════╧═════════════╧══════════════════════╧═════════╧══════════════╛
Enjoy the quiet while it lasts, with Questing Quokka opening soon, we’ll likely see a spike in activity and many more packages in the queue
Notice the easy to catch Excuse bug in LaunchPad that probably explains a lot about why this package is blocked and who is working on it.
What’s next?
I hope this will help lower the bar of entry to new Ubuntu developers to identify what packages to work on. I also hope this could help tackle the biggest cluster of dependencies faster.
I will continue to make some adjustments and expand the filtering options (list only issues with block-bugs, for example), but I would love to get more suggestions. And if you find bugs, please, feel free to report them!
http://github.com/mclemenceau/visual-excuses
http://github.com/mclemenceau/visual-excuses/issues
Thanks