ScriptRunner · Data Center

ScriptRunner Data Center: проверяем выборку JQL до массового изменения

Ограниченный отчёт HAPI в Script Console: контрольные задачи, права, признак усечения и проверка выборки перед отдельной операцией изменения.

Применимость: Data Center. Названия пунктов и доступность функций зависят от версии, плана и типа проекта. Проверяйте изменения на тестовом окружении. Описанные рабочие процедуры — предлагаемый подход, а не гарантии поставщика.

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

Представим учебный сценарий: в проекте OPS нужно подготовить список незавершённых Task с меткой sr-preview-pilot перед исправлением данных. Ошибка в JQL способна захватить другой тип задачи или весь проект. До разработки записи полезно получить небольшой проверяемый отчёт: какие ключи выбраны и был ли результат обрезан. Это пример организации работы, а не история выполненного внедрения.

В этом руководстве Script Console используется только для чтения. Скрипт возвращает ключи, не меняет поля и не отправляет уведомления. Его результат помогает согласовать область будущего изменения, но не является разрешением запускать массовое исправление. Для операции записи потребуются отдельный код, журнал исходных значений и собственный план возврата.

Применимость: Jira Data Center и совместимая версия ScriptRunner

Пример предназначен для HAPI в ScriptRunner for Jira Data Center. Ориентир актуальной ветки — Jira 11 и ScriptRunner 10.x; в release notes версии 10.19.0 указана совместимость с Jira 11.3.11. Это сведения о совместимости поставщика, а не заявление о проверке кода на этой паре. Для вашей установки сверьте точные версии Jira, приложения и выбранного поискового движка с документацией совместимости. ScriptRunner 10.0.0 не поддерживает Jira младше 11.

Для Jira 9/10 выберите документацию и совместимую ветку приложения отдельно. В Jira 11 изменились поисковые API: старый пример с прямым обращением к Lucene может не работать. Здесь используется HAPI вместо такого обращения. Код не предназначен для ScriptRunner Cloud: одинаковое название консоли не означает одинаковые классы и среду выполнения. На Cloud нужен отдельный сценарий через поддерживаемые облачные API.

Подготовьте контрольный набор и доступ

Работайте на тестовом экземпляре с установленным ScriptRunner и нейтральными данными. Запишите версии, пользователя запуска, проект, будущую цель обработки и максимальный размер отчёта. Доступ к Script Console связан с глобальными административными правами; настройка System Admin Only Script Edit Permissions может дополнительно ограничивать редактирование. Не выдавайте административную роль обычному читателю ради этого отчёта.

Создайте две незавершённые Task с меткой sr-preview-pilot, одну Task с другой меткой, одну завершённую Task с заполненной Resolution и один Bug с меткой пилота. Запишите реальные ключи. OPS и названия типов в примере замените значениями вашей установки. При нестандартном workflow проверьте смысл Resolution: завершённый статус с пустой Resolution пройдёт условие resolution IS EMPTY. Решите, нужно ли исправить процесс или изменить критерий выборки.

Сначала выполните JQL в расширенном поиске Jira под тем же пользователем, который запустит консоль. Ожидаются только первые две задачи. Если результат отличается, остановитесь на этом шаге: скрипт не исправит неверный фильтр. Для пилота не используйте тяжёлые функции сторонних приложений и запросы без ограничения проекта.

Сформируйте ограниченный отчёт в Script Console

Откройте ScriptRunner → Script Console и вставьте пример ниже в поле скрипта. HAPI автоматически импортирует Issues в скрипты, компилируемые ScriptRunner. Если имя уже занято другим импортом, удалите конфликт в отдельном тестовом фрагменте или используйте документированный доступ через Hapi.issues. Не переносите в этот пример старые фрагменты с update, delete или обходом прав.

Пример считывает не более 21 результата на уровне итератора, оставляет до 20 ключей и показывает truncated при наличии дополнительной задачи. Это ограничение возвращаемого набора, а не ограничение стоимости поиска в индексе или размера внутренних порций HAPI. Код сверен с официальными примерами API; на реальном экземпляре Jira при подготовке статьи он не запускался.

def jql = 'project = OPS AND issuetype = Task AND labels = "sr-preview-pilot" AND resolution IS EMPTY ORDER BY key ASC'
def limit = 20

// HAPI возвращает Iterator; сначала ограничиваем чтение.
def keys = Issues.search(jql).take(limit + 1).collect { issue -> issue.key }

return [
    jql: jql,
    limit: limit,
    displayed: Math.min(keys.size(), limit),
    truncated: keys.size() > limit,
    keys: keys.take(limit)
]

Прочитайте результат без ложного вывода о полноте

Для подготовленного небольшого набора ожидаются displayed = 2, truncated = false и два заранее записанных ключа. Порядок определяет ORDER BY key ASC. Сверьте ключи с расширенным поиском и откройте каждую задачу. Убедитесь, что история задачи, поля, комментарии и исполнитель не изменились. Это предложенные критерии приёмки, а не результаты выполненного теста.

Затем на тестовом наборе проверьте границу: 20 подходящих задач должны дать displayed = 20 и truncated = false, а 21 — displayed = 20 и truncated = true. При true нельзя называть результат полным реестром. Отдельно проверьте нулевую выборку. Не увеличивайте лимит до сотен тысяч ради полного списка; для большой операции заранее проектируют порции и контроль завершения.

Issues.search возвращает итератор. Не вызывайте на нём size() или count(), а затем не пытайтесь обходить его повторно: итератор будет исчерпан. В примере size() применяется уже к ограниченному списку строк keys. Если понадобится отдельный подсчёт, в HAPI есть Issues.count; это другой запрос и не единый снимок с последующим чтением. Между запусками задачи могут измениться.

Проверьте права отдельно от доступа администратора к консоли

Обычный Issues.search учитывает права текущего пользователя. Здесь не используются методы OverrideSecurity. Но администратор запускает отчёт в собственном контексте, поэтому полученные ключи не доказывают доступность задач всем сотрудникам. Не передавайте результат в общий канал, если он содержит ключи закрытых задач. В отчёте намеренно нет описаний, адресов и комментариев.

Для отрицательной проверки используйте отдельного обычного пользователя без доступа к одной безвредной контрольной задаче. Под ним проверьте прямую ссылку и тот же JQL в интерфейсе поиска; закрытая задача не должна раскрываться. Учитывайте Browse Projects и уровень безопасности задачи. Доступ к Script Console этому пользователю не предоставляйте. Такая проверка оценивает права читателя, но не имитирует контекст будущего фонового задания.

Если будущая обработка будет работать от другого пользователя, согласуйте его роль и проведите отдельный пилот в соответствующем контексте. Не добавляйте обход безопасности только ради совпадения количества результатов. Отчёт из административной консоли и выборка сервисной учётной записи могут законно различаться.

Типовые ошибки и остановка пилота

Если редактор не распознаёт Issues или метод take, проверьте версию ScriptRunner, документацию HAPI, конфликты импортов и сообщения компилятора. Не заменяйте чтение прямым запросом к базе Jira. Если JQL отклонён, сначала проверьте ключ проекта и имена типов в интерфейсе. Пустой список не всегда означает отсутствие задач: возможны ограничения доступа, другая метка или незаполненное ожидаемым образом поле.

При неожиданно долгом выполнении не запускайте несколько копий скрипта. Зафиксируйте запрос, время запуска и наблюдаемую нагрузку для администратора. Лимит вывода не гарантирует быстрое выполнение сложного JQL. Упростите условия на тестовом экземпляре и повторяйте пилот только после выяснения причины. Ошибка выполнения не считается успешной проверкой выборки.

Откат и переход к отдельному изменению

Сам приведённый код не содержит записи в Jira, поэтому отменять изменения задач от него не требуется. Закройте консоль, уберите временный текст и храните только согласованный вариант скрипта в приватном репозитории. Тестовые метки и задачи удаляйте по правилам тестового проекта. Не удаляйте журнал выполнения или аудит, если они нужны для расследования; доступ к сохранённым результатам ограничьте.

Если выборка ошибочна, отзовите её согласование и исправьте JQL до дальнейших действий. Не превращайте отчёт в запись добавлением одной строки внутри цикла. Сначала определите фиксируемые исходные значения, обработку ошибки на середине набора, повторный запуск и возврат каждого изменения. Даже правильный список ключей устаревает: перед записью нужно повторно проверить актуальное состояние задачи. На этом этап чтения завершён; массовая операция остаётся отдельным изменением.

Официальная документация

Применить это к вашей системе

Обсудим контекст, ограничения и безопасный порядок изменений.

Обсудить задачу