Руководство по сопровождению пакетов
На этой странице приведены основные инструкции по повседневному использованию системы сопровождения пакетов Fedora на основе git. Она предназначена в первую очередь для новых и действующих сопровождающих пакетов Fedora, но также кратко охватывает анонимное использование системы только для чтения. Само по себе это не руководство по упаковке RPM.
Некоторые предварительные знания git могут быть полезны, но не являются обязательным условием. На самом деле, упаковка в Fedora может стать довольно безболезненным введением в него.
Возможно, вы искали или также заинтересованы в:
Установка инструментов упаковщика
Следуйте Установка инструментов упаковщика.
Часто используемые команды fedpkg
В этом разделе перечислены типичные команды fedpkg в обычном рабочем процессе с краткими описаниями. В этом рабочем процессе мы будем работать с веткой Rawhide пакета.
Получение пакета
fedpkg co <имя_исходного_пакета> cd <имя_исходного_пакета>
Это получает копию исходных кодов пакета с сервера. Это называется вашей «рабочей копией».
Получение исходных кодов пакета
fedpkg sources
Это загружает любые исходные коды, хранящиеся в «lookaside cache» (см. ниже). Такие шаги, как fedpkg prep и fedpkg srpm, сделают это при необходимости, но вы можете захотеть получить копию сразу.
Внесение изменений в пакет
Это не руководство по упаковке RPM, поэтому мы предполагаем, что вы знаете, что делаете. Новые исходные коды и патчи пока помещаются в каталог рабочей копии.
Запуск этапа подготовки
Извлечение исходных кодов, применение патчей и т.д. в каталоге рабочей копии:
fedpkg prep
Это полезно для проверки того, что ваши патчи применяются чисто, и для просмотра дерева исходных кодов, если это необходимо.
Выполнение локальной сборки текущего состояния
fedpkg local
Это простейший вид тестовой сборки, но обычно чище и лучше выполнять сборку в Mock или пробную сборку в Koji (см. ниже).
Выполнение сборки в Mock текущего состояния
fedpkg mockbuild
Это запускает сборку в Mock, если Mock настроен правильно. Использование Mock для тестирования сборки пакетов может в этом помочь.
Создание .src.rpm из текущего состояния
fedpkg srpm
Вы можете запросить пробную сборку в Koji (тестовую сборку, которая не попадёт в репозиторий) созданного .src.rpm с помощью команды koji build --scratch (см. man koji).
Проверка внесённых изменений
fedpkg diff
Это удобно для проверки того, что вы случайно не затронули что-то лишнее, не забыли увеличить номер выпуска или не забыли включить запись в журнале изменений.
Запуск проверок (rpmlint) для вашего пакета
fedpkg lint
Если вы хотите добавить некоторые ошибки rpmlint в белый список и предотвратить их появление, вы можете создать файл конфигурации rpmlint с именем <source_package_name>.rpmlintrc, и он будет применён.
Подготовка небольших патчей или новых файлов исходных кодов для фиксации
git add <файл>...
По умолчанию Git не считает все файлы в рабочем каталоге частью репозитория (это удобно для хранения других связанных файлов, таких как дерево исходных кодов). Это говорит git начать рассматривать эти файлы как часть репозитория локально. Когда вы позже выполните commit и push, это изменение будет передано на сервер.
Загрузка новых файлов исходных кодов в lookaside cache
fedpkg new-sources <файл>...
Заменить текущий список файлов исходных кодов.
fedpkg upload <файл>...
Добавить к текущему списку файлов исходных кодов.
«Первозданные» исходные коды вышестоящего проекта (например, тарболлы релизов) и другие большие файлы исходных кодов хранятся в системе lookaside cache, а не фиксируются непосредственно в git. Это обеспечивает более эффективное хранение и передачу файлов. Файлы sources и .gitignore в репозитории синхронизируют его с lookaside cache.
Для загрузки файлов исходных кодов требуется действительный билет Kerberos. При каждой загрузке новых исходных кодов не забывайте фиксировать изменения в файле sources.
Переключение на другую ветку выпуска
fedpkg switch-branch (f42 | el9 | rawhide)
Каждый выпуск Fedora имеет свою собственную ветку в каждом репозитории пакета, чтобы разные сборки можно было отправлять для каждого выпуска. См. ниже более подробную информацию о работе с ветками.
Создание журнала изменений git из журнала изменений пакета
fedpkg clog
Эта команда извлекает запись из журнала изменений вашего пакета в файл clog, чтобы вы могли использовать его в качестве журнала изменений git, если захотите. Некоторые сопровождающие проводят различие между ними, некоторые — нет.
Фиксация изменений
fedpkg commit [-F <clog>] [-p] [-c]
По умолчанию это ведёт себя как git commit -a: оно подготавливает изменённые файлы и фиксирует всё сразу, но не добавляет файлы, которые git ещё не отслеживает.
Это создаёт своего рода пакет, «коммит», ваших изменений в репозитории с уникальным идентификатором и журналом изменений. Другие сопровождающие — и вы сами позже — могут просматривать историю изменений в репозитории, где коммит является самым мелким уровнем детализации. Хорошей практикой является использование множества относительно небольших коммитов, каждый для одной цели. Не объединяйте увеличение версии с кучей исправлений пробелов и изменениями скриптов в одном коммите, создавайте отдельные коммиты для каждого.
Параметр -F clog будет использовать файл clog из предыдущего шага в качестве журнала изменений. -p выполнит push (см. ниже) одновременно с фиксацией. -c объединяет шаги clog и commit -F clog в один, если вам это нравится.
Отправка изменений
fedpkg push
Это отправляет все новые коммиты из вашей локальной рабочей копии на вышестоящий сервер. Если вы всё ещё изучаете систему, сейчас самое время выполнить fedpkg co другой копии репозитория в другом месте, сравнить то, что вы получили, с вашей рабочей копией и выполнить на ней тестовую сборку.
Выполнение сборки слоёного образа контейнера
fedpkg container-build
Подробности см. в Сборка слоёных образов контейнеров.
Отправка обновления пакета для последней сборки
fedpkg update
| Это первый момент, когда вы можете реально навредить реальному пользователю, поэтому используйте это с осторожностью. Если вы следуете примеру и работаете с Rawhide, ваша сборка станет доступной для пользователей Rawhide через несколько часов после выполнения этой команды. |
В отличие от большинства вышеперечисленных команд, эта работает с состоянием, которое вы отправили в git, а не с локальным состоянием. Если у вас возникли проблемы, убедитесь, что вы отправили и зафиксировали все патчи и правильно обработали исходные коды.
См. Обновление взаимозависимых пакетов, если вы вносите взаимозависимые изменения в несколько пакетов.
Типичный сеанс fedpkg
Типичный сеанс может выглядеть так:
fedpkg clone foo cd foo fedpkg sources fedpkg new-sources foo-0.0.2.tar.bz2 # Внесите необходимые изменения в spec-файл. # 'rpmdev-bumpspec' полезен для простых обновлений версий. gedit foo.spec # Проверьте, что внесённые изменения верны. fedpkg mockbuild fedpkg diff fedpkg lint fedpkg commit -p -c # фиксация и отправка за один раз
Работа с ветками
Каждый выпуск Fedora и EPEL имеет соответствующую ветку в репозитории git. Вы можете переключаться между ними так:
fedpkg switch-branch rawhide fedpkg switch-branch f42 fedpkg switch-branch f41 fedpkg switch-branch epel9
При создании репозитория git в нём будут только ветки rawhide и main, причём последняя является псевдонимом первой. Ветки для новых выпусков Fedora создаются автоматически во время массового ветвления. Если вы хотите собрать свой пакет для существующих выпусков Fedora или EPEL, вам необходимо явно запросить эти ветки.
Запрос веток
fedpkg request-branch f42
Эта команда запросит ветку git для Fedora 42.
fedpkg request-branch --all-releases
Эта команда запросит ветки git для каждого активного в данный момент выпуска Fedora.
fedpkg request-branch --repo <имя_исходного_пакета> f40
Эта форма может использоваться для запроса веток, когда вы не находитесь внутри Git-репозитория пакета. Вам не нужно ждать создания репозитория перед подачей такого запроса на ветку, но вы должны запросить репозиторий перед запросом веток.
fedpkg request-branch epel9
Эта команда запросит ветку git для EPEL 9.
Удаление ветки rawhide в пакетах только для EPEL
Некоторые пакеты нужны только для EPEL. Для таких пакетов после создания репозитория ветка rawhide '''должна''' быть удалена. Используйте следующую команду (с переключением на ветку rawhide):
fedpkg retire <пакет_только_для_epel>
Слияние между ветками
Вы можете поддерживать каждую ветку полностью отдельно, если хотите, кропотливо копируя изменения между ними (при условии, что вы всегда остаётесь в рамках требований Политики обновлений). Однако git предоставляет нам несколько удобных инструментов для работы с ветками. Вот пример:
fedpkg clone bzrtools # Внесите некоторые изменения в ветку rawhide fedpkg new-sources bzrtools-2.2.tar.gz gedit bzrtools.spec fedpkg commit fedpkg switch-branch f42 git merge rawhide # для отправки в репозиторий fedpkg push
Это слияет изменения из ветки rawhide в ветку f42. Знатоки git могут заметить, что это несколько необычный рабочий процесс, но он подходит для контекста управления пакетами. Помните, что после отправки и сборки для стабильного выпуска или ветвлённого релиза после активации updates-testing, вам необходимо будет отправить обновление, прежде чем другие пользователи Fedora увидят вашу сборку.
Обратите внимание, что слияние будет работать чисто только до тех пор, пока ветки ранее не расходились. То есть, если вы сделаете это:
fedpkg clone bzrtools # Внесите некоторые изменения в ветку rawhide fedpkg commit fedpkg switch-branch f42 # Внесите некоторые изменения в ветку f42 fedpkg commit fedpkg switch-branch rawhide # Внесите ещё некоторые изменения в ветку rawhide fedpkg commit fedpkg switch-branch f42 git merge rawhide
вы можете столкнуться с конфликтом слияния.
Помните, что git — это совместная система, и она используется именно так в управлении пакетами Fedora. Часто бывает так, что вы должны учитывать изменения, внесённые другими при работе над пакетом, и думать о том, как ваши изменения повлияют на других.
Разрешение конфликтов слияния
Это обширная тема и несколько выходит за рамки данного руководства, но мы можем дать основные указания. Есть другие хорошие источники в книге о Git и в документации GitHub.
Когда вы выполняете слияние и возникает конфликт, вы можете отредактировать файлы, в которых есть конфликты. Удалите маркеры конфликтов в файлах и объедините изменения вручную. Используйте git diff или fedpkg diff, чтобы проверить изменения по сравнению с состоянием до конфликта и убедиться, что вы удовлетворены разрешением. Затем вы можете зафиксировать файлы с помощью fedpkg commit или git commit -a. Git определит, разрешили ли вы конфликт, проверив, что все маркеры конфликтов удалены.
Использование git mergetool для разрешения конфликтов
Git предоставляет графическую программу сравнения для разрешения конфликтов. Это может быть удобно для визуализации произошедших изменений и работы с ними как с набором.
git config --global merge.tool meld fedpkg switch-branch f42 git merge rawhide # Возникли конфликты. # Откройте meld, показывающий трёхстороннее сравнение слияния, рабочего дерева и последнего коммита. git mergetool # Разрешите все конфликты в графическом интерфейсе git add КОНФЛИКТНЫЕ_ФАЙЛЫ git commit
Обновления нескольких пакетов
Когда изменение пакета затрагивает большое количество зависимостей (например, все пакеты perl, python, ruby или ghc), требующих их пересборки, может быть лучше сначала выполнить сборки в побочном теге, чтобы в Rawhide было меньше сбоев. Подробности см. в Руководство по обновлению пакетов, раздел Обновления нескольких пакетов.
Использование fedpkg анонимно
Вы можете использовать fedpkg так:
fedpkg clone --anonymous
для получения пакета без необходимости идентификации. Очевидно, вы не сможете отправлять какие-либо изменения в этот репозиторий, но это полезно для не-упаковщиков, которые просто хотят изучить пакет и внести изменения для собственного использования.
Если вы намерены отправить изменения разработчику Fedora, см. Руководство по запросам на включение.
Советы и хитрости
Локальные имена веток
Если вы используете команды git для создания веток и получения их напрямую, вы можете определять любые локальные имена веток. Если вы используете fedpkg switch-branch, по умолчанию будут создаваться имена, используемые в примерах выше.
Текущая ветка и состояние в приглашении оболочки
Часто полезно знать, в какой ветке вы работаете, с первого взгляда. Вы можете добавить эту информацию в приглашение bash с помощью информации здесь.
Импорт .src.rpm для обновления
Команда, обычно используемая для первоначального заполнения репозитория git пакета из .src.rpm, прошедшего процесс проверки пакета, также может использоваться для обновления обычной рабочей копии, если вы особенно привязаны к старому способу упаковки. Просто выполните fedpkg import file.src.rpm, и он загрузит новые тарболлы в lookaside cache, обновит рабочую копию последней версии, найденной в git, и зафиксирует все изменения. fedpkg import --help описывает некоторые другие параметры, которые он может принимать.
| Этот подход усложняет проверку того, что ваши изменения безопасны и не перезаписывают изменения, внесённые в пакет другими. По этой причине его использование не рекомендуется. |
Внесение изменений в более старую ветку без нарушения пути обновления
Вот сценарий: вы успешно собрали свой пакет в ветке f42, но есть проблема, мешающая сборке пакета в last.
Решение: Внесите изменения в ветку, а затем добавьте цифру в самый конец тега выпуска. Нет необходимости изменять выпуск в других ветках. Это позволяет обновлениям работать гладко, если пользователь обновляется до более нового выпуска Fedora.
Name: foo
Version: 1.0
Release: 1%{?dist}
Name: foo
Version: 1.0
Release: 1%{?dist}.1
Затем создайте тег и выполните сборку как обычно. Этот подход изначально обсуждался в этой ветке списка рассылки.
Удаление ожидающей сборки пакета для Rawhide или Branched
Время от времени вам может потребоваться удалить сборку пакета, которую вы отправили в Rawhide или в Branched до заморозки Alpha (в обоих случаях сборка обычно попадает в основной репозиторий без дальнейшей проверки). Это может произойти, если в вашем пакете обнаружена ошибка или проблема, которая будет исправлена вышестоящим проектом в следующем выпуске, или вы понимаете, что допустили значительную ошибку в сборке, которую нелегко исправить.
| Это следует делать только в день сборки, до её включения в compose. Если ваша сборка уже была включена в compose, вы не должны снимать с неё тег! Проверьте Product Definition Center, чтобы узнать время начала последней сборки compose. |
Вы можете удалить пакет с помощью Koji:
koji untag-pkg f43 foo-1.1.3-1.fc43
где foo-1.1.3-1.fc43 заменяется на имя вашей сборки пакета. См. koji help или Использование системы сборки Koji для получения дополнительной информации.
Отпечаток ssh
Рекомендуемый вариант — добавить VerifyHostKeyDNS yes в ваш файл ~/.ssh/config. Это приведёт к использованию DNS для проверки правильности ключа.
Но вы также можете вручную проверить по списку ключей на Fedora Apps. Строки там попадают в ваш файл ~/.ssh/known_hosts. Поэтому вы можете принять отпечаток при запросе, а затем проверить, что правильная строка для src.fedoraproject.org попала в ваш файл ~/.ssh/known_hosts.
Проблемы с подключением к репозиторию
Инструмент fedpkg клонирует репозитории с использованием протокола ssh://, поэтому обычно это не должно быть проблемой (при условии, что у вас есть ключ ssh). Если вы клонировали с помощью самой утилиты git, проверьте файл .git/config, чтобы убедиться, что доступ к удалённому репозиторию осуществляется через протокол ssh://, а не git://.
Проблемы с отправкой в форк-репозиторий через http
Отправка в ваш форк-репозиторий через http может завершиться ошибкой:
Это вызвано тем, что `fedpkg` не удаётся подключиться к MBS, который теперь выведен из эксплуатации. Удаление ссылки на MBS в `/etc/rpkg/fedpkg.conf` должно исправить это.
Измените эту строку в `fedpkg.conf`: ``` oidc_scopes = openid,https://id.fedoraproject.org/scope/groups,https://mbs.fedoraproject.org/oidc/submit-build,https://src.fedoraproject.org/push ```
на: ``` oidc_scopes = openid,https://id.fedoraproject.org/scope/groups,https://src.fedoraproject.org/push ```
[#it_builds_here_why_doesnt_it_build_there]
=== Здесь собирается, почему не собирается там?
Собирается ли ваш пакет локально — даже в Mock, даже в пробной сборке! — но не собирается при запуске `fedpkg build`? Прежде чем слишком расстраиваться, помните, что `fedpkg build` работает с пакетом в том виде, в котором он существует в вышестоящем репозитории, а не в вашей локальной рабочей копии. Убедитесь, что вы зафиксировали и отправили все изменения и файлы исходных кодов, а также правильно обработали lookaside cache. Другие сообщённые проблемы связаны с https://bugzilla.redhat.com/show_bug.cgi?id=1179139[параллелизацией проверки build/make] и сбоями из-за тестовых наборов, которые зависят от завершения операций с точным временем (а загруженная система сборки может не успеть выполнить операции вовремя).
== Ссылки
* https://src.fedoraproject.org/
* https://fedoraproject.org/wiki/Infrastructure/Kerberos[Инфраструктура/Kerberos]
* https://fedoraproject.org/wiki/Packaging_tricks?rd=PackageMaintainers/PackagingTricks[Сопровождающие пакетов/Хитрости упаковки]
* xref:releases::lifecycle.adoc[Жизненный цикл выпусков Fedora Linux]
* https://fedoraproject.org/wiki/Infrastructure/VersionControl/dist-git[Инфраструктура/Управление версиями/dist-git]
Want to help? Learn how to contribute to Fedora Docs ›