Gear/cronbuild
Введение в cronbuild.
Некоторые пакеты по своей природе нуждаются в постоянном обновлении, при этом при обновлении у этих пакетов спек практически не меняется. Например, к таким пакетам относятся различные базы - антивирусные, оборудования (foomatic-db, PCI IDs, мониторов, ...), cliparts, и т. д. Как правило, в версии/релизе таких пакетов присутствует timestamp. Система cronbuild предназначена для автоматизации сборки таких пакетов.
Теперь майнтайнеру достаточно один раз настроить для пакета cronbuild и в дальнейшем при появлении обновлений пакет будет автоматически собираться в Сизиф до тех пор, пока сборка не сломается. Сервер cronbuild проверяет пакет на наличие обновлений с заданной майнтайнером периодичностью, по умолчанию это раз в неделю.
При этом пакеты собираются только тогда, когда это действительно нужно: если после обновления файлы исходников не изменились (согласно git diff <commit before update>), то сборка пакета будет пропущена, так как в ней нет необходимости.
Управлять сервисом Cronbuild просто: если нужно внести в пакет какие-то изменения, достаточно внести их локально и отправьть пакет на сборку вручную. При следующей попытке обновления робот склонирует уже измененный репозиторий, т.е. изменения будут подхвачены автоматически.
Быстрая настройка
1. Создать служебный файл .gear/cronbuild-options в gear-репозитории:
echo "cronbuild_mailto=<email мейнтейнера" > .gear/cronbuild-options
2. Закоммитить и собрать пакет с этим файлом
3. Завести багу в https://bugzilla.altlinux.org/enter_bug.cgi?product=Infrastructure на компонент cronbuild. В теме указать имя пакета.
Часто задаваемые вопросы
> Пока я вижу, что cronbuild все еще использует старую версию а не ту, что в моем git.
Да, так и должно быть. cronbuild клонирует последнюю _собранную_в_Сизиф_ сборку, в ваш git он не лезет и не должен, ведь там может быть нестабильная разработка.
Отправьте ваши изменения в Сизиф, тогда 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 необходимо
- либо добавить .gear/upstream/remotes и настроить обновления по git tag (см. Gear/remotes.). Рекомендовано для обновления из git репрзитория по тегу.
- либо добавить в репозиторий .watch файл (см. Watch). Рекомендовано для обновления из версионированного архива на удаленном сайте.
- либо написать скрипт .gear/cronbuild-update-source, в котором заскриптовать процесс обновления для нестандартных случаев.
обновление до новых версий с помошью файла .gear/upstream/remotes
Если в репозитории присутствует файл .gear/upstream/remotes, то при отсутствии скрипта .gear/cronbuild-update-source утилита gear-cronbuild-apply-hooks запустит утилиту gear-remotes-uscan (см. Gear/remotes.), Если репозиторий корректно настроен на работу с gear-remotes-*, то никаких скриптов для cronbuild создавать не нужно, достаточно .gear/upstream/remotes.
обновление до новых версий с помошью .watch файла
Если в репозитории присутствует .watch файл, то при отсутствии скрипта .gear/cronbuild-update-source утилита gear-cronbuild-apply-hooks запустит связку утилит rpm-uscan + gear-uupdate, см. Watch. Если .watch файл корректный, и стркутура репозитария поддерживается утилитой gear-uupdate, то никаких скриптов для cronbuild создавать не нужно, .watch файла достаточно.
локальные скрипты cronbuild для автоматизации обновления .git репозитрия
Скрипт .gear/cronbuild-update-source и необязательные скрипты-помощники.
Скрипт .gear/cronbuild-update-source пишется индивидуально для каждого пакета. Его задача -- обновить исходные тексты пакета, используя git-fetch, git-svn или просто wget.
Дополнительно могут понадобиться необязательные скрипты
- .gear/cronbuild-update-version для установки новой версии и/ли релиза вручную (без него новая версия будет выставлена в ГГГГММДД (ГодМесяцДень)
- .gear/cronbuild-add-changelog чтобы заменить стандартную фразу cronbuild в %changelog на свою.
Скрипты должны быть помечены как исполняемые. Все скрипты получают спек-файл как первый аргумент.
Внутренняя служебная утилита gear-cronbuild-apply-hooks запускает скрипт .gear/cronbuild-update-source. Если скрипт завершился с ошибкой, обновление останавливается и сообщение об ошибке получает майнтайнер. Если скрипт завершился без ошибок, утилита gear-cronbuild-apply-hooks выполняет
git diff $last_commit_before_the_run
Если в git репозитории изменений не произошло, то обновлений нет и работа gear-cronbuild завершается. Если git diff $last_commit_before_the_run показал изменения, то считается, что обновления есть и работа gear-cronbuild продолжается.
Заметим, что скрипт .gear/cronbuild-update-source не должен трогать спек. Для изменения версии в спек файле предусмотрен скрипт .gear/cronbuild-update-version.
пример скрипта для обновления через 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
замечания к скрипту
- Если версия не изменилась/исходники не обновлялись, если вы ничего не добавляли в индекс git, просто выходите через exit 0. Иначе перед выходом сначала сбросьте изменения в индексе git с помощью git reset.
- Удаляйте за собой мусор: временные файлы, каталоги и т.д.
- скрипт должен сообщать о всех проблемах при обновлении через exit с ненулевым exit_code. Проще всего использовать #!/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 для рассылки оповещений, отправить в сизиф сборку пакета с новым содержимым .gear/cronbuild-options, и зарегистрировать в bugzilla заявку на Infrastructure/cronbuild.
Важно! сервис cronbuild для работы клонирует последнюю успешную сборку пакета в Сизифе. Поэтому важно собрать в сизиф пакет с новыми настройками .gear/cronbuild-options. Изменения локально на рабочей машине майнтайнера, даже опубликованные на git.altlinux.org, без сборки пакета в Сизиф подхвачены не будут!
Как вносить изменения в сборку
сервер сборки поддерживает 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 получают спек-файл как первый аргумент.
Другие файлы, используемые утилитой gear-cronbuild-apply-hooks
файл | Описание |
---|---|
.gear/upstream/remotes | настройка remotes для клонированного git репозитория. Не обязателен. |
.gear/cronbuild-git-config | опции к команде git-config, для дополнительной настройки клонированного git репозитория. Устарел. |
Файлы, используемые сервером сборки cronbuild repocop.altlinux.org
файл | Описание |
---|---|
cronbuild-tagname | Скрипт для кастомизации git tag name. Не обязателен. |
cronbuild-tagmsg | Скрипт для кастомизации git tag message. Не обязателен. |
cronbuild-options | Конфигурационный файл. Требуется при размещении на сервере cronbuild. |
Скрипты должны быть помечены как исполняемые. К файлам конфигурации это не относится.
./gear/cronbuild-options
переменная | Описание |
---|---|
cronbuild_requires | набор дополнительных пакетов, который будет передан в hsh-install для установки в chroot.
необходим, если скрипты используют утилиты, не входящие в базовый набор (curl, wget, git, unzip, ...) |
cronbuild_interval | периодичность сборок в днях. Желательно. По умолчанию — 3 дня. |
cronbuild_mailto | e-mail ответственного. Обязательно. |
cronbuild_cc | список дополнительных e-mail через запятую. Не обязательно. (Передается в mutt опцией: -c "$cronbuild_cc") |
cronbuild_mastergit | experimental |
cronbuild_masterbranch | experimental |
Пример использования .gear/cronbuild-*
Примечания
- ↑ Для работы механизм обновления секции changelog нужно определить значение %packager в
~/.rpmmacros
.
Разработано при поддержке Фонда содействия развитию МП НТС в рамках НИОКР 01201066526 |