Всё начинается с того, что пакетный мейнтейнер пушит коммит в репозиторий пакета на src.fedoraproject.org. Каждый репозиторий хранит spec-файл, downstream-патчи и файл sources, ссылающийся на тарболлы из отдельного lookaside-кеша. Бинарные файлы остаются вне Git. Команда fedpkg build собирает URL конкретного коммита и отдаёт его сборочной системе Koji.
Koji работает по модели hub-and-spoke: пассивный XML-RPC сервер перед PostgreSQL и демоны-сборщики, которые опрашивают hub, создают чистое Mock chroot-окружение и выполняют сборку. Каждая сборка воспроизводима с точностью до хеша коммита. Ветки соответствуют релизам: rawhide для разработки, f44 для Fedora 44. Хостинг мигрирует с Pagure на Forgejo. Внутренняя организация Koji построена на тегах: цель сборки определяет тег сборочного окружения и тег, куда попадёт готовая сборка. Через систему плагинов Koji запускает не только RPM-сборки, но и образы: Kiwi через задачу kiwiBuild, Image Builder через imageBuilderBuild, а rpm-ostree — через runroot.
Для всего, кроме Rawhide, свежесобранный RPM не попадает к пользователям сразу. Сначала он проходит через Bodhi. Мейнтейнер отправляет обновление, и оно движется по цепочке pending → testing → stable. Пользователи и автоматические тесты дают карму (+1/-1). При +3 или после достаточного числа дней обновление автоматически уходит в stable; critical path пакеты требуют 14 дней в тестировании вместо 7 и больше кармы. Bodhi двигает сборки между тегами f44-updates-testing и f44-updates в Koji, после чего дёргает Pungi, чтобы пересобрать репозитории, которые читает dnf upgrade. Интеграция с Greenwave и ResultsDB позволяет автотестам заблокировать обновление.
Pungi — оркестратор композиции, превращающий пакеты в то, что можно скачать и установить. Он стартует с фазы Pkgset: замораживает набор пакетов из Koji-тега, так что никто не подсунет свежую сборку посреди процесса. Два XML-файла, comps и variants, определяют, какие группы пакетов попадают в какие продукты — Everything, Server, Workstation, KDE, Silverblue и другие. В фазе Buildinstall lorax собирает boot.iso с минимальным окружением Anaconda. Затем Createiso накладывает пакеты и метаданные поверх boot.iso, выдавая dvd.iso (главным образом для Server).
Основную массу образов строит Kiwi: облачные (AWS, Azure, GCP), Vagrant-боксы, контейнеры, WSL, живые ISO десктопных спинов. XML-описания лежат в репозитории fedora-kiwi-descriptions. Kiwi интегрирован в Koji через плагин. Image Builder, работающий на движке osbuild, отвечает за ostree- и bootc-артефакты: Atomic Desktop ISO, Fedora IoT, Minimal и сам boot.iso. Сборка идёт внутри Mock chroot с манифестами в JSON; этапы изолированы bubblewrap. Плагин koji-image-builder добавляет Koji задачу imageBuilderBuild.
Atomic-варианты вроде Silverblue, Kinoite, Sway Atomic, Budgie Atomic и COSMIC Atomic собираются иначе. Вместо кучи RPM они поставляют версионированное OSTree-дерево. Инструмент rpm-ostree собирает такой коммит из treefile в YAML (репозиторий workstation-ostree-config) и набора RPM-репозиториев. Скрипт comps-sync.py синхронизирует списки пакетов из comps-групп с treefile, добавляя ostree-специфичные пакеты и исключая то, что ушло в Flatpak. Pungi дёргает rpm-ostree compose tree в runroot-окружении Koji.
В процессе композиции генерируются метаданные productmd: composeinfo.json, images.json, rpms.json и .treeinfo. Их читает Anaconda во время установки, Bodhi для управления обновлениями, openQA для поиска образов и зеркала для синхронизации.
После завершения композиции openQA подхватывает образы и прогоняет сценарии в виртуальных машинах: разные варианты установки, работу рабочего стола, пути обновления. Тесты для nightly-сборок Rawhide и веховых композиций влияют на валидацию релиза; найденные блокирующие баги способны задержать выпуск.
Крупные изменения вроде перехода на Kiwi или Image Builder проходят через Changes process: заявка оформляется в вики, рецензируется Change Wrangler, утверждается комитетом FESCo из девяти человек и реализуется в Rawhide. Пропуск дедлайна, например Beta Freeze, автоматически переносит изменение на следующий релиз. Весь этот конвейер и превращает исходный код в ту самую «колбасу», которую вы скачиваете.