<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Fedora on dev@iostream.pl</title><link>https://lvajxi03.github.io/tags/fedora/</link><description>Recent content in Fedora on dev@iostream.pl</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Mon, 05 Oct 2026 15:05:00 +0200</lastBuildDate><atom:link href="https://lvajxi03.github.io/tags/fedora/index.xml" rel="self" type="application/rss+xml"/><item><title>Escape from the Tropics</title><link>https://lvajxi03.github.io/posts/2026-10-05/</link><pubDate>Mon, 05 Oct 2026 15:05:00 +0200</pubDate><guid>https://lvajxi03.github.io/posts/2026-10-05/</guid><description>&lt;p&gt;&lt;strong&gt;KDE Plasma&lt;/strong&gt; is a remarkably pleasant environment for work — and for pretty much everything else — so there is very little to complain about.&lt;/p&gt;
&lt;p&gt;However, since I have already taken the first steps toward moving completely to &lt;strong&gt;FVWM3&lt;/strong&gt;, a little consistency seems appropriate.&lt;/p&gt;
&lt;p&gt;It is time to start replacing some of the applications from the KDE ecosystem as well.&lt;/p&gt;
&lt;p&gt;Not all at once.&lt;/p&gt;
&lt;p&gt;No need to panic.&lt;/p&gt;
&lt;p&gt;First, we need a survival kit.&lt;/p&gt;
&lt;h1 id="minimal-version"&gt;Minimal Version
&lt;/h1&gt;&lt;p&gt;The absolute minimum I would find difficult to live without is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;another terminal → &lt;strong&gt;Alacritty&lt;/strong&gt;, because why not,&lt;/li&gt;
&lt;li&gt;another file manager → &lt;strong&gt;PCManFM-Qt&lt;/strong&gt; — I used its GTK ancestor about twenty years ago, so now the Qt version gets a chance,&lt;/li&gt;
&lt;li&gt;Qt appearance configuration → &lt;strong&gt;qt6ct&lt;/strong&gt; — without it, surprises await,&lt;/li&gt;
&lt;li&gt;somewhat more deliberate wallpaper handling → &lt;strong&gt;feh&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;a launcher slightly more sophisticated than &lt;code&gt;dmenu&lt;/code&gt; → &lt;strong&gt;rofi&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;display configuration management → &lt;strong&gt;autorandr&lt;/strong&gt; and &lt;strong&gt;arandr&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is one additional detail with &lt;code&gt;qt6ct&lt;/code&gt;: Qt applications need to know that they are supposed to use it.&lt;/p&gt;
&lt;p&gt;An FVWM session will therefore eventually need something along the lines of:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export QT_QPA_PLATFORMTHEME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;qt6ct
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Simply installing &lt;code&gt;qt6ct&lt;/code&gt; does not magically make it take control of every Qt application.&lt;/p&gt;
&lt;p&gt;Unfortunately.&lt;/p&gt;
&lt;p&gt;The magic comes later.&lt;/p&gt;
&lt;h1 id="standard-version"&gt;Standard Version
&lt;/h1&gt;&lt;p&gt;The standard version contains everything from the minimal one, plus:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bluetooth device management → &lt;strong&gt;blueman&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;display brightness control → &lt;strong&gt;brightnessctl&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;notifications → &lt;strong&gt;dunst&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;a PolicyKit authentication agent → &lt;strong&gt;lxqt-policykit&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;screenshots → &lt;strong&gt;flameshot&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;NetworkManager connection management → &lt;strong&gt;network-manager-applet&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;an audio mixer → &lt;strong&gt;pavucontrol&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;an X11 compositor → &lt;strong&gt;picom&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;media-player control → &lt;strong&gt;playerctl&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;automatic removable-media mounting through UDisks → &lt;strong&gt;udiskie&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;a volume-control applet → &lt;strong&gt;volumeicon&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;a second terminal, for variety → &lt;strong&gt;qterminal&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;a system tray → &lt;strong&gt;stalonetray&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, an innocent little window manager starts looking suspiciously like a desktop environment.&lt;/p&gt;
&lt;p&gt;But that is fine.&lt;/p&gt;
&lt;p&gt;We still know exactly what it consists of.&lt;/p&gt;
&lt;h1 id="full-version"&gt;Full Version
&lt;/h1&gt;&lt;p&gt;Naturally, the &lt;em&gt;full&lt;/em&gt; version requires the standard version and all of its dependencies, and adds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yet another terminal, just to prevent boredom → &lt;strong&gt;kitty&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;another file manager → &lt;strong&gt;Thunar&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Three terminals may sound excessive.&lt;/p&gt;
&lt;p&gt;They are not.&lt;/p&gt;
&lt;h1 id="rpm-packages"&gt;RPM Packages
&lt;/h1&gt;&lt;p&gt;Since &lt;strong&gt;Fedora&lt;/strong&gt; is now my main operating system, there is an obvious next step:&lt;/p&gt;
&lt;p&gt;package all of this as RPMs.&lt;/p&gt;
&lt;p&gt;Right?&lt;/p&gt;
&lt;p&gt;Right.&lt;/p&gt;
&lt;p&gt;The packages do not even need to contain any programs or configuration files of their own.&lt;/p&gt;
&lt;p&gt;What we need are &lt;strong&gt;metapackages&lt;/strong&gt; — almost empty RPM packages whose main purpose is to depend on other packages.&lt;/p&gt;
&lt;p&gt;Instead of remembering fifteen package names, I should eventually be able to type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dnf install kde-refugee-pack-standard
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and be done with it.&lt;/p&gt;
&lt;h2 id="tools"&gt;Tools
&lt;/h2&gt;&lt;p&gt;First, install the basic RPM-building tools:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dnf install rpm-build rpmdevtools rpmlint
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the standard build tree:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rpmdev-setuptree
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and generate a fresh spec template:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rpmdev-newspec my-package.spec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A typical spec template contains fields such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Name&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Version&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Release&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Summary&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;License&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;URL&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Source&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BuildRequires&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Requires&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also contains sections such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;%description&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%prep&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%build&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%install&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%files&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%changelog&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For a package consisting entirely of dependencies, most of these are unnecessary.&lt;/p&gt;
&lt;p&gt;There are no sources.&lt;/p&gt;
&lt;p&gt;There is nothing to compile.&lt;/p&gt;
&lt;p&gt;There is not even anything to install into the filesystem.&lt;/p&gt;
&lt;h2 id="minimal"&gt;Minimal
&lt;/h2&gt;&lt;p&gt;The &lt;code&gt;kde-refugee-pack-minimal.spec&lt;/code&gt; file can therefore look like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-rpm" data-lang="rpm"&gt;Name: kde-refugee-pack-minimal
Version: 0.0.1
Release: 1%{?dist}
Summary: KDE refugee pack, minimal version

License: MIT
BuildArch: noarch

Requires: alacritty
Requires: qt6ct
Requires: pcmanfm-qt
Requires: feh
Requires: rofi
Requires: autorandr
Requires: arandr

%description
Mandatory metapackage for everyone who leaves KDE for fvwm3
(minimal version)

%files

%changelog
* Sat Oct 03 2026 Marcin Bielewicz &amp;lt;marcin.bielewicz@gmail.com&amp;gt;
- initial version
&lt;/code&gt;&lt;/pre&gt;
 &lt;blockquote&gt;
 &lt;p&gt;Important: keep the empty &lt;code&gt;%files&lt;/code&gt; section.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;The package does not contain any files, but we still want &lt;code&gt;rpmbuild&lt;/code&gt; to produce a binary RPM.&lt;/p&gt;
&lt;p&gt;That is its entire purpose:&lt;/p&gt;
&lt;p&gt;to exist and require other packages.&lt;/p&gt;
&lt;h2 id="standard"&gt;Standard
&lt;/h2&gt;&lt;p&gt;The next level depends on the first one:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-rpm" data-lang="rpm"&gt;Name: kde-refugee-pack-standard
Version: 0.0.1
Release: 1%{?dist}
Summary: KDE refugee pack, standard version

License: MIT
BuildArch: noarch

Requires: kde-refugee-pack-minimal = %{version}
Requires: blueman
Requires: brightnessctl
Requires: dunst
Requires: flameshot
Requires: lxqt-policykit
Requires: network-manager-applet
Requires: pavucontrol
Requires: picom
Requires: playerctl
Requires: udiskie
Requires: volumeicon
Requires: qterminal
Requires: stalonetray

%description
Mandatory metapackage for everyone who leaves KDE for fvwm3
(standard version)

%files

%changelog
* Sat Oct 03 2026 Marcin Bielewicz &amp;lt;marcin.bielewicz@gmail.com&amp;gt;
- initial version
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The important line is:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-rpm" data-lang="rpm"&gt;Requires: kde-refugee-pack-minimal = %{version}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;which means:&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;I require &lt;code&gt;kde-refugee-pack-minimal&lt;/code&gt; in the same version as this package.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Of course, this could be written explicitly:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-rpm" data-lang="rpm"&gt;Requires: kde-refugee-pack-minimal = 0.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;but &lt;code&gt;%{version}&lt;/code&gt; saves us from having to remember to change it in the next release.&lt;/p&gt;
&lt;p&gt;Laziness.&lt;/p&gt;
&lt;p&gt;Once again, the driving force behind computer science.&lt;/p&gt;
&lt;h2 id="full"&gt;Full
&lt;/h2&gt;&lt;p&gt;The final level:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-rpm" data-lang="rpm"&gt;Name: kde-refugee-pack-full
Version: 0.0.1
Release: 1%{?dist}
Summary: KDE refugee pack, full version

License: MIT
BuildArch: noarch

Requires: kde-refugee-pack-standard = %{version}
Requires: kitty
Requires: Thunar

%description
Mandatory metapackage for everyone who leaves KDE for fvwm3
(full version)

%files

%changelog
* Sat Oct 03 2026 Marcin Bielewicz &amp;lt;marcin.bielewicz@gmail.com&amp;gt;
- initial version
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This gives us a dependency chain:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;full
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── standard
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── minimal
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;with each level adding its own collection of tools.&lt;/p&gt;
&lt;h1 id="building-the-packages"&gt;Building the Packages
&lt;/h1&gt;&lt;p&gt;A binary RPM can be built with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rpmbuild -bb package.spec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The result will normally appear under:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;~/rpmbuild/RPMS/noarch/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;-bb&lt;/code&gt; option builds the binary package only.&lt;/p&gt;
&lt;p&gt;If we also want an SRPM:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rpmbuild -ba package.spec
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is what I will use in CI.&lt;/p&gt;
&lt;p&gt;If the computer is doing the work anyway, there is little reason to stop it.&lt;/p&gt;
&lt;h1 id="installing-the-packages"&gt;Installing the Packages
&lt;/h1&gt;&lt;p&gt;A local RPM can be installed through DNF:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dnf install ./package.rpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;./&lt;/code&gt; matters: it tells DNF that this is a local file rather than a package name to search for in configured repositories.&lt;/p&gt;
&lt;p&gt;DNF then resolves and installs the dependencies.&lt;/p&gt;
&lt;p&gt;Which was the whole point of this exercise.&lt;/p&gt;
&lt;h1 id="github-actions"&gt;GitHub Actions
&lt;/h1&gt;&lt;p&gt;Once the spec files live in a repository, rebuilding them manually every time starts looking suspiciously like a task that could be automated.&lt;/p&gt;
&lt;p&gt;Tasks like that are dangerous.&lt;/p&gt;
&lt;p&gt;They tend to produce CI pipelines.&lt;/p&gt;
&lt;p&gt;The workflow can look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Build RPM packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;push&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;paths&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;specs/**&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;.github/workflows/rpm.yml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;pull_request&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;paths&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;specs/**&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;.github/workflows/rpm.yml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;permissions&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;contents&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;read&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;jobs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;build&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Build ${{ matrix.package }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;runs-on&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ubuntu-latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;strategy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;fail-fast&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;matrix&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;package&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;kde-refugee-pack-minimal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;kde-refugee-pack-standard&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;kde-refugee-pack-full&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;fedora:44&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Install build tools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; dnf install -y \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; findutils \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; rpm-build \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; rpmdevtools \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; rpmlint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Checkout repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/checkout@v7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Prepare rpmbuild tree&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rpmdev-setuptree&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Copy spec&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; cp specs/${{ matrix.package }}.spec ~/rpmbuild/SPECS/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Lint spec&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; rpmlint specs/${{ matrix.package }}.spec&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Build RPM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; rpmbuild -ba ~/rpmbuild/SPECS/${{ matrix.package }}.spec&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Show result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; find ~/rpmbuild/RPMS ~/rpmbuild/SRPMS -type f -print&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Collect build artifacts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; mkdir -p artifacts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; cp ~/rpmbuild/RPMS/noarch/*.rpm artifacts/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; cp ~/rpmbuild/SRPMS/*.src.rpm artifacts/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Upload build bundle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/upload-artifact@v7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bundle-${{ matrix.package }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;artifacts/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Upload binary RPM directly&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/upload-artifact@v7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;~/rpmbuild/RPMS/noarch/${{ matrix.package }}-*.noarch.rpm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;archive&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;install-test&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Test package installation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;needs&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;runs-on&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ubuntu-latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;fedora:44&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Download kde-refugee-pack-minimal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/download-artifact@v8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bundle-kde-refugee-pack-minimal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rpms/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Download kde-refugee-pack-standard&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/download-artifact@v8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bundle-kde-refugee-pack-standard&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rpms/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Download kde-refugee-pack-full&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/download-artifact@v8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;bundle-kde-refugee-pack-full&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rpms/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Install refugee pack&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; dnf install -y \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; rpms/kde-refugee-pack-minimal-*.noarch.rpm \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; rpms/kde-refugee-pack-standard-*.noarch.rpm \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; rpms/kde-refugee-pack-full-*.noarch.rpm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At first glance, this line may look odd:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;runs-on&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ubuntu-latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We are building Fedora packages, after all.&lt;/p&gt;
&lt;p&gt;A few lines later, however:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;container&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;fedora:44&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GitHub provides the runner, while the job itself executes in a Fedora 44 environment.&lt;/p&gt;
&lt;p&gt;There is no need for a separate Fedora runner.&lt;/p&gt;
&lt;p&gt;The matrix:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;matrix&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;package&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;kde-refugee-pack-minimal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;kde-refugee-pack-standard&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;kde-refugee-pack-full&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;creates three independent builds.&lt;/p&gt;
&lt;p&gt;Each spec file is checked with &lt;code&gt;rpmlint&lt;/code&gt;, built, and stored as an artifact.&lt;/p&gt;
&lt;p&gt;And this is where things become pleasantly convenient.&lt;/p&gt;
&lt;p&gt;A normal artifact upload creates an archive containing the RPM and SRPM.&lt;/p&gt;
&lt;p&gt;But &lt;code&gt;actions/upload-artifact@v7&lt;/code&gt; also supports:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;archive&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;for a single file.&lt;/p&gt;
&lt;p&gt;So every binary RPM is additionally available directly as an &lt;code&gt;.rpm&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;No ZIP extraction required.&lt;/p&gt;
&lt;p&gt;Like civilized people.&lt;/p&gt;
&lt;p&gt;The second job downloads all three build bundles and tries to install the packages on a fresh Fedora environment.&lt;/p&gt;
&lt;p&gt;The workflow therefore verifies more than:&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;the RPM builds.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;It also verifies:&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;DNF can resolve the dependency chain and install all three levels.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;And because the workflow itself lives at:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.github/workflows/rpm.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;while the path filter contains:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;paths&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;specs/**&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;.github/workflows/rpm.yml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;changing the workflow itself triggers another run.&lt;/p&gt;
&lt;p&gt;The pipeline therefore tests, among other things, itself.&lt;/p&gt;
&lt;h1 id="summary"&gt;Summary
&lt;/h1&gt;&lt;p&gt;A small joke of a task somehow grew into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a list of programs I will actually use,&lt;/li&gt;
&lt;li&gt;three levels of a KDE survival kit,&lt;/li&gt;
&lt;li&gt;three RPM metapackages,&lt;/li&gt;
&lt;li&gt;automated linting,&lt;/li&gt;
&lt;li&gt;automated builds,&lt;/li&gt;
&lt;li&gt;an installation test,&lt;/li&gt;
&lt;li&gt;artifacts available both as bundles and directly as RPM files,&lt;/li&gt;
&lt;li&gt;and a GitHub repository: &lt;a class="link" href="https://github.com/lvajxi03/specfiles/" target="_blank" rel="noopener"
 &gt;specfiles&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All because I did not want to type a dozen package names by hand.&lt;/p&gt;
&lt;p&gt;It was laziness, Your Honor.&lt;/p&gt;</description></item></channel></rss>