Перейти к содержанию
zoryn/ maintainer-assistant

zoryn task

Управление задачами. Команды task show и task ls по умолчанию используют Tasks API для быстрого ответа, с fallback на SSH, если API недоступен. Текущий пользователь определяется из [tasks] user в ~/.zoryn или из email %packager в ~/.rpmmacros (rider@altlinux.orgrider).

zoryn task new

Создать новое задание в двоичном репозитории. Обёртка над ssh gyle task new.

zoryn task new [<REPO>]

Если <REPO> не задан, используется sisyphus — как и у ssh gyle task new. Выводит ID нового задания при успехе.

zoryn task new
zoryn task new p11

zoryn task show

Показать детали задачи сборки.

zoryn task show [--brief] [--json] [TASK_ID] [-d]

Режимы вывода:

  • по умолчанию — gyle-подобный key=value формат с раскрашенными state, repo, owner.
  • --brief — компактный вывод сабтасков (package.git=tag).
  • --json — раскрашенный JSON (jq-стиль).

Без TASK_ID показывает последнюю задачу, с которой вы работали (см. task run), с откатом к последней задаче по версии gyle.

zoryn task show 409684              # детали задачи
zoryn task show --brief 409684      # кратко
zoryn task show --json 409684       # JSON
zoryn task show                     # последняя задача

zoryn task ls

Список задач сборки с цветным state.

zoryn task ls [-B repo] [--state STATE] [-p pkg] [--user NAME] [-a|--all]
              [--test-only] [--needs-approval ROLE] [-d]

Показывает задачи пользователя из gyle. Фильтры по репозиторию, state, пакету, пользователю, test-only.

  • -B <repo> / --repo <repo> — через запятую (sisyphus, p11,p10).
  • --state <STATE> — через запятую. Значения: NEW, AWAITING, BUILDING, COMMITTING, PENDING, TESTED, EPERM, FAILING, FAILED, POSTPONED, SWEPT, DONE.
  • -p <pkg> — фильтр по имени пакета.
  • --user <NAME> — задачи пользователя (по умолчанию: текущий; ALL — все пользователи).
  • -a / --all — alias для --user ALL.
  • --test-only — только тестовые задачи.
  • --needs-approval <ROLE> — задачи, требующие approve от maint или tester.
zoryn task ls                          # все задачи
zoryn task ls -B p11                   # только p11
zoryn task ls -B sisyphus,p11          # p11 и sisyphus
zoryn task ls --state FAILED           # упавшие
zoryn task ls --state FAILED,EPERM     # FAILED и EPERM
zoryn task ls -p php                   # задачи с пакетом php
zoryn task ls --user zerg              # задачи пользователя zerg
zoryn task ls --all                    # всех пользователей
zoryn task ls --test-only              # только test-only
zoryn task ls --needs-approval maint   # нужен approve maintainer'а
zoryn task ls --needs-approval tester  # нужен approve тестировщика

zoryn task download

Скачать собранные RPM из задачи в локальный репозиторий hasher.

zoryn task download <package|task_id> [-B repo] [--arch arch] [-o dir] [-d]

Скачивает все собранные бинарные RPM. Аргумент — имя пакета или ID задачи. Если аргумент — число, используется как task ID; иначе ищет задачу с указанным пакетом.

По умолчанию путь назначения определяется из hsh --printenv. -o задаёт свой каталог (будет создан).

  • -B, --branch <repo> — целевой репозиторий (по умолчанию: sisyphus, игнорируется при указании task ID).
  • --arch <arch> — архитектура (по умолчанию: из hsh --printenv, или x86_64 с -o).
  • -o, --output <dir> — выходной каталог (по умолчанию: репозиторий hasher).
zoryn task download 404784              # по task ID
zoryn task download ffmpeg              # из задачи sisyphus
zoryn task download 404784 -o /tmp/rpms # в свой каталог
zoryn task download libva -B p11        # из задачи p11
zoryn task download ffmpeg --arch i586  # i586 RPM

zoryn task gitclone

Клонирует git-репозитории всех подзаданий задачи в текущий каталог.

zoryn task gitclone <task_id> [-d]

Клонирует репозиторий каждого подзадания в отдельный каталог (с именем пакета), на тот самый коммит, который собирался в задаче. Репозитории берутся из собственных gears задачи по протоколу git://, а не из общего репозитория gears — так вы получаете ровно то, что собиралось в задаче.

Подзадания типа delete (клонировать нечего) и srpm (собрано из загруженного src.rpm, git-репозитория нет) пропускаются. Задачи в состоянии DONE, перенесённые в архив, разрешаются автоматически.

zoryn task gitclone 419673   # клонировать все подзадания gear/copy/rebuild

zoryn task mkrepo

Экспериментальная

Команда активно дорабатывается и может измениться.

Собрать локальный объединённый apt-rpm-репозиторий, наложив бинарные RPM из задачи поверх зеркала базовой ветки. Это позволяет протестировать задачу на полном срезе репозитория (например, через task test-rebuild).

zoryn task mkrepo <task_id> [--builder NAME] [--arch ARCH] [--workdir DIR] [--force] [--clean]
zoryn task mkrepo 404784                       # собрать объединённый репозиторий
zoryn task mkrepo 404784 --builder p11          # использовать конкретный сборщик
zoryn task mkrepo 404784 --arch i586            # переопределить архитектуру сборщика
zoryn task mkrepo 404784 --clean                # удалить собранный репозиторий и выйти

Сначала команда определяет целевую ветку задачи (из task show) и резолвит сборщиков, используя эту ветку как ветку выбора, — той же логикой resolve_all_builders, что и task test-rebuild. Какую ветку собирать, решает задача, а не список сборщиков. Без --builder берутся сконфигурированные сборщики этой ветки; @all и шаблоны сужаются до ветки задачи, а не берётся первый попавшийся. Из выбранных сборщиков читаются параметры repo (apt-URL базового зеркала), arch и repo_workdir (корневой каталог для собираемых репозиториев). RPM из задачи скачиваются и накладываются поверх базового зеркала, после чего индексируются. Вместо повторного запуска genbasedir по всему компоненту (который читает каждый RPM базы) индекс строится склейкой pkglist-ов: готовый base/pkglist.classic базового зеркала берётся как есть, заголовки заменённых пакетов удаляются, а заголовки из опубликованного задачей pkglist.task вставляются (с переписыванием каталога на RPMS.classic). Читаются только пакеты задачи, поэтому индексация почти мгновенна независимо от размера ветки. При успехе печатается путь file://…/repo к собранному репозиторию, а затем готовые строки для sources.list:

rpm file://<workdir>/<task_id>/repo <arch> classic
rpm file://<workdir>/<task_id>/repo noarch classic

Опции:

  • -b, --builder <name|pattern> — сборщик(и), из которых берутся repo / arch / repo_workdir (по умолчанию: сборщик по умолчанию). Принимает имя, список через запятую, @all или @host:<host>. Резолвинг использует ветку задачи как ветку выбора (см. выше), поэтому @all или много сборщиков передавать безопасно — шаблоны сужаются до ветки задачи, а не берётся первый попавшийся. Сборщики на одном хосте (одинаковый user@host, отличаются только архитектурой) объединяются в один многоархитектурный репозиторий (repo/<arch>/ на каждый сборщик + общий repo/noarch/); сборщики на разных хостах получают отдельный репозиторий каждый, разнесённый по подкаталогу хоста внутри workdir. --arch нельзя сочетать с несколькими сборщиками.
  • --arch <arch> — переопределить архитектуру сборщика. Должна быть известной бинарной архитектурой; noarch отклоняется (этот компонент создаётся отдельно автоматически).
  • --workdir <dir> — переопределить рабочий каталог репозиториев.
  • --force — удалить ранее собранный для задачи репозиторий перед сборкой (чистая пересборка). Вместе с --clean также снимает проверку происхождения, описанную ниже, — так убирается каталог задачи, который до собранного репозитория так и не дожил.
  • --compressed — писать сжатый индекс pkglist.classic.xz вместо разжатого pkglist.classic (по умолчанию). Пишется только один (apt читает любой); по умолчанию пропускается шаг xz и apt читает индекс напрямую.
  • --clean — удалить собранный для задачи репозиторий и выйти. Ветку задачи команда узнаёт и здесь — по ней сужается набор подходящих сборщиков, — но неудачный запрос теперь только предупреждение, а не ошибка: недоступный girar или уже удалённая оттуда задача не должны оставлять workdir неочищаемым ровно на том хосте, который он и заполняет. Тогда удаление идёт по всем сборщикам, подходящим под -b; без -b это список default из секции [builders], а если ключ не задан — один сборщик по умолчанию. Репозиторий при этом адресуется только номером задачи.

    Такая несужённая выборка может охватить не то число хостов, что было при сборке, поэтому удаление без ветки проверяет на каждом хосте оба варианта пути — <workdir>/<task_id> и <workdir>/<host>/<task_id>, — а не угадывает, какой из них использовала сборка. Оба при этом остаются догадкой, поэтому оба обязаны доказать своё происхождение: удаляется только тот каталог задачи, внутри которого действительно лежит собранный репозиторий (repo, либо rpms, если прогон умер до индексации). Workdir сплошь и рядом — обычный домашний каталог, где чей-то 2024 выглядит ровно как номер задачи, и одного имени для rm -rf там мало. Каталог, не прошедший проверку, остаётся на месте, о чём выводится предупреждение; снести его всё-таки можно — проверку снимает --clean --force. Вариант пути, который ветка всё-таки дала, адресуется напрямую и в доказательстве тоже не нуждается: --force обязан уметь снести недописанный каталог задачи.

    Обход не прерывается ни при каких условиях. Каждый подходящий хост обрабатывается, даже если на предыдущем удаление не удалось и даже если у предыдущего вообще не настроен workdir: несужённая выборка втягивает хосты, на которых репозитория задачи никогда не было, и ненастроенный или недоступный хост не должен останавливать уборку раньше тех, где репозиторий действительно лежит. Каждый сбой сообщается по ходу дела и отражается в коде возврата.

Создаётся следующая структура:

<workdir>/<task_id>/
  rpms/<arch>/                 скачанные RPM из задачи
  repo/<arch>/RPMS.classic/    симлинки: база ∪ задача
  repo/<arch>/base/            apt-индекс (pkglist.classic, или .xz при --compressed)
  repo/noarch/RPMS.classic/
  repo/noarch/base/
  aptconf/                     готовые apt.conf + sources.list + priorities

В aptconf/ кладётся готовый apt-конфиг (стандартный для ветки шаблон apt.conf/priorities плюс sources.list на собранный репозиторий) — срез можно сразу скормить hasher/apt. Файлы release идентифицируют срез: Suite/Label — это ветка (например p11), а Description<ветка> (<задание ветки> plus task <task_id>) (например p11 (416369 plus task 418566)); MD5Sum/BLAKE2b пересчитаны по склеенным индексам.

Параметр repo сборщика должен указывать на зеркало file://, локальное для машины, где идёт сборка

  • Локальный сборщик → всё (скачивание, симлинки, индексация) выполняется на этой машине; repo должен быть локальным зеркалом здесь.
  • Удалённый сборщик (type = remote) → сборка идёт на удалённом хосте по SSH: RPM таска качаются там, удалённое базовое зеркало симлинкуется. Склеенный индекс строится локально (читая удалённый base/pkglist.classic по SSH) и копируется обратно в каталог base/ на удалённом хосте. Готовый репозиторий лежит в repo_workdir на удалённом хосте. На удалённом хосте нужен curl и локальная копия базового зеркала.

Зеркало file:// — базовое зеркало подключается в собираемый репозиторий через симлинки, поэтому удалённый URL в качестве основы для наложения использовать нельзя.

Изменения пакетов берутся из авторитетного plan/bin.list.diff задания: каждая строка + добавляется, - — удаляется (так отражаются добавления, замены версий и удаления — задание только с удалениями или только с noarch тоже обрабатывается). Каждый компонент (целевая архитектура и noarch) — это набор симлинков на пакеты базы за вычетом удалённых плюс добавленные RPM задачи; его индекс в base/ склеивается из pkglist базового зеркала и pkglist задачи. Если plan/bin.list.diff недоступен (например, очень старое задание), команда прерывается. Повторный запуск для той же задачи пересобирает набор симлинков заново.

Накладывается только компонент classic; базовые зеркала с дополнительными компонентами (например, gostcrypto) пока не включаются в срез.

Рабочий каталог определяется в следующем порядке: флаг --workdir, параметр сборщика repo_workdir, затем глобальный [builders] repo_workdir. Описание этих ключей см. в разделе конфигурация.

Требуются утилиты xz и b2sum (стандартные xz/coreutils) — genbasedir больше не нужен. Удалённому сборщику дополнительно нужны xz и curl на хосте.

zoryn task add

Добавить сабтаск в задачу. Совместимо с ssh gyle task add.

zoryn task add [--before SUBTASK_ID] [--replace] [--dependent-on PKG [--abi-break] [--dry-run]] [<task_id>[^<subtask>|/<subtask>]] <action> ...

Если <task_id> опущен, используется последняя задача, с которой вы работали (см. task run) — удобно сразу после task new: zoryn task add copy ocaml-tiny_httpd sisyphus. Успешный task add также обновляет запомненную задачу.

<task_id> также принимает список через запятую (123456,123457) по аналогии с submit -B repo1,repo2: одно и то же действие добавляется в каждую задачу по порядку, с остановкой на первой ошибке (более поздние задачи могут зависеть от более ранних, например sisyphus перед p11). Суффикс ^<subtask>//<subtask> нельзя сочетать со списком — непонятно, к какой из задач он относится.

Аргумент task_id принимает два опциональных суффикса (взаимно исключают --before / --replace, а также список через запятую):

  • ^<subtask> — алиас для --before (позиция вставки).
  • /<subtask> — имплицитный --replace, нацеленный именно на этот сабтаск (обход auto-find по имени пакета; полезно когда несколько сабтасков ссылаются на один пакет).

<subtask> — числовой номер сабтаска либо полная метка pkg.git=tag, которую печатает task show: тэг делает ссылку однозначной, когда несколько сабтасков собирают один git-репозиторий, поэтому голое имя пакета не принимается. Tab-completion после ^ и / предлагает обе формы.

Действия:

  • repo <repo> <tag> — добавить gear-сабтаск.
  • <repo>.git=<tag> — короткий вариант repo (для copy-paste из task ls).
  • del <pkg>... — пометить пакеты на удаление.
  • rebuild <pkg>... — пересобрать пакеты из репозитория.
  • copy <pkg> [<from_repo>] — скопировать предсобранные бинарники.

Опции:

  • --before SUBTASK_ID — вставить новый сабтаск перед сабтаском с указанным идентификатором. Эквивалентно позиционному синтаксису <task_id>^<subtask_id>.
  • --replace — заменить существующий сабтаск с тем же пакетом. Целевой сабтаск определяется по имени пакета из action (сопоставление идёт и по имени SRPM-пакета, и по имени gear-репозитория). Падает с ошибкой, если ни один сабтаск не найден или найдено больше одного; во втором случае удалите ненужный сабтаск вручную (zoryn task delete <task_id> <subtask_id>) и повторите команду без --replace. Нельзя комбинировать с del/rebuild для нескольких пакетов. При совместном использовании с --before новый сабтаск вставляется на указанную пользователем позицию; если --before указывает на заменяемый сабтаск, вместо него используется следующий сабтаск, чтобы сохранить исходную позицию.
  • --dependent-on PKG — вычислить набор для пересборки из графа зависимостей репозитория, а не перечислять пакеты руками. zoryn берёт source-пакеты, чьи бинарники зависят от PKG в рантайме (RDB what_depends_src с dptype=binary), и оставляет только прибитых к точной версии PKG (пин = на EVR) — то есть реально протухающих при его обновлении. Канонический случай — модули ядра: --dependent-on kernel-image-6.18 выбирает все kernel-modules-*-6.18, а soname-потребители и пакеты, зовущие утилиты PKG через безверсионную зависимость (digikam с libMagickCore, скрипты с convert), пропускаются и перечисляются отдельно. Можно указать и бинарный подпакет — он резолвится в свой source (--dependent-on libImageMagick7.10 сработает). Используется с action rebuild без аргументов-пакетов (слово rebuild можно опустить); несовместим с --replace/--before. Ветка берётся из самого задания (через gyle, так что частные инстансы girar работают); RDB даёт только граф зависимостей. Потребители библиотек пинуются set-версиями по soname (libX.so.N()(64bit) >= set:…) и ломаются только при смене ABI — если обновление заведомо ломает ABI, используйте --abi-break ниже; постфактум слом также проявляется как unmets и закрывается girar-вербом task add rebuild-unmets.
  • --abi-break — вместе с --dependent-on: считать, что обновление PKG ломает ABI (soname bump), и добавить на пересборку всех прямых рантайм-зависимых, а не только прибитых к точному EVR. Подзадания добавляются в топологическом порядке сборки, и внутри задания каждый потребитель собирается уже против новой библиотеки из предыдущего подзадания.
  • --dry-run — вместе с --dependent-on: показать вычисленный набор и пропущенных зависимых, ничего не добавляя.
zoryn task add 123456 repo php-sphinx.git 8.2.30-alt1
zoryn task add 123456 php-sphinx.git=8.2.30-alt1
zoryn task add 123456 del php-sphinx php-foo
zoryn task add 123456 rebuild php-sphinx
zoryn task add 123456 copy php-sphinx p10
zoryn task add --before 100 123456 repo dune.git 3.17.2-alt1
zoryn task add 123456^100 repo dune.git 3.17.2-alt1
zoryn task add 123456^dune.git=3.17.1-alt1 repo dune.git 3.17.2-alt1
zoryn task add 418908/5 copy waked sisyphus

Заменить существующий сабтаск (например, заменить локальный rebuild на copy из sisyphus):

zoryn task add 418908 copy waked sisyphus --replace

Пересобрать всё, что прибито к точной версии ядра (модули), пропустив тех, кто лишь собирается с хедерами:

zoryn task add 428623 rebuild --dependent-on kernel-image-6.18 --dry-run
zoryn task add 428623 rebuild --dependent-on kernel-image-6.18

Soname bump: пересобрать всех прямых потребителей библиотеки против новой версии:

zoryn task add 430000 rebuild --dependent-on ImageMagick --abi-break

Добавить одно и то же действие в несколько задач по порядку, с остановкой на первой ошибке:

zoryn task add 123456,123457 rebuild php-sphinx

zoryn task run

Поставить задачу в очередь на сборку. Обёртка над ssh gyle task run.

zoryn task run [--test-only] [--commit] [--dry-run] [--fail-early] [--fail-late]
               [--hurry] [--unhurry] [-m MESSAGE] [TASK_ID] [-d]

Без ID zoryn использует последнюю задачу, с которой работал, — задачу, недавно созданную или затронутую командами submit, task run TASK_ID, task new, task copy и т. п. (запоминается в $XDG_STATE_HOME/zoryn/last-task). Если ничего ещё не записано, берётся последняя задача по версии gyle. task show использует тот же порядок выбора.

TASK_ID также принимает список через запятую (123456,123457) по аналогии с submit -B repo1,repo2: каждая задача запускается по порядку с одними и теми же флагами, с остановкой на первой ошибке (более поздние задачи могут зависеть от более ранних).

  • --test-only — остановиться после теста, не коммитить.
  • --commit — коммит после тестов.
  • --dry-run — остановиться перед постановкой в очередь.
  • --fail-early — остановить сборку после первой ошибки.
  • --fail-late — не останавливать после первой ошибки.
  • --hurry / --unhurry — включить/выключить swift-режим.
  • -m MESSAGE — причина сборки (многословные в кавычках).
  • -m - — читать причину из stdin.
zoryn task run                                                # последняя задача
zoryn task run 123456                                         # конкретная
zoryn task run --test-only -m "fix build for aarch64" 123456
zoryn task run --fail-early --hurry 123456
zoryn task run --dry-run 123456
echo "long reason" | zoryn task run -m - 123456               # причина из stdin
zoryn task run 123456,123457 --commit                         # несколько задач по порядку

zoryn task abort

Отменить запущенную задачу. Обёртка над ssh gyle task abort.

zoryn task abort TASK_ID [-d]

Task ID поддерживает TAB-дополнение из списка задач текущего пользователя.

zoryn task approve

Approve сабтаска. Обёртка над ssh gyle task approve.

zoryn task approve TASK_ID SUBTASK [--revoke] [-m MESSAGE] [-d]

SUBTASK — номер сабтаска, имя пакета или all для approve всех. Для all выполняется один вызов ssh gyle task approve <id> all — gyle сам проходит только по реально существующим сабтаскам, поэтому ранее удалённые через task delsub подзадачи не приводят к паразитным ошибкам «subtask not found». Комментарий — через -m. Если -m не указан и stdin подан на вход, сообщение читается оттуда.

TASK_ID также принимает список через запятую (123456,123457) по аналогии с submit -B repo1,repo2: один и тот же SUBTASK подтверждается в каждой задаче по порядку, с остановкой на первой ошибке.

zoryn task approve 123456 1                         # approve сабтаска #1
zoryn task approve 123456 php-sphinx -m "LGTM"      # по имени пакета
zoryn task approve 123456 all                       # все сабтаски
zoryn task approve 123456 1 --revoke                # отозвать approve
echo "Checked" | zoryn task approve 123456 1        # сообщение из stdin
zoryn task approve 123456,123457 all                # все сабтаски в нескольких задачах по порядку

zoryn task disapprove

Disapprove сабтаска. Обёртка над ssh gyle task disapprove. Синтаксис такой же, как у approve, включая поведение all и список TASK_ID через запятую: выполняется один вызов ssh gyle task disapprove <id> all, и gyle сам проходит по существующим сабтаскам.

zoryn task disapprove TASK_ID SUBTASK [--revoke] [-m MESSAGE] [-d]
zoryn task disapprove 123456 1 -m "Needs fixes"
zoryn task disapprove 123456 all -m "FTBFS"
zoryn task disapprove 123456 1 --revoke

zoryn task delete

Удалить сабтаск из задачи по имени пакета или номеру. Также доступна как zoryn task delsub (gyle-совместимый alias).

zoryn task delete [task_id] <package|subtask> [-d]
zoryn task delsub [task_id] <package|subtask> [-d]

Аргумент с пакетом/сабтаском:

  • 4200 — номер сабтаска.
  • php-sphinx — имя пакета.
  • php-sphinx.git — имя пакета с .git.
  • php-sphinx.git=8.2.30-alt1 — имя с тэгом (для copy-paste из task ls).

ID задачи можно не указывать: с одним аргументом zoryn берёт последнюю задачу, с которой вы работали (её запоминают submit, task run ID, task new, task copy, …). Поскольку задача при этом явно не названа, перед удалением zoryn показывает список сабтасков задачи, сообщает, какой именно сабтаск будет удалён, и спрашивает подтверждение (y/N, Enter — отмена). Флаг -y/--yes пропускает вопрос; без терминала на stdin (скрипты, CI) он обязателен — иначе команда откажется удалять:

zoryn task delsub 4200
zoryn task delsub --yes 4200   # без вопросов

zoryn task rm

Удалить задачу.

zoryn task rm <TASK_ID>

zoryn task genbatch

Сгенерировать batch-конфиг из существующей задачи.

zoryn task genbatch <task_id> [-o|--output file] [--main pkg]

Читает структуру задачи и генерирует batch-конфиг для пересборки. См. Batch configs.

Группы gear specsubst

Когда несколько подзадач собираются из одного git-репозитория через gear specsubst: (например dune, dune-ordering, dune-dyn … все собираются из dune.git и различаются значением specsubst, зашитым в имя gear-тега), genbatch распознаёт общий репозиторий и выводит их как варианты specsubst, а не как отдельные пакеты:

[dune]
path = "dune"
specsubst = "subpackage="

[dune-ordering]
path = "dune"
specsubst = "subpackage=ordering"

Каждый вариант ссылается на один и тот же каталог репозитория через относительный path (разрешается относительно --basedir), а значение specsubst берётся из суффикса тега (у базового пакета — того, что назван как репозиторий, напр. dune — значение пустое). Имя переменной specsubst не отдаётся API RDB, поэтому genbatch читает его из .gear/rules репозитория через gitweb. Если это не удаётся или в задаче нет базового пакета, участники выводятся плоским списком (с пометкой в stderr); таким записям нужно вручную проставить path/specsubst, иначе группа не пересоберётся.

zoryn task refresh

Обновляет устаревшие сабтаски в задаче — подтягивает в задачу актуальные версии из репозитория вместо устаревших. По умолчанию сверяет rebuild-сабтаски с веткой задачи; --from <ветка> --types <список> распространяет обновление на другие типы сабтасков.

zoryn task refresh <task_id> [--from <branch>] [--types <list>] [--dry-run]
                             [--run [--test-only|--commit] [-m MESSAGE]]

Опции:

  • <task_id> — задача для обновления.
  • --from <branch> — ветка репозитория для сверки (по умолчанию — ветка задачи).
  • --types <list> — типы сабтасков для обновления (через запятую). Значения: rebuild (по умолчанию), copy, gear, srpm; плюс сокращения ALL (всё кроме del) и build (= gear,srpm). Обязательно при использовании --from.
  • --dry-run — показать, что будет обновлено, не меняя задачу. С --run gyle всё равно опрашивается по SSH, но постановка задачи выполняется в серверном dry-run (task run --dry-run), и задача не ставится в очередь.
  • --run — после refresh поставить задачу на сборку. Срабатывает и когда обновлять нечего; пропускается (с предупреждением и exit 1), если хоть один сабтаск не удалось обновить.
  • --test-only — передать --test-only в task run. Требует --run.
  • --commit — передать --commit в task run. Требует --run. Несовместимо с --test-only.
  • -m MESSAGE — причина сборки, передаётся в task run (для стабильных веток gyle её требует). -m - — читать из stdin. Требует --run.
zoryn task refresh 123456                                  # rebuild-сабтаски на той же ветке
zoryn task refresh 123456 --from sisyphus --types ALL      # все типы из sisyphus
zoryn task refresh 123456 --from sisyphus --types copy     # только copy-сабтаски
zoryn task refresh 123456 --from sisyphus --types ALL --dry-run
zoryn task refresh 123456 --run                            # обновить и запустить сборку
zoryn task refresh 123456 --run --test-only                # обновить и запустить в test-only
zoryn task refresh 123456 --run -m "fix CVE-2026-1234"     # обновить и поставить на сборку с причиной

Проверка источника (хеша)

Сравнение версий не ловит один сценарий: версия-релиз сабтаска совпадает с репозиторной, но пакет в репозитории собран из другого git-источника. girar отклоняет такие сабтаски с ошибкой was built earlier for <branch> from a different source: gear:<hash>.

task refresh сравнивает запиненный источник (tag_id) каждого gear-сабтаска с источником задания, которое последним собрало эту же версию для ветки задания. Проверяются только gear-сабтаски (личные сборки): пин rebuild-сабтаска берётся из собственного источника, записанного в репозитории для этой NVR, а girar не позволяет закоммитить ту же NVR из другого источника — значит, пин rebuild может устареть только из-за смены версии, а это уже ловит сравнение версий выше.

gear-сабтаски с несовпадающим пином автоматически исправить нельзя. Они выводятся единым блоком ошибок в конце вывода с готовой командой zoryn task add TASK^SUB --replace rebuild PKG; код возврата ненулевой, а --run пропускается — сборка всё равно завершилась бы ошибкой.

Проверка требует одного-двух дополнительных запросов к RDB на gear-сабтаск (ответы по заданиям-источникам кешируются: общее задание-источник запрашивается один раз); при ошибках API она молча пропускается.

zoryn task batch

Собрать цепочку связанных пакетов из batch-конфига.

zoryn task batch <config> [--basedir dir] [--no-build] [--create-task] [--refresh]
                 [--dry-run] [--test [--skip-built]] [--skip pkgs] [--batch-pkgs pkgs] [-b builder|pattern] [-B repo]
                 [--continue|--abort|--restart] [--allow-overwrite-tag] [-d]

Читает список пакетов из конфига и собирает каждый по порядку. Полезно для групп пакетов типа PHP-extensions, где все пакеты делят общие настройки.

Обработкой пакетов управляет mode из batch-конфига (глобально в [batch] или у отдельного пакета): build тегирует и собирает каждый пакет, rebuild добавляет обычные пересборки, а auto сравнивает version-release из spec пакета с целевым репозиторием и сам выбирает build или rebuild для каждого репозитория — см. Batch-конфиги — Режим auto.

Опции:

  • <config> — имя конфига (из ~/.config/zoryn/batch/) или путь к .conf. Дополнение по TAB предлагает именованные конфиги, а также пути к файлам и каталогам.
  • --basedir <dir> — базовый каталог для пакетов (переопределяет конфиг, обязателен, если не указан).
  • --no-build — пропустить локальную сборку, только commit/tag/push/submit.
  • --create-task — создать новую задачу, если не найдена (добавляет main-пакет автоматически).
  • --refresh — обновить пакеты с локальными изменениями.
  • --dry-run — показать что будет сделано.
  • --test — локальная тестовая сборка без gitery/gyle.
  • --skip-built — вместе с --test: пропускать пакеты, чей src.rpm (точное имя-версия-релиз) уже есть на билдере, если в git-репозитории пакета с момента той сборки не появилось ни новых коммитов, ни незакоммиченных изменений в отслеживаемых файлах. Неотслеживаемые файлы (например, логи сборки) не учитываются — gear --commit пакует только отслеживаемое содержимое, так что на сборку они не влияют. Ускоряет повторные прогоны больших batch-наборов. При --continue используется значение из сохранённого состояния.
  • --skip <pkgs> — пропустить пакеты (через запятую).
  • --batch-pkgs <pkgs> — собрать только перечисленные пакеты (через запятую). Имена должны присутствовать в конфиге, иначе запуск прерывается со списком доступных пакетов. Выбор сохраняет порядок из конфига и сочетается с --skip, который дополнительно исключает из него. Автодополнение оболочки подсказывает имена пакетов из указанного конфига.
  • -b <name|pattern> — билдер(ы) для локальных сборок. Принимает имя, список через запятую, @all, ^prefix или @host:<host> (см. паттерны билдеров). Если под паттерн попадает несколько билдеров, каждый пакет собирается на всех сразу, параллельно.

    Параллельность здесь нужна для проверки на разных архитектурах, а не для скорости

    Несколько билдеров задаются для того, чтобы прогнать один и тот же батч на разных архитектурах, а не чтобы он закончился быстрее. Сами пакеты по-прежнему идут строго один за другим, и каждый собирается на всех билдерах — так что весь прогон занимает столько, сколько на каждом пакете тратит самый медленный билдер, и быстрее сборки на одном билдере он не станет. Батч между билдерами не делится: именно это ускорило бы прогон, но пакеты внутри батча зависят от собранных ранее через hasher-репозиторий самого билдера, и с половиной набора в каждом репозитории эти зависимости было бы не разрешить.

    Пока пакет собирается, прогресс показывается той же таблицей статусов, что печатает zoryn build: по колонке на билдер и новая строка на каждую смену стадии или результата. На каждый билдер пишется отдельный лог в .gear/, а пакет считается неудачным, если сборка упала хотя бы на одном билдере — для каждого упавшего билдера печатаются код возврата и путь к логу. При нескольких билдерах автодоустановка Python-зависимостей (--no-python-auto-deps) не применяется, а --skip-built пропускает пакет, только если готовый src.rpm есть на каждом билдере. - -B <repo> — целевой репозиторий (по умолчанию: sisyphus). Несколько репозиториев через запятую. - --continue — возобновить прерванный batch. - --abort — отбросить сохранённое состояние. - --restart — начать заново, отбросив старое состояние. - --allow-overwrite-tag — принудительно пересоздать существующие локальные тэги во время batch, минуя проверки gears/ancestor (см. zoryn submit). При --refresh не имеет эффекта: refresh всегда перезаписывает локальный тэг. При --continue текущее значение флага всегда побеждает сохранённое в state — пере-передавайте флаг при каждом возобновлении, если хотите, чтобы overwrite оставался включённым. - --no-python-auto-deps — отключить авто-обновление .gear/pyproject_deps.json и повторную сборку при изменении Python-зависимостей во время сборки. - --no-edit-commit — не открывать редактор при коммите (для автоматизации).

zoryn task batch php-8.4                       # ~/.config/zoryn/batch/php-8.4.conf
zoryn task batch ~/configs/mypackages.conf     # явный путь
zoryn task batch php-8.4 --basedir ~/packages  # переопределить basedir
zoryn task batch php-8.4 --no-build            # пропустить локальную сборку
zoryn task batch php-8.4 --create-task         # создать задачу, если нет
zoryn task batch php-8.4 --refresh             # обновить с локальными изменениями
zoryn task batch php-8.4 --dry-run             # предпросмотр
zoryn task batch php-8.4 --test                # локальная тестовая сборка
zoryn task batch php-8.4 --test -b arm-server  # тест на конкретном билдере
zoryn task batch php-8.4 --test -b team64,shell32  # каждый пакет на обоих, параллельно
zoryn task batch php-8.4 --test --skip-built   # пропустить уже собранные на билдере
zoryn task batch php-8.4 --skip php-xdebug     # пропустить пакеты
zoryn task batch php-8.4 --batch-pkgs php-redis,php-xdebug  # собрать только эти
zoryn task batch php-8.4 -B p11                # в p11
zoryn task batch php-8.4 -B sisyphus,p11,p10   # 3 ветки с зависимостями
zoryn task batch php-8.4 --continue            # возобновить прерванный
zoryn task batch php-8.4 --abort               # отбросить состояние
zoryn task batch php-8.4 --restart             # заново

zoryn task rebuild

Пересобрать пакеты, зависящие от пакета в существующей задаче.

zoryn task rebuild <task_id|package> [--from-log] [--deps-by-pkg <pkg>]
                   [--dptype=TYPE] [--depth=N] [--up <basedir>]
                   [--all-subtasks <basedir>] [--skip LIST] [--skip-gyle-done]
                   [-f|--force] [builder options] [-d]

Запрашивает RDB API о пакетах с двоичными зависимостями на указанный пакет, пересобирает их локально через hasher и добавляет успешные пересборки в задачу.

  • --from-log — парсить affected-пакеты из лога FAILED задачи вместо RDB API.
  • -f, --force — форсировать пересборку всех, игнорировать существующие лог-файлы ошибок.
  • --deps-by-pkg <pkg> — запросить зависимости по имени пакета вместо task ID.
  • --up <basedir> — обновлять пакеты с upstream вместо пересборки (см. ниже).
  • --all-subtasks <basedir> — пересобрать локально все пакеты задачи, а не только зависимые: пакет каждого сабтаска клонируется в <basedir>/<пакет>, из задачи выкачивается его тэг и собирается локально в hasher. В задачу ничего не добавляется — только локальные проверочные сборки.
  • --dptype=TYPE — тип зависимостей для RDB: source, binary (по умолчанию), both.
  • --depth=N — глубина зависимостей (1–4, по умолчанию: 1).
  • --skip LIST — пропустить сабтаски по номеру или имени (через запятую, --skip 340,440,vtkaddon).
  • --skip-gyle-done — пропускать уже собранные на gyle (только с --all-subtasks).

Опции билдера — как у zoryn build: -b/--builder=PATTERN, -a/--arch, -B/--build-branch, -p, -s, --fail-if-busy, --skip-busy. Целевой репозиторий и ветка берутся из RDB-информации задачи, а не из флага.

При -p/--parallel билдеры с одинаковой архитектурой сводятся к одному на архитектуру перед сборкой: пересобирать один и тот же пакет на двух узлах одной архитектуры бессмысленно — результат идентичен, а слот тратится впустую. Отброшенные билдеры перечисляются в предупреждении. Параллелизм между разными архитектурами сохраняется. Это работает и в обычной пересборке обратных зависимостей, и в режиме --all-subtasks.

--from-log ищет во всех доступных логах (итерации и попытки) последний с секцией «ACLs of affected packages». Для старых/удалённых задач показывает список affected-пакетов без попыток пересборки.

Режим update (--up)

Вместо пересборки обновляет каждый зависимый пакет с upstream:

  1. Клонирует пакет в <basedir>/<package>, если нет (через zoryn clone).
  2. Fetch и checkout ветки gears/sisyphus.
  3. Запускает zoryn up.
  4. Если уже актуальная версия: добавить как rebuild-сабтаск.
  5. Если обновлено: собрать локально и добавить как обычный сабтаск.
  6. При любой ошибке: немедленная остановка и возврат управления мейнтейнеру.
zoryn task rebuild 404809 --up ~/packages

zoryn task copy

Скопировать задачу в другой репозиторий.

zoryn task copy -B <repo> <task_id> [options]
zoryn task copy --into <target_id> <task_id> [options]

Копирует все сабтаски существующей задачи в новую задачу в другом репозитории, используя имена пакетов (SRPM) из Tasks API. Если исходная задача ещё не завершена, новая зависит от неё.

Созданная задача (или цель --into) запоминается как последняя, с которой работали: следующий zoryn task run без номера запустит именно эту копию. --dry-run запомненную задачу не меняет.

С --into <target_id> сабтаски добавляются в указанную существующую задачу вместо создания новой. Целевой репозиторий берётся из этой задачи (-B игнорируется). Зависимости существующей задачи не изменяются; если исходная задача не DONE — выводится предупреждение, зависимости нужно проставить вручную.

Зачем нужен --into?

Типичные сценарии, когда сабтаски нужно дослать в существующую задачу, а не создавать новую:

  • Добавление пакетов в уже подготовленную задачу. В стабильной ветке открыта задача, в ней уже выставлен build reason, выбран режим (--commit или test-only) — переделывать всю настройку не хочется. --into <id> кладёт новые сабтаски прямо в неё.
  • Консолидация взаимозависимых пакетов. Пакет из другой задачи должен встать вместе с уже стоящим в вашей (например, при ABI-сборке вместе). Доливаем его через --into, чтобы оба сабтаска собирались внутри одного gyle-прогона и разрешали зависимости друг друга, вместо гонки между двумя отдельными задачами.
  • Восстановление после FAILED без перезапуска с нуля. В FAILED-задачу можно дослать сабтаски и перезапустить её. --into <failed_id> доливает недостающее на месте; задачу всё равно нужно будет перезапустить, и упавшие сабтаски пересоберутся.

По умолчанию копируются все сабтаски исходной задачи. Через --subtask (повторяемый, через запятую) можно отобрать только нужные. Аргумент принимает тот же синтаксис, что и у zoryn task delete:

  • номер сабтаска — --subtask 200;
  • имя пакета — --subtask php-mbstring;
  • pkg.git=tag--subtask php-gd.git=php-8.2.31-alt1 (удобно копировать из вывода zoryn task ls);
  • комбинации через запятую — --subtask php,php-mbstring,200.

TAB-completion подсказывает сабтаски исходной задачи (нужно, чтобы ID исходной задачи уже стоял в командной строке). Если аргумент не находит совпадений, команда печатает список доступных сабтасков и выходит с ненулевым статусом.

Что не переносится при копировании сабтасков:

  • Аппрувы. В gyle аппрувы привязаны к конкретному объекту сабтаска. Скопированные сабтаски — это новые объекты без аппрувов; их придётся ставить заново.
  • Артефакты сборки. Каждый сабтаск пересобирается (или забирается заново через task add copy) внутри целевой задачи. RPM-ки исходной задачи вслепую не переиспользуются.
  • Пер-сабтасочные метаданные (build reason у конкретного сабтаска, комментарии, ручные флаги). Метаданные целевой задачи сохраняются, исходной — отбрасываются.
  • Номера сабтасков. Новые ID назначает gyle при task add.
  • Зависимости исходной задачи. Зависимости существующей целевой задачи не трогаются (если источник не DONE, выводится предупреждение — при необходимости проставьте их через zoryn task manage).

В сочетании с --dry-run можно предпросмотреть, какие сабтаски будут добавлены и каким способом (build / copy / rebuild / delete), не трогая целевую задачу. --rebuild-only / --copy-rebuilds отключают EVR-промпт — удобно для неинтерактивных скриптов и пакетной консолидации.

Состояние целевой задачи проверяется заранее:

  • Отклонено: DONE, SWEPT, EPERM — терминальные состояния, новые сабтаски не принимаются.
  • Предупреждение: BUILDING, COMMITTING, FAILING, PENDING, POSTPONED — gyle может отклонить добавление.
  • Разрешено: NEW, AWAITING, TESTED, FAILED.

Для rebuild-сабтасков сравнивает EVR (epoch:version-release) между источником и целью. При различии EVR запрашивает интерактивно: копировать или пересобирать. --copy-rebuilds / --rebuild-only пропускают запрос.

  • -B, --branch <repo> — целевой репозиторий. Обязателен, если не указан --into.
  • --into <task_id> — добавить сабтаски в существующую задачу вместо создания новой.
  • -r, --run — запустить после создания.
  • -c, --commit — автокоммит после успешной сборки (только с --run).
  • --copy-rebuilds — копировать из источника при различии EVR (не спрашивать); тот же EVR всё равно пересобирается.
  • --rebuild-only — всегда пересобирать из цели, даже если EVR различается.
  • -n, --dry-run — предпросмотр без создания задачи.
  • <task_id> — исходная задача.
zoryn task copy -B p11 404765                  # копировать в p11
zoryn task copy -B p11 --run 404765            # копировать и запустить test-only
zoryn task copy -B p11 --run --commit 404765   # копировать, запустить, auto-commit
zoryn task copy -B p11 --rebuild-only 404765   # всегда пересобирать
zoryn task copy -B p11 --copy-rebuilds 404765  # копировать при различии EVR
zoryn task copy -B p11 --dry-run 404765        # предпросмотр
zoryn task copy --into 500000 404765           # добавить в существующую задачу #500000
zoryn task copy -B p11 --subtask php --subtask 200 404765  # скопировать только выбранные сабтаски
zoryn task copy -B p11 --subtask php,php-mbstring,200 404765  # через запятую

zoryn task test-rebuild

Экспериментальная

Команда активно развивается и может измениться.

Тест-пересборка зависимых пакетов перед отправкой задачи.

zoryn task test-rebuild <task_id> [--arch <arch>] [--builder <pattern>]
    [-B <branch>] [-p|-s] [--package PKG]... [--packages-file FILE]
    [--dptype=TYPE] [--depth=N] [--deps-by-pkg PKG] [--skip-ftbfs] [--verify-failures]
    [--without-task] [--mkrepo] [--local-rpms DIR]
    [--continue] [--continue-no-refresh] [--log-dir DIR] [--top] [-d]

Скачивает RPM из задачи, через RDB находит зависимые пакеты и тест-пересобирает каждый локально. Помогает убедиться, что пакеты собираются с новыми зависимостями до commit.

  • <task_id> — ID задачи для тестирования.
  • --arch <arch> — архитектуры (через запятую, x86_64,aarch64).
  • --builder <pattern> — выбор билдеров (см. Паттерны билдеров).
  • -B, --build-branch <branch> — фильтровать билдеры по ветке. Взаимоисключает --mkrepo.
  • -p, --parallel — собирать параллельно (по умолчанию).
  • -s, --sequential — собирать последовательно.
  • --package PKG — добавить пакет в кастомный список (повторяемо). Пропускает авто-запрос RDB. Принимает имя пакета или name-version-release (можно с epoch и суффиксом .rpm); версия может начинаться с буквы (lshw-B.02.20-alt1). Строка без релиза читается как имя пакета — форма name-version не поддерживается.
  • --packages-file FILE — читать список из файла (один пакет на строку, # — комментарий). Комбинируется с --package.
  • --dptype=TYPE — тип зависимостей: source (по умолчанию), binary, both.
  • --depth=N — глубина зависимостей (1–4, по умолчанию: 1).
  • --deps-by-pkg <pkg> — фильтровать зависимости по имени пакета вместо зависимостей задачи.
  • --skip-ftbfs — пропустить пакеты, уже сломанные на beehive.
  • --verify-failures — после основной пересборки пересобрать упавшие и зависшие пакеты без RPM из задачи, чтобы отличить регрессии от существующих ошибок: пакет, который падает или зависает только с задачей, — регрессия; падающий и без неё — существующая ошибка. Сборка, зависшая и при верификации, вердикта не получает и перепроверяется при --continue.
  • --without-task — пропустить скачивание RPM из задачи; пересобрать зависимые в текущем состоянии ветки без инъекции пакетов задачи в hasher. Используется для получения baseline до применения задачи. <task_id> всё равно обязателен — он используется для запроса RDB с целью получения списка зависимых пакетов. Логи получают префикс baseline.. Взаимоисключает --verify-failures, --local-rpms и --mkrepo. При использовании с --continue или --continue-no-refresh RPM из hasher очищаются при каждом запуске — это гарантирует чистое baseline-состояние.
  • --mkrepo — собрать объединённый репозиторий задачи (как task mkrepo) и направить каждую сборку на него. Логи получают префикс mkrepo.. См. Пересборка при переименовании. Взаимоисключает --without-task, --local-rpms и --build-branch.
  • --local-rpms <dir> — использовать RPM из локального каталога вместо скачивания из задачи. Взаимоисключает --without-task и --mkrepo.
  • --continue — продолжить с прошлого запуска, обновив список пакетов из RDB.
  • --continue-no-refresh — продолжить без обновления списка.
  • --log-dir <dir> — каталог для логов и статистики.
  • --top — интерактивный TUI с прогрессом.
  • -d, --debug — отладочный вывод.

У задачи должен быть собранный репозиторий

Без --without-task или --local-rpms важно не состояние задачи, а наличие у неё собранного репозитория (RPMS.task). Задача, которая ещё строится — NEW, AWAITING, PENDING, BUILDING, COMMITTING, FAILING, — отклоняется сразу, так как её репозиторий пуст или собран лишь частично. Терминальные состояния допускаются, включая FAILED: у упавшей задачи часто всё равно есть пригодный (пусть частичный) репозиторий, и test-rebuild по ней — нормальный сценарий. Если RPM задачи скачались пусто или не полностью хотя бы для одной запрошенной архитектуры, команда завершается с ошибкой вместо пересборки против чистой ветки (которая дала бы ложный успех). DONE предупреждает, что overlay избыточен (пакеты уже в репозитории); FAILED предупреждает, что набор RPM может быть неполным.

При использовании --package / --packages-file zoryn получает текущую версию каждого пакета из RDB. Если указанная версия не совпадает, пакет пересобирается с текущей и показывается предупреждение. Отсутствующие в ветке пакеты пропускаются.

Возможности:

  • Мультиархитектурная поддержка с параллельным запуском на нескольких билдерах.
  • Автоматическое скачивание RPM из задачи по архитектуре.
  • Обнаружение зависимых через RDB.
  • Кастомный список пакетов через --package / --packages-file.
  • Beehive FTBFS detection — показывает уже сломанные на beehive пакеты.
  • Инкрементальная пересборка через --continue / --continue-no-refresh.
  • Статистика в rebuild-stats.json.
  • Мониторинг нагрузки хоста для защиты от перегрузки.
  • TUI с --top.
  • Постоянная история поиска: Up/Down или Ctrl+R в строке поиска логов.
zoryn task test-rebuild 404809                              # базовый тест на локальном билдере
zoryn task test-rebuild 404809 -b @all --arch=x86_64        # на всех x86_64 билдерах
zoryn task test-rebuild 404809 --skip-ftbfs                 # пропустить сломанные на beehive
zoryn task test-rebuild 404809 --continue                   # продолжить прерванную
zoryn task test-rebuild 404809 -b @all --top                # интерактивный TUI
zoryn task test-rebuild 404809 --verify-failures            # проверка, что упавшие — регрессии
zoryn task test-rebuild 404809 --without-task               # baseline: без RPM задачи
zoryn task test-rebuild 404809 --package foo --package bar-1.2.3-alt1
zoryn task test-rebuild 404809 --packages-file ~/rebuild-list.txt

Пересборка при переименовании: --mkrepo

По умолчанию test-rebuild подаёт RPM задачи в hasher через RPMS.hasher. Если задача переименовывает пакет, который зависимые подтягивают через виртуальный Provides (например mvn(org.foo:bar)), apt берёт провайдера из pkglist ветки-зеркала и молча игнорирует RPMS.hasher — ложный отрицательный результат. --mkrepo собирает объединённый репозиторий (RPM задачи поверх базового зеркала билдера, ровно как zoryn task mkrepo) и направляет на него каждую сборку:

zoryn task test-rebuild 418566 --mkrepo -b @all

Требования к каждому билдеру: repo (локальное file://-зеркало на хосте сборки), repo_workdir (пишите абсолютный путь: относительный не отвергается, а достраивается — для локального билдера от каталога, из которого запущен zoryn, так что task mkrepo <id> --clean из другого места вычистит уже другой путь; для удалённого путь остаётся как есть и трактуется на сборочном хосте, где ~ тоже не раскрывается) и команда сборки, использующая {apt_tmpdir} (команда по умолчанию так и делает, если задан repo). Кроме того, в ~/.hasher/config билдера не должен быть выставлен unchecked_initroot_cache: с ним hsh восстанавливает весь apt-box вместе с sources.list из своего кэша и до --apt-config вообще не доходит — сборка пойдёт против того репозитория, которым кэш был наполнен, и всё равно отрапортует успех. Любое из этих несоответствий — жёсткий отказ ещё до старта первой сборки.

Замечания:

  • Взаимоисключает --without-task, --local-rpms и --build-branch.
  • --verify-failures работает: фаза проверки пересобирает упавшие пакеты против чистого базового репозитория (без overlay задачи).
  • RPMS.hasher очищается на каждом билдере перед запуском и перед каждой сборкой: с --mkrepo все зависимости должны приходить из объединённого репозитория, поэтому оставшийся в hasher'е RPM незаметно исказил бы результат. Билдер, который не удалось очистить, прерывает запуск.
  • Репозиторий пересобирается с нуля при каждом запуске — включая --continue и --continue-no-refresh, — потому что у задачи могли появиться подзадачи. Предыдущий <repo_workdir>/<task_id> сначала удаляется, так что ничего от него в новом не остаётся.
  • Сгенерированный репозиторий остаётся на диске после запуска. Удалить его — zoryn task mkrepo <id> --clean с тем же набором билдеров (-b) (при нескольких хостах сборки репозиторий каждого хоста лежит в своём подкаталоге, поэтому другой выбор билдеров очистит другой путь).
  • Один запуск на задачу: два одновременных --mkrepo-ребилда одной и той же задачи (скажем, ручной запуск параллельно с джобой zoryn-orch) делят <repo_workdir>/<task_id>, и пересборка репозитория в более позднем запуске удалит репозиторий, против которого ещё собирает первый. Запуски по разным задачам спокойно работают параллельно — у каждого task id свой каталог.

Очистка между задачами

Очистка между задачами удаляет бинарные RPM из {hasher_dir}/repo/{arch}/RPMS.hasher/ и source RPM из {hasher_dir}/repo/SRPMS.hasher/. Chroot, aptbox и apt cache переиспользуются между задачами (для полного сброса используйте zoryn builder clean). Форкнутый worker также очищает унаследованный apt-tmpdir при SIGINT/SIGTERM, поэтому прерывание длительного батча больше не оставляет /tmp/.private/<user>/zoryn.XXXXXXXX/ на билдере.

zoryn task manage

Интерактивный полноэкранный TUI для просмотра и управления задачами.

zoryn task manage [TASK_ID] [--user NAME] [--state STATE] [--repo REPO]
                  [--needs-approval GROUP] [--no-color]

Опции:

  • TASK_ID — открыть задачу сразу (минуя список).
  • --user NAME — фильтр по пользователю (по умолчанию: текущий; ALL — все).
  • --state STATE — фильтр по state (TESTED, FAILED, BUILDING).
  • --repo REPO — фильтр по целевому репозиторию (sisyphus, p11).
  • --needs-approval GROUP — задачи, требующие approve (maint или tester).
  • --no-color — отключить цвет (также учитывает NO_COLOR).

Возможности:

  • Mutt-style навигация в одной панели: список задач → детали → зависимости.
  • Approve/disapprove сабтасков, run/abort/commit/test-only задач, переключение share, управление зависимостями.
  • Отключение inheritance-проверок git/lastchange.
  • Создание новых задач и добавление сабтасков прямо из TUI (Ins — в конец; o/O — вставка после/перед текущей строкой).
  • Поиск задач (/) и сабтасков (/ на детальном экране, n/N — след./пред.).
  • Постоянная история поиска: Up/Down или Ctrl+R в строке поиска.
  • Просмотрщик build-лога и event-лога с подсветкой и переносом по словам.
  • Многострочные ошибки girar (например, от неудачного task run) открываются в центрированном окне с прокруткой: длинные строки переносятся по словам, показ начинается с самого сообщения об ошибке; Up/Down/PgUp/PgDn или колесо мыши — прокрутка, любая другая клавиша закрывает окно, а текст можно выделить и скопировать мышью.
  • Авто-обновление каждые 15 секунд, ручное — R/F5.
  • Фильтры по state, repo, user, needs-approval — всё горячими клавишами.
  • Read-only режим, когда SSH недоступен.
  • Полная клавиатурная навигация и поддержка колеса мыши.
  • Выделение текста мышью на любом экране — drag для выделения диапазона, double-click для слова; triple-click на строке в списке задач, содержащей wrap-блок пакетов, выделяет все pkg=version этой задачи. Многострочные выделения склеиваются пробелами (без переносов) и копируются в буфер обмена при отпускании (OSC 52). Одиночный клик на #NNN всё ещё копирует только цифры.
zoryn task manage                                  # с фильтрами по умолчанию
zoryn task manage --user ALL                       # все пользователи
zoryn task manage --state TESTED --repo sisyphus   # фильтр state и repo
zoryn task manage --needs-approval maint           # требует approve maintainer'а
zoryn task manage 410005                           # открыть задачу #410005
zoryn task manage --no-color                       # без цвета

Нажмите F1 в TUI для полной справки по горячим клавишам.

zoryn task log

Просмотр build- или event-логов в TUI.

zoryn task log <task_id>                                    # event-лог
zoryn task log <task_id> <subtask>                          # выбор архитектуры
zoryn task log <task_id> <subtask> --arch x86_64            # build-лог
zoryn task log <task_id> <subtask> --arch x86_64 --srpm     # SRPM-лог

Сабтаск — номер или имя пакета (TAB дополняет из задачи):

zoryn task log 410005 3                                     # по номеру сабтаска
zoryn task log 410005 php-jpgraph                           # по имени пакета

Опции:

  • --arch <arch> — архитектура (требует сабтаск).
  • --srpm — смотреть srpm.log вместо основного лога (требует --arch).
  • --no-color — без цвета.