Перейти к содержанию
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>

Выводит ID нового задания при успехе.

zoryn task new sisyphus
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 показывает последнюю задачу.

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 <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 — удалить ранее собранный для задачи репозиторий перед сборкой (чистая пересборка).
  • --compressed — писать сжатый индекс pkglist.classic.xz вместо разжатого pkglist.classic (по умолчанию). Пишется только один (apt читает любой); по умолчанию пропускается шаг xz и apt читает индекс напрямую.
  • --clean — удалить собранный для задачи репозиторий и выйти. Ветка задачи определяется и здесь (от подходящих сборщиков зависит структура каталогов репозитория), поэтому задача должна по-прежнему быть доступна через task show.

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

<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] <task_id>[^<subtask_id>|/<subtask_id>] <action> ...

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

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

Действия:

  • 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 указывает на заменяемый сабтаск, вместо него используется следующий сабтаск, чтобы сохранить исходную позицию.
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 418908/5 copy waked sisyphus

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

zoryn task add 418908 copy waked sisyphus --replace

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 использует последнюю задачу текущего пользователя.

  • --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 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 подан на вход, сообщение читается оттуда.

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 disapprove

Disapprove сабтаска. Обёртка над ssh gyle task disapprove. Синтаксис такой же, как у approve, включая поведение all: выполняется один вызов 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).

zoryn task rm

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

zoryn task rm <TASK_ID>

zoryn task genbatch

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

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

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

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"     # обновить и поставить на сборку с причиной

zoryn task batch

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

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

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

Опции:

  • <config> — имя конфига (из ~/.config/zoryn/batch/) или путь к .conf.
  • --basedir <dir> — базовый каталог для пакетов (переопределяет конфиг, обязателен, если не указан).
  • --no-build — пропустить локальную сборку, только commit/tag/push/submit.
  • --create-task — создать новую задачу, если не найдена (добавляет main-пакет автоматически).
  • --refresh — обновить пакеты с локальными изменениями.
  • --dry-run — показать что будет сделано.
  • --test — локальная тестовая сборка без gitery/gyle.
  • --skip <pkgs> — пропустить пакеты (через запятую).
  • -b <name> — билдер для локальных сборок.
  • -B <repo> — целевой репозиторий (по умолчанию: sisyphus). Несколько репозиториев через запятую.
  • --continue — возобновить прерванный batch.
  • --abort — отбросить сохранённое состояние.
  • --restart — начать заново, отбросив старое состояние.
  • --allow-overwrite-tag — принудительно пересоздать существующие локальные тэги во время batch, минуя проверки gears/ancestor (см. zoryn submit). При --refresh не имеет эффекта: refresh всегда перезаписывает локальный тэг. При --continue текущее значение флага всегда побеждает сохранённое в state — пере-передавайте флаг при каждом возобновлении, если хотите, чтобы overwrite оставался включённым.
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 --skip 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> [-b repo] [--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 и добавляет успешные пересборки в задачу.

  • -b <repo> — целевой репозиторий (по умолчанию: sisyphus).
  • --from-log — парсить affected-пакеты из лога FAILED задачи вместо RDB API.
  • -f, --force — форсировать пересборку всех, игнорировать существующие лог-файлы ошибок.
  • --deps-by-pkg <pkg> — запросить зависимости по имени пакета вместо task ID.
  • --up <basedir> — обновлять пакеты с upstream вместо пересборки (см. ниже).
  • --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: --builder=PATTERN, -a/--arch, -B/--build-branch (-b — для целевого репозитория), -p, -s, --fail-if-busy, --skip-busy.

--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 <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 deps).

В сочетании с --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>]
    [--package PKG]... [--packages-file FILE]
    [--dptype=TYPE] [--depth=N] [--skip-ftbfs] [--verify-failures] [--without-task]
    [--continue] [--continue-no-refresh] [--top] [-d]

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

  • <task_id> — ID задачи для тестирования.
  • --arch <arch> — архитектуры (через запятую, x86_64,aarch64).
  • --builder <pattern> — выбор билдеров (см. Паттерны билдеров).
  • --package PKG — добавить пакет в кастомный список (повторяемо). Пропускает авто-запрос RDB. Форматы: имя, name-version, name-version-release, с/без epoch и .rpm.
  • --packages-file FILE — читать список из файла (один пакет на строку, # — комментарий). Комбинируется с --package.
  • --dptype=TYPE — тип зависимостей: source (по умолчанию), binary, both.
  • --depth=N — глубина зависимостей (1–4, по умолчанию: 1).
  • --skip-ftbfs — пропустить пакеты, уже сломанные на beehive.
  • --verify-failures — после основной пересборки пересобрать упавшие без RPM из задачи, чтобы отличить регрессии от существующих ошибок.
  • --without-task — пропустить скачивание RPM из задачи; пересобрать зависимые в текущем состоянии ветки без инъекции пакетов задачи в hasher. Используется для получения baseline до применения задачи. <task_id> всё равно обязателен — он используется для запроса RDB с целью получения списка зависимых пакетов. Логи получают префикс baseline.. Взаимоисключает --verify-failures и --local-rpms. При использовании с --continue или --continue-no-refresh RPM из hasher очищаются при каждом запуске — это гарантирует чистое baseline-состояние.
  • --continue — продолжить с прошлого запуска, обновив список пакетов из RDB.
  • --continue-no-refresh — продолжить без обновления списка.
  • --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

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

Очистка между задачами удаляет бинарные 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.
  • Поиск задач (/) и сабтасков (/ на детальном экране, n/N — след./пред.).
  • Постоянная история поиска: Up/Down или Ctrl+R в строке поиска.
  • Просмотрщик build-лога и event-лога с подсветкой и переносом по словам.
  • Авто-обновление каждые 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 — без цвета.