Gear/cronbuild: различия между версиями

Материал из ALT Linux Wiki
(не показана 21 промежуточная версия 4 участников)
Строка 1: Строка 1:
{{Category navigation|title=gear|category=gear|sortkey={{SUBPAGENAME}}}}
<!-- {{stub}} -->
<!-- {{stub}} -->


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


При этом пакеты собираются только тогда, когда это действительно нужно:
При этом пакеты собираются только тогда, когда это действительно нужно:
Строка 18: Строка 19:
то сборка пакета будет пропущена, так как в ней нет необходимости.
то сборка пакета будет пропущена, так как в ней нет необходимости.


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


== Настройка cronbuild. ==
1. Создать служебный файл {{path|.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 состоит из 3-х частей:


Строка 33: Строка 51:


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


=== утилиты для локальной сборки (пакет {{pkg|gear-cronbuild}}) ===
=== утилиты для локальной сборки (пакет {{pkg|gear-cronbuild}}) ===
Строка 51: Строка 69:
=== локальные скрипты cronbuild для автоматизации обновления .git репозитрия ===
=== локальные скрипты cronbuild для автоматизации обновления .git репозитрия ===


Сердцем cronbuild является скрипт {{cmd|.gear/cronbuild-update-source}}.
Для работы cronbuild необходимо либо добавить .gear/upstream/remotes и настроить обновления по git tag (см. [[Gear/remotes]].),
либо добавить в репозиторий .watch файл (см. [[Watch]].),
либо написать скрипт {{cmd|.gear/cronbuild-update-source}}.
Этот скрипт пишется индивидуально для каждого пакета. Его задача --
Этот скрипт пишется индивидуально для каждого пакета. Его задача --
обновить исходные тексты пакета, используя {{cmd|git-fetch}}, {{cmd|git-svn}}
обновить исходные тексты пакета, используя {{cmd|git-fetch}}, {{cmd|git-svn}}
Строка 73: Строка 93:
git add $PKGNAME
git add $PKGNAME
</source>
</source>
==== пример скрипта для обновления при выходе новых версий с помошью .watch файла ====
==== обновление до новых версий с помошью .watch файла ====


Этот скрипт работает в случае, когда исходники публикуются в виде тарбола,
Если в репозитории присутствует .watch файл, то при отсутствии скрипта {{cmd|.gear/cronbuild-update-source}}
а в git репозитарии хранятся в распакованном виде в поддиректории {{term|$PKGNAME}}.
утилита {{prg|gear-cronbuild-apply-hooks}} запустит связку утилит rpm-uscan + [[Gear/gear-uupdate|gear-uupdate]], см. [[Watch]].
выход новых версий проверяется с помощью .watch файла.
Если .watch файл корректный, и стркутура репозитария поддерживается утилитой gear-uupdate,
 
то никаких скриптов для cronbuild создавать не нужно, .watch файла достаточно.
{{cmd|.gear/cronbuild-update-source}}:
<source lang="bash">
#!/bin/sh -ve
PKGNAME="$(gear --command sh -- -c 'printf %s "$gear_pkg_name"')"
url=`uscan -f $PKGNAME.watch`
file=`basename "$url"`
version=${file##$PKGNAME-}
version=${version%%\.tar.*}
echo $file $version
gear_pkg_version="$(gear --command sh -- -c 'printf %s "$gear_pkg_version"')"
[ "x$version" = "x$gear_pkg_version" ] && exit 0;
rm -f $PKGNAME-*.tar.*
wget -c $url
tar xf $file
rm -f $file
git rm -r -f $PKGNAME
rm -rf $PKGNAME
mv $PKGNAME-*/ $PKGNAME
git add $PKGNAME
gear_specfile="$(gear --command sh -- -c 'printf %s "$gear_specfile"')"
sed -i "s|^\(Version:).*|\1 $version|" $gear_specfile
</source>
Заметим, что в скрипте также обновлялась версия,
поэтому нужно создать пустой исполняемый файл
{{cmd|.gear/cronbuild-update-version}}
<source lang="bash">
#!/bin/sh -ve
</source>
чтобы переопределить стандартный метод.


==== замечания к скрипту ====
==== замечания к скрипту ====
* скрипт должен сообщать о всех проблемах при обновлении. Проще всего использовать {{path|#!/bin/sh -ve}},
* Если версия не изменилась/исходники не обновлялись, если вы ничего не добавляли в индекс git, просто выходите через exit 0. Иначе перед выходом сначала сбросьте изменения в индексе git с помощью {{cmd|git reset}}.
* Удаляйте за собой мусор: временные файлы, каталоги и т.д.
* скрипт должен сообщать о всех проблемах при обновлении через exit с ненулевым exit_code. Проще всего использовать {{path|#!/bin/sh -ve}},
иначе придется у каждой команды проверять код завершения.
иначе придется у каждой команды проверять код завершения.
* изменения должны быть добавлены в индекс git.  
* изменения должны быть добавлены в индекс git.  
Строка 126: Строка 119:
{{path|.gear/cronbuild-add-changelog}}.
{{path|.gear/cronbuild-add-changelog}}.
В теле этого скрипта должна быть вызвана команда {{cmd|add_changelog}}
В теле этого скрипта должна быть вызвана команда {{cmd|add_changelog}}
с желаемым текстом<ref>К сожалению, без предварительной настройки макросов RPM механизм обновления секции changelog не работает. Решить эту маленькую проблему можно определив значение %packager в <code>~/.rpmmacros</code>.</ref>.
с желаемым текстом<ref>Для работы механизм обновления секции changelog нужно определить значение %packager в <code>~/.rpmmacros</code>.</ref>.


=== сервер удаленной сборки (cronbuild repocop.altlinux.org) ===
=== сервер удаленной сборки (cronbuild repocop.altlinux.org) ===
Строка 143: Строка 136:
Для этого необходимо создать файл {{path|.gear/cronbuild-options}},
Для этого необходимо создать файл {{path|.gear/cronbuild-options}},
указать там желаемую периодичность сборки и e-mail для рассылки оповещений,
указать там желаемую периодичность сборки и e-mail для рассылки оповещений,
и зарегистрировать в bugzilla заявку на Infrastructure/cronbuild
и зарегистрировать в bugzilla заявку на Infrastructure/cronbuild.
(пока это не реализовано, можно на пакет gear-cronbuild).


==== Как вносить изменения в сборку ====
==== Как вносить изменения в сборку ====
Строка 165: Строка 157:
== Приложения. ==
== Приложения. ==
=== Полный список служебных файлов cronbuild в {{path|.gear/}} ===
=== Полный список служебных файлов cronbuild в {{path|.gear/}} ===
==== Скрипты, используемые утилитой {{prg|gear-cronbuild-apply-hooks}} ====
{| class="standard"
{| class="standard"
!файл
!файл
Строка 177: Строка 172:
|class="shadow"|cronbuild-add-changelog
|class="shadow"|cronbuild-add-changelog
| Скрипт для кастомизации changelog. Не обязателен.
| Скрипт для кастомизации changelog. Не обязателен.
|}
Скрипты должны быть помечены как исполняемые.
Скрипты cronbuild-update-source, cronbuild-update-version, cronbuild-add-changelog получают спек-файл как первый аргумент.
==== Другие файлы, используемые утилитой {{prg|gear-cronbuild-apply-hooks}} ====
{| class="standard"
!файл
!Описание
|-
|class="shadow"|.gear/upstream/remotes
|настройка [[Gear/remotes|remotes]] для клонированного git репозитория. Не обязателен.
|-
|class="shadow"|.gear/cronbuild-git-config
|опции к команде git-config, для дополнительной настройки клонированного git репозитория. Устарел.
|}
==== Файлы, используемые сервером сборки cronbuild repocop.altlinux.org ====
{| class="standard"
!файл
!Описание
|-
|-
|class="shadow"|cronbuild-tagname
|class="shadow"|cronbuild-tagname
| Скрипт для кастомизации git tag name. Для сервера сборки. Не обязателен.
| Скрипт для кастомизации git tag name. Не обязателен.
|-
|-
|class="shadow"|cronbuild-tagmsg
|class="shadow"|cronbuild-tagmsg
| Скрипт для кастомизации git tag message. Для сервера сборки. Не обязателен.
| Скрипт для кастомизации git tag message. Не обязателен.
|-
|-
|class="shadow"|cronbuild-options
|class="shadow"|cronbuild-options
| Конфигурационный файл. Для сервера сборки.
| Конфигурационный файл. Требуется при размещении на сервере cronbuild.
|}
|}
Скрипты должны быть помечены как исполняемые.
Скрипты должны быть помечены как исполняемые.
К файлам конфигурации это не относится.
К файлам конфигурации это не относится.
Скрипты cronbuild-update-source, cronbuild-update-version, cronbuild-add-changelog получают спек-файл как первый аргумент.


=== cronbuild-options ===
=== cronbuild-options ===
Строка 202: Строка 218:
|-
|-
|class="shadow"|cronbuild_interval
|class="shadow"|cronbuild_interval
|периодичность сборок в днях. желательно.
|периодичность сборок в днях. Желательно. По умолчанию — 3 дня.
|-
|-
|class="shadow"|cronbuild_mailto
|class="shadow"|'''cronbuild_mailto'''
|e-mail ответственного. обязательно.
|'''e-mail ответственного. Обязательно.'''
|-
|-
|class="shadow"|cronbuild_cc
|class="shadow"|cronbuild_cc
Строка 221: Строка 237:
== Примечания ==
== Примечания ==
<references />
<references />
{| class="wide"
| Разработано при поддержке [http://www.fasie.ru/ Фонда содействия развитию МП НТС] в рамках НИОКР 01201066526
| [[Изображение:Logo_FASIE_preview.jpg|200px|rigft]]
|}
{{Category navigation|title=gear|category=gear|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Автоматизация работы с пакетами|category=Packaging Automation}}
[[Категория:Справочники]]

Версия от 10:51, 21 мая 2018


Введение в 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.), либо добавить в репозиторий .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 файла достаточно.

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

  • Если версия не изменилась/исходники не обновлялись, если вы ничего не добавляли в индекс 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 для рассылки оповещений, и зарегистрировать в bugzilla заявку на Infrastructure/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 получают спек-файл как первый аргумент.

Другие файлы, используемые утилитой 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.

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

cronbuild-options

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

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

cronbuild_interval периодичность сборок в днях. Желательно. По умолчанию — 3 дня.
cronbuild_mailto e-mail ответственного. Обязательно.
cronbuild_cc список дополнительных e-mail (optional)
cronbuild_mastergit experimental
cronbuild_masterbranch experimental

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

Примечания

  1. Для работы механизм обновления секции changelog нужно определить значение %packager в ~/.rpmmacros.
Разработано при поддержке Фонда содействия развитию МП НТС в рамках НИОКР 01201066526 rigft