Ведение %changelog
Формат записей changelog, что документировать, автоматизация.
На этой странице
Секция %changelog — это история изменений SPEC-файла. Она помогает понять, что и когда менялось в пакете.
Формат записи
%changelog
* Mon Feb 03 2025 Ivan Petrov <ivan@example.com> - 2.0.0-1
- Update to version 2.0.0
- Add new feature X
- Fix crash on startup (rhbz#12345)
* Fri Jan 15 2025 Ivan Petrov <ivan@example.com> - 1.9.0-2
- Rebuild for new libfoo
* Wed Dec 20 2024 Ivan Petrov <ivan@example.com> - 1.9.0-1
- Initial package
Структура записи
* День Месяц ДД ГГГГ Имя Фамилия <email> - Версия-Релиз
- Описание изменения 1
- Описание изменения 2
Обязательные элементы:
- Звёздочка
*в начале - День недели (3 буквы): Mon, Tue, Wed, Thu, Fri, Sat, Sun
- Месяц (3 буквы): Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
- Число (1-2 цифры)
- Год (4 цифры)
- Имя и email сборщика
- Версия-релиз через дефис
- Описание изменений с дефисом
Что документировать
Обязательно
-
Обновление версии upstream
- Update to version 2.0.0 -
Добавление/удаление патчей
- Add patch to fix memory leak (upstream#1234) - Drop obsolete build-fix patch (fixed upstream) -
Изменения в зависимостях
- Add BuildRequires: libfoo-devel - Remove obsolete Requires: old-package -
Исправления безопасности
- Security fix for CVE-2025-1234
По желанию
- Rebuild для новой версии библиотеки
- Исправления в SPEC-файле
- Изменения в подпакетах
Ссылки на баги
- Fix crash on ARM (rhbz#12345)
- Backport fix from upstream (upstream#678)
- Security fix for CVE-2025-1234
- Resolves: rhbz#12345
Используйте принятые в проекте сокращения:
rhbz#— Red Hat Bugzillabz#— общий Bugzillagh#— GitHub issueupstream#— баг в upstream
Правила ведения
Хронологический порядок
Новые записи — сверху:
%changelog
* Mon Feb 03 2025 ... ← Новая
* Fri Jan 15 2025 ...
* Wed Dec 20 2024 ... ← Старая
Одна запись на сборку
Не разбивайте одно обновление на несколько записей:
# Неправильно
* Mon Feb 03 2025 Ivan <ivan@example.com> - 2.0.0-1
- Update to 2.0.0
* Mon Feb 03 2025 Ivan <ivan@example.com> - 2.0.0-1
- Fix build
# Правильно
* Mon Feb 03 2025 Ivan <ivan@example.com> - 2.0.0-1
- Update to 2.0.0
- Fix build with GCC 14
Язык
Традиционно changelog ведётся на английском. Это позволяет:
- Читать его всем участникам
- Использовать стандартные инструменты анализа
Краткость
# Слишком подробно
- Fixed the bug where the application would crash when the user clicked
the button while the network connection was unstable and the cache
was being rebuilt in the background
# В самый раз
- Fix crash on button click during network instability (#1234)
Автоматизация
rpmdev-bumpspec
# Увеличить релиз и добавить запись
rpmdev-bumpspec -c "Rebuild for new libfoo" package.spec
# Увеличить версию
rpmdev-bumpspec -n 2.0.0 -c "Update to 2.0.0" package.spec
Настройка имени в ~/.rpmmacros
%packager Ivan Petrov <ivan@example.com>
Шаблон для редактора
Для Vim (~/.vim/ftplugin/spec.vim):
iabbrev clh * <C-R>=strftime("%a %b %d %Y")<CR> Your Name <your@email.com> -
Миграция из Git
Если проект ведётся в Git, можно генерировать changelog из коммитов:
# Простой вариант
git log --format="- %s" v1.0..v2.0
# С датами
git log --format="* %ad %an <%ae>%n- %s" --date=format:"%a %b %d %Y" v1.0..v2.0
Но обычно changelog SPEC и история Git — разные вещи. Changelog описывает изменения в упаковке, а не в коде.
Просмотр changelog
# Из SPEC-файла
rpmspec -q --changelog package.spec
# Из RPM-пакета
rpm -qp --changelog package.rpm
# Из установленного пакета
rpm -q --changelog package
# Последние 10 записей
rpm -q --changelog package | head -50
Типичные ошибки
Неправильный формат даты
# Неправильно
* 03.02.2025 Ivan <ivan@example.com> - 1.0-1
* February 3, 2025 Ivan <ivan@example.com> - 1.0-1
* Mon Feb 3 2025 Ivan <ivan@example.com> - 1.0-1 # нужно 03
# Правильно
* Mon Feb 03 2025 Ivan <ivan@example.com> - 1.0-1
Несоответствие версии
Version: 2.0.0
Release: 1%{?dist}
%changelog
* Mon Feb 03 2025 Ivan <ivan@example.com> - 1.9.0-1 # Ошибка!
Версия в changelog должна соответствовать текущей Version-Release.
Пропущенный email
# Неправильно
* Mon Feb 03 2025 Ivan Petrov - 1.0-1
# Правильно
* Mon Feb 03 2025 Ivan Petrov <ivan@example.com> - 1.0-1
Пустой changelog
%changelog
# Здесь должна быть хотя бы одна запись!
Шаблон новой записи
* DDD MMM DD YYYY Your Name <your@email.com> - VERSION-RELEASE
- Description of changes
Пример для копирования:
* Mon Feb 03 2025 Your Name <your@email.com> - 1.0.0-1
- Initial package
Проверьте понимание
- В каком порядке располагаются записи changelog?
- Какой формат даты используется в changelog?
- Что обязательно документировать в changelog?
- Как автоматически добавить запись в changelog?
- Должна ли версия в changelog соответствовать текущей версии пакета?
Следующий модуль: Сборочное окружение