Связано с Testlify

Timesheets by Appforest - плагин для Jira

Создана платформа учёта рабочего времени для Jira, которую используют по всей компании и на Atlassian Marketplace: заменила стороннее решение и сэкономила более 9 000 $ в год на лицензиях.

В Testlify учёт рабочего времени инженеров зависел от дорогого стороннего приложения, оторванного от повседневных рабочих процессов в Jira. Я руководил фронтенд-разработкой Timesheets by Appforest, интегрированного приложения для Jira, предназначенного для учёта времени, планирования загрузки команды и распределения затрат по проектам. Продукт опубликован на Atlassian Marketplace и развёрнут внутри компании.

Timesheets by Appforest - обзор

Что я построил

  • Интеграция с Atlassian Marketplace: построено на Atlassian Forge, изолированной серверлесс-платформе Atlassian, с чётко ограниченными правами чтения/записи в Jira по принципу минимальных привилегий, вместо собственного бэкенда.
  • Встроенный интерфейс Jira: панель учёта времени, встроенная прямо в задачи Jira для быстрых записей, плюс полноценное дашборд-приложение для календарных представлений и подачи табелей ежедневно/еженедельно, без переключения контекста.
  • Отчётность и аналитика: отчётные представления, объединяющие данные Jira и внутренние логи времени для учёта спринтов и отслеживания затрат по проектам.

Timesheets by Appforest - учёт времени

Почему это важно

Опубликованный на Atlassian Marketplace для внешних клиентов, плагин также заменил внутри компании устаревшее ПО учёта времени, сэкономив более 9 000 $ в год на лицензиях и дав руководству видимость загрузки инженерных ресурсов в реальном времени.

Команда и зона ответственности

Я руководил фронтенд-разработкой в небольшой команде: 397 коммитов от 4 участников с середины 2024 года, продукт активно поддерживается по сей день. Это многолетний продукт с несколькими участниками, а не сольная разработка, и моя роль была ограничена фронтендом, а не полным владением стеком.

Forge, а не Connect

Приложение работает на Atlassian Forge, изолированной серверлесс-среде выполнения, а не на более старом фреймворке Connect (самостоятельно размещаемое приложение с собственным бэкендом, взаимодействующее с Jira через iframe и вебхуки). Forge означает отсутствие сервера, который нужно запускать или патчить для Jira-стороны: Atlassian размещает среду выполнения, обеспечивает соблюдение областей разрешений, объявленных в манифесте, и накладывает серверлесс-ограничения (Node 22 на ARM64, 1024 МБ памяти, ограниченное время выполнения на один вызов), вместо того чтобы оставлять эту инфраструктуру нам.

Два интерфейса для двух разных задач

Продукт намеренно разделён на два интерфейса вместо одного. Панель в контексте задачи закрывает частый случай: залогировать время по уже открытой задаче одним кликом, не покидая её. Отдельное полноценное дашборд-приложение (календарные представления, отчёты, настройки администратора, учёт затрат) закрывает планирование и надзор: задачи, которым нужно полноценное рабочее пространство, а не боковая панель. Каждый интерфейс построен под свою задачу, вместо того чтобы заставлять один интерфейс делать и то, и другое.

Настоящая межпроектная интеграция

Это не изолированное приложение. Функции-резолверы явно принимают и очищают предложения записей времени из Google Calendar, Outlook Calendar и сопутствующего расширения Appforest Timetracker для VS Code, так что кодовая активность разработчика в VS Code может появиться здесь как предложенная запись в табеле, вместо необходимости вводить её вручную.

Модель данных и масштаб

  • Области разрешений Forge узкие и явные (read:jira-work, write:jira-work, manage:jira-configuration, плюс чтение пользователя/токена), а не широкий разрешающий грант.
  • UI-компоненты используют собственные дизайн-токены Atlassian (@atlaskit), поэтому плагин визуально совпадает с нативной Jira, а не выглядит как приклеенное стороннее решение.
  • Дашборд-приложение написано на Vue 3 с Pinia для состояния, 46 компонентов, отдельно от React-панели в контексте задачи; два фронтенд-стека в одном продукте, а не одна общая кодовая база, искусственно растянутая на оба интерфейса.
  • Выделение памяти для функции Forge было увеличено с 256 МБ до 1024 МБ после реальной проблемы с производительностью, а не установлено как значение по умолчанию.

Движок отчётности за этими представлениями затрат/спринтов масштабирует собственную стратегию запросов: он разбивает поисковые запросы Jira JQL на пакеты по 25, 50 или 100 задач в зависимости от объёма отчёта, извлекая 16 полей на задачу, вместо того чтобы отправлять один запрос на задачу или единый неограниченный запрос, рискующий таймаутом на большом спринте.

Build vs. Buy

Forge вместо самостоятельно размещаемого приложения Connect: среда выполнения и модель разрешений Atlassian заменяют инфраструктуру, которую этой команде иначе пришлось бы строить и защищать самой. Нативные дизайн-токены Atlassian вместо собственного UI-набора: плагин наследует внешний вид и паттерны взаимодействия самой Jira, вместо поддержки параллельной дизайн-системы только для этого приложения.

Стек

Atlassian Forge (Node 22, ARM64), React 18 для панели в контексте задачи, Vue 3 с Pinia для дашборд-приложения, токены и примитивы Atlassian Design System, развёрнуто через Atlassian Marketplace.