Правило автоматизации отвечает на три вопроса: когда (событие), при каком состоянии (условие) и что сделать (действия). Каждое автоматическое изменение записывается в журнал с именем правила и номером ревизии: у всего, что произошло само, есть подпись.
Правило и его область
Правило принадлежит компании и задает свою область: перечень проектов или все проекты сразу. У правила есть владелец и аккаунт правила: права проверяются по этому аккаунту в момент, когда правило действует. По умолчанию это создатель; администратор компании может заменить его на сервисный аккаунт, и только на сервисный: правило, работающее от имени уволившегося, перестает работать вместе с ним, а сервисный аккаунт переживает пользователей.
Создавать правила может администратор хотя бы одного проекта. Редактировать правило может тот, кто администрирует каждый проект его области; правило на все проекты редактируют только администраторы компании. Видит правило тот, кому видна вся его область.
События
| Событие | Когда наступает |
|---|---|
| Создана задача | Появилась новая задача. |
| Задача изменена | Изменились поля задачи. Можно сузить: срабатывать только на перечисленные поля. |
| Выполнен переход | Задача сменила статус. Можно сузить: из каких статусов и в какие. |
| Добавлен комментарий | К задаче добавили комментарий. |
| По расписанию | Наступило время из расписания правила. |
| События разработки | Создана ветка, привязан коммит, пул-реквест открыт, готов к ревью, одобрен, запрошены изменения, слит, закрыт; см. GitHub. |
Событие говорит об изменении: какие поля изменились, из какого статуса в какой. Условие говорит о настоящем: какое состояние сейчас. "Статус сменился с X" это настройка события; "статус равен Y" это условие.
Условия
Условие пишется на QQL, тем же языком, что и поиск, с теми же полями и функциями. Пустое условие означает "на каждое подходящее событие". Условие выполняется с правами аккаунта, от имени которого работает правило: задача, которую этот аккаунт не видит, никогда не подходит, поэтому правило не может тронуть то, что его аккаунту не показали бы.
Условие с ошибкой не сохраняется: разбор происходит при сохранении, и сообщение указывает на место в запросе.
Действия
Действия делятся на два вида, и это различие стоит понимать до того, как оно понадобится:
Выполняются внутри действия пользователя: назначить исполнителя, установить поле, добавить метку. Они входят в само изменение: если такое действие не может выполниться, срабатывание откатывается вместе с изменением, которое его вызвало. Пользователь видит отказ сразу, на экране.
Выполняются после: добавить комментарий, перевести статус, уведомить пользователя, связать задачи, записать время, вызвать внешний адрес. Они выполняются после того, как изменение сохранено, и их сбой никогда не отменяет ничью работу: несостоявшийся комментарий это несостоявшийся комментарий, а не потерянная правка.
Значения проверяются при сохранении: правило, пишущее в поле выбора несуществующий вариант, не сохраняется вовсе и не портит данные молча при первом событии. Длительность для записи времени разбирается тогда же: "полтора часа" отклоняется при сохранении, 1h 30m принимается.
Состояние и ревизии
У правила два состояния: включено и выключено. Создается оно выключенным. Состояние переключается прямо в строке списка правил и на форме правила, рядом с названием, и сохраняется вместе с остальными полями: отдельного действия публикации нет.
Сохранение и есть публикация. Каждое сохранение замораживает содержимое в ревизию, и исполнение читает только ревизии: то, что сохранено, и есть то, что действует.
Ревизии не переписываются. Возврат к старой ревизии это новое сохранение со старым содержимым: история только растет. Каждая запись в журнале называет ревизию, которой правило действовало, и это можно проверить в течение 90 дней, пока журнал хранит запись, даже после удаления правила: удаление мягкое, журнал и ревизии остаются читаемыми.
Проверка
Проверка это главный экран раздела: правило прогоняется по настоящим задачам, не записывая ничего. Тот же разбор условия, те же права, тот же порядок действий; вместо выполнения собирается план: какие задачи подошли, какие действия были бы выполнены, каким был бы внешний вызов, вплоть до тела запроса с замаскированным секретом. Какие задачи не подошли, тоже видно.
Проверить можно и выключенное правило: это единственный способ увидеть, что правило будет делать, до того, как оно начнет. Проверка ограничена, потому что откатываемый прогон обходится так же дорого, как настоящая работа: до 50 задач за прогон, до 6 прогонов в минуту на пользователя, до 10 секунд на прогон.
Расписания
Правило по расписанию не ждет события: оно задает собственную выборку на QQL, время и повторение: ежедневно, еженедельно по дням недели, ежемесячно по числам.
- Часовой пояс принадлежит правилу, а не компании. В распределенной компании "каждый понедельник в 9:00" это разное время для разных правил; пояс компании лишь подсказка при создании.
- Пропущенное не догоняется. Если продукт был недоступен в назначенное время, правило выполнится в следующее назначенное время один раз. После восстановления пропущенные запуски не выполняются: три пропущенных понедельника не означают три прогона во вторник.
- Один запуск обрабатывает до 500 задач. Если выборка шире, правило обрабатывает 500 и помечает, сколько осталось; после трех подрезанных запусков подряд владельцу приходит письмо.
- Каждая задача выборки обрабатывается в собственной транзакции: сбой на одной задаче записывается и считается, остальная выборка продолжается.
- Если предыдущий запуск не завершился, очередной пропускается с записью в журнал: два запуска одного правила не идут одновременно.
Каскады и их предел
Действие правила может вызвать другие правила: перевод статуса это событие "задача переведена". Такая цепочка ограничена:
- Правило не срабатывает на собственные последствия: в пределах одной цепочки каждое правило срабатывает не больше одного раза. Замкнувшаяся петля обрывается с записью в журнал.
- Глубина каскада ограничена: по умолчанию 3. Дальше цепочка останавливается с записью в журнал.
- Частота ограничена: по умолчанию 60 срабатываний в минуту на компанию. Срабатывания сверх этого отклоняются с записью в журнале.
У всей цепочки один идентификатор корреляции: в журнале видно, что чем было вызвано и на какой глубине.
Внешние вызовы
Правило может отправить данные за пределы Quevell. Это устроено так, чтобы "куда" и "что" были решениями компании, а не правила:
- Разрешенные адреса. Вызовы идут только на хосты из списка компании, который ведет администратор компании. Пустой список означает, что внешние вызовы выключены. Удаление адреса из списка не удаляет правила: их вызовы начинают отклоняться, с записью в журнал.
- Только HTTPS. Адрес всегда собирается как
https://хост/путь; вызов по HTTP задать нельзя. Методы: POST, PUT, PATCH. - Уходит только перечисленное. Правило перечисляет поля, которые уходят из продукта:
key,type,status,link,summary,priorityи пользовательские поля по имени. Отправить "всю задачу" нельзя: ничего не уходит по умолчанию. - Секрет авторизации хранится зашифрованным, в интерфейсе всегда показывается маской и не записывается в журнал. Заменить его можно, увидеть снова нельзя.
Тело запроса фиксированного формата, версия 1: version, event, sentAt, idempotencyKey, rule (идентификатор, имя, ревизия) и issue ровно с перечисленными полями. Ограничения: 5 секунд на вызов, 64 КБ на запрос и на читаемую часть ответа. В журнал записывается факт вызова и статус ответа; тело ответа не записывается никогда.
Автоотключение
Правило, чьи отложенные действия падают подряд, выключается само: по умолчанию после 5 сбоев подряд. Это записывается в журнал, а в списке правил такое правило помечено как выключенное продуктом, а не рукой.
Что делать: открыть журнал правила, найти причину последних сбоев, исправить и включить правило заново. Включение обнуляет счетчик сбоев.
Журнал
Журнал это одна лента: срабатывания и отказы вместе. Свернутая строка показывает три вещи: что вышло, о какой задаче речь и когда. Задача названа ключом и заголовком и открывается по ссылке.
Строка раскрывается на месте и объясняет один запуск: задача со ссылкой на нее и отдельной ссылкой на ее историю, событие, разбудившее правило, условие и выполнилось ли оно, действия по порядку правила с результатом каждого, время до секунды и ревизия. У каждого исхода свое объяснение: отказ по правам называет, чьи права и на каком действии; обрыв по глубине и прерванный цикл называют цепочку; упавшее действие называет, какое и что откатилось; выборка шире одного запуска называет числа; внешний вызов называет адрес и ответ.
Запуск, который ничего не сделал, тоже попадает в журнал: правило посмотрело, условие не выполнилось, и это записано вместе со значениями полей задачи, которые проверяло условие. Молчание объяснить труднее всего.
Событие касается одной задачи, поэтому и запись одна на задачу. Запуск по расписанию касается выборки, поэтому запись одна на запуск и в ней указано, сколько задач просмотрено; про конкретную задачу ответит проверка на живых данных.
Ключ задачи записывается в строку журнала в момент записи. Задача удаляется только вместе с проектом, и журнал переживает то, что описывает: у такой строки остается ключ текстом, без ссылки.
Журнал одного правила лежит внутри правила и виден каждому, кто видит само правило. Лента по всей компании это отдельное право: его выдают, по умолчанию оно есть у администраторов компании. Задачу запись называет только тому, кто может ее открыть.
Ограничения
Ограничения принадлежат компании и изменяются администратором компании. Значения по умолчанию:
| Ограничение | По умолчанию |
|---|---|
| Правил в компании | 100 |
| Действий в правиле | 10 |
| Срабатываний в минуту на компанию | 60 |
| Глубина каскада | 3 |
| Автоотключение после сбоев подряд | 5 |
| Задач за прогон проверки | 50 |
| Прогонов проверки в минуту на пользователя | 6 |
| Задач за один запуск по расписанию | 500 |
| Время на внешний вызов | 5 секунд |