Gear/cronbuild

Материал из ALT Linux Wiki

Введение в cronbuild.

Некоторые пакеты по своей природе нуждаются в постоянном обновлении, при этом при обновлении у этих пакетов спек практически не меняется. Например, к таким пакетам относятся различные базы - антивирусные, оборудования (foomatic-db, PCI IDs, мониторов, ...), cliparts, и т. д. Как правило, в версии/релизе таких пакетов присутствует timestamp. Система cronbuild предназначена для автоматизации сборки таких пакетов.

Теперь майнтайнеру достаточно один раз настроить для пакета cronbuild и в дальнейшем при появлении обновлений пакет будет автоматически собираться в Сизиф до тех пор, пока сборка не сломается. Сервер cronbuild проверяет пакет на наличие обновлений с заданной майнтайнером периодичностью, по умолчанию это раз в неделю.

При этом пакеты собираются только тогда, когда это действительно нужно: если после обновления файлы исходников не изменились (согласно git diff <commit before update>), то сборка пакета будет пропущена, так как в ней нет необходимости.

Управлять сервисом Cronbuild просто: если нужно внести в пакет какие-то изменения, достаточно внести их локально и отправьть пакет на сборку вручную. При следующей попытке обновления робот склонирует уже измененный репозиторий, т.е. изменения будут подхвачены автоматически.

Настройка cronbuild.

cronbuild состоит из 3-х частей:

  • локальные скрипты cronbuild для автоматизации обновления .git репозитрия.
  • утилиты для локальной сборки (пакет gear-cronbuild)
  • сервер удаленной сборки (cronbuild repocop.altlinux.org)

Для того, чтобы воспользоваться cronbuild, надо написать по примерам скрипт .gear/cronbuild-update-source и, возможно, другие скрипты, проверить их работоспособность с помощью локальных утилит и закоммитить их в .git.

После этого gear-cronbuild можно пользоваться локально, для ускорения работы, а также можно разместить на сервере удаленной сборки.

утилиты для локальной сборки (пакет gear-cronbuild)

Для того, чтобы пользоваться скриптами cronbuild на локальной машине, необходимо установить пакет gear-cronbuild. Команда gear-cronbuild-apply-hooks вызывает локальные скрипты cronbuild и обновляет git репозиторий до следующей версии. Для удобства пользователя есть скрипт-обертка gear-cronbuild, который обновляет репозиторий, собирает пакет, и в случае успеха, коммитит изменения.

скрипт-обертка gear-cronbuild:

#!/bin/sh -ve
gear-cronbuild-apply-hooks
gear "$@"
gear-commit

локальные скрипты cronbuild для автоматизации обновления .git репозитрия

Для работы cronbuild необходимо добавить в репозиторий .watch файл (см. Watch.) либо написать скрипт .gear/cronbuild-update-source. Этот скрипт пишется индивидуально для каждого пакета. Его задача -- обновить исходные тексты пакета, используя git-fetch, git-svn или просто wget.

пример скрипта для обновления через wget

Этот скрипт работает в случае, когда исходники публикуются в виде тарбола, а в git репозитарии хранятся в распакованном виде в поддиректории $PKGNAME.

.gear/cronbuild-update-source:

#!/bin/sh -ve
PKGNAME="$(gear --command sh -- -c 'printf %s "$gear_pkg_name"')"
rm -f $PKGNAME-SNAPSHOT.tar.gz
wget -c http://www.pkgname.org/download/pkgname/pkgname-SNAPSHOT.tar.gz
tar xzf $PKGNAME-SNAPSHOT.tar.gz
rm -f $PKGNAME-SNAPSHOT.tar.gz
git rm -r -f $PKGNAME
rm -rf $PKGNAME
mv $PKGNAME-SNAPSHOT $PKGNAME
git add $PKGNAME

обновление до новых версий с помошью .watch файла

Если в репозитории присутствует .watch файл, то при отсутствии скрипта .gear/cronbuild-update-source утилита gear-cronbuild-apply-hooks запустит связку утилит rpm-uscan + gear-uupdate, см. Watch. Если .watch файл корректный, и стркутура репозитария поддерживается утилитой gear-uupdate, то никаких скриптов для cronbuild создавать не нужно, .watch файла достаточно.

замечания к скрипту

  • скрипт должен сообщать о всех проблемах при обновлении. Проще всего использовать #!/bin/sh -ve,

иначе придется у каждой команды проверять код завершения.

  • изменения должны быть добавлены в индекс git.
  • не нужно коммитить изменения: git-cronbuild это сделает автоматически после успешной сборки.

Изменение версии/релиза пакета

Утилита gear-cronbuild-update-spec-timestamp автоматически ищет и обновляет timestamp вида ГГГГММДД в тегах Serial, Epoch, Version, Release, либо в декларациях %define <macrosname> <timestamp>. Если пакет использует другую систему нумерации, необходимо создать свой скрипт изменения версии/релиза пакета .gear/cronbuild-update-version. Также можно переопределить стандартный changelog скриптом .gear/cronbuild-add-changelog. В теле этого скрипта должна быть вызвана команда add_changelog с желаемым текстом[1].

сервер удаленной сборки (cronbuild repocop.altlinux.org)

локальные утилиты gear-cronbuild имеют тот недостаток, что их надо не забывать запускать. Кроме того, они не автоматизируют отправку пакета в Сизиф.

Сервер удаленной сборки cronbuild в песочнице repocop.altlinux.org позволяет автоматизировать сборку пакетов полностью.

Как поставить пакет на сборку

Если пакет успешно собирается с помощью gear-cronbuild локально, пришло время поставить его на автоматическую сборку.

Для этого необходимо создать файл .gear/cronbuild-options, указать там желаемую периодичность сборки и e-mail для рассылки оповещений, и зарегистрировать в bugzilla заявку на Infrastructure/cronbuild (пока это не реализовано, можно на пакет gear-cronbuild).

Как вносить изменения в сборку

сервер сборки поддерживает 2 системы транспорта: сборка по тегу из git+gear репозитория и сборка из srpm.

  • Сборка по тегу из git+gear репозитория.

Управление сборкой устроенно очень просто: сервер клонирует последнюю успешную сборку в Сизиф и применяет к ней gear-cronbuild. Поэтому, если вы хотите починить или улучшить автоматическую сборку, просто соберите пакет вручную, и в дальнейшем автоматическая сборка будет идти на ее основе.

  • сборка из srpm.

считается экспериментальной.

Приложения.

Полный список служебных файлов cronbuild в .gear/

Скрипты, используемые утилитой gear-cronbuild-apply-hooks

файл Описание
cronbuild-update-source Основной скрипт для обновления содержимого пакета.
cronbuild-update-version Скрипт для обновления версии и/ли релиза пакета. Не обязателен.
cronbuild-add-changelog Скрипт для кастомизации changelog. Не обязателен.

Скрипты должны быть помечены как исполняемые.

Скрипты cronbuild-update-source, cronbuild-update-version, cronbuild-add-changelog получают спек-файл как первый аргумент.

Файлы, используемые сервером сборки cronbuild repocop.altlinux.org

файл Описание
cronbuild-tagname Скрипт для кастомизации git tag name. Не обязателен.
cronbuild-tagmsg Скрипт для кастомизации git tag message. Не обязателен.
cronbuild-options Конфигурационный файл. Требуется при размещении на сервере cronbuild.

Скрипты должны быть помечены как исполняемые. К файлам конфигурации это не относится.

cronbuild-options

переменная Описание
cronbuild_requires набор дополнительных пакетов, который будет передан в hsh-install для установки в chroot.

необходим, если скрипты используют утилиты, не входящие в базовый набор (curl, wget, git, unzip, ...)

cronbuild_interval периодичность сборок в днях. желательно.
cronbuild_mailto e-mail ответственного. обязательно.
cronbuild_cc список дополнительных e-mail (optional)
cronbuild_mastergit experimental
cronbuild_masterbranch experimental

Пример использования .gear/cronbuild-*

Примечания

  1. Для работы механизм обновления секции changelog нужно определить значение %packager в ~/.rpmmacros.