Обзор архитектуры

На этой странице представлен очень высокий уровень зависимостей Jira и роли, которую каждый играет в Jira. На этой странице приводятся ссылки на внешние ресурсы (сайты, книги), где можно найти дополнительную информацию.

Техническое введение

Jira - это веб-приложение, написанное на Java. Он развертывается в качестве стандартного файла WAR WAR в контейнере сервлетов Java, таком как Tomcat.

WebWork

Поскольку Jira является веб-приложением, пользователи взаимодействуют с Jira с помощью веб-браузера. Jira использует WebWork 1 OpenSymphony для обработки веб-запросов, представленных пользователями. Обратите внимание, что используется WebWork 1, а не 2. WebWork 1 - это фреймворк MVC, подобный Struts. Каждый запрос обрабатывается действием WebWork, которое обычно использует другие объекты, такие как утилита и классы Manager для выполнения задачи(task).

Jira использует JSP для слоя «Вид». Таким образом, большая часть HTML, который предоставляется пользователю в качестве ответа на их веб-запрос, генерируется JSP. Поэтому для генерации ответа действие WebWork использует JSP.

Для получения дополнительной информации о WebWork 1 см. Его онлайн-документацию.

actions.xml и действия Jira WebWork

Фреймворк веб-приложения определяет, что происходит при посещении определенного URL-адреса в веб-приложении. Например, URL-адрес простой статической страницы без динамического содержимого может заканчиваться на «.html». Суффикс «.jspa» указывает, что URL-адрес относится к странице, содержимое которой было создано с использованием страниц сервера Java (JSP). JSP-файлы - это шаблоны, которые могут содержать как HTML, так и команды для создания HTML. Команды относятся к объекту Java, а методы объекта называются так же, как и в обычной программе Java. Сопоставление URL-адреса с Java-классом в Jira выполняется с использованием фреймворка веб-приложения Webwork 1.x. Оригинальную документацию для Webwork 1.x можно найти на opensymphony.com/webwork_old/src/docs/manual и wiki.opensymphony.com/display/WW1/Home.

Однако эта структура была заменена Webwork 2, которая используется Confluence, Bamboo and Crowd

Сопоставления между URL и классами объявляются в файле actions.xml (src / webapp / WEB-INF / classes / actions.xml). Типичный элемент файла выглядит следующим образом:


    <!-- Workflow Transitions -->
    <action name="admin.workflow.ViewWorkflowTransition" alias="ViewWorkflowTransition" roles-required="admin">
        <view name="success">/secure/admin/views/workflow/viewworkflowtransition.jsp</view>

        <command name="moveWorkflowFunctionUp" alias="MoveWorkflowFunctionUp">
            <view name="error">/secure/admin/views/workflow/viewworkflowtransition.jsp</view>
            <view name="success">/secure/admin/views/workflow/viewworkflowtransition.jsp</view>
        </command>

        <command name="moveWorkflowFunctionDown" alias="MoveWorkflowFunctionDown">
            <view name="error">/secure/admin/views/workflow/viewworkflowtransition.jsp</view>
            <view name="success">/secure/admin/views/workflow/viewworkflowtransition.jsp</view>
        </command>
    </action>

Несколько замечаний:

  • Каждый элемент действия имеет атрибут alias, который является частью URL-адреса, который вы видите в веб-браузере. Элемент name - это имя класса Java, который используется псевдонимом.
  • Имя(name) элемента вида(view) - это строка, возвращаемая из действия, чтобы решить, какое представление будет отображаться после вызова действия.
  • Имя(name) команды(command) элемента может использоваться в URL как суффикс !CommandName и реализовываться в классе Action как метод doCommandName ().
  • Все действия, не требующие роли, указанной в требуемых ролях(roles-required), должны управлять собственной безопасностью или быть доступными для всех пользователей.

Элементы команды являются необязательными и используются, когда несколько взаимодействий принадлежат одному и тому же Action. Имя команды указывается в URL-адресе следующим образом:


SomeAction!myCommand.jspa

Команда реализуется в методе класса Action с соответствующим именем:


public String doMyCommand() {

    // implement the command logic here

    return "someview";
}

Метод doExecute выполняется, когда никакая команда не запрашивается, то есть голый /path/to/MyAction.jspa.

Безопасность

При добавлении действия в action.xml вы должны убедиться, что задано соответствующее значение для ролей (roles-required). Это гарантирует, что только  пользователи в разрешенной роли могут выполнить действие. Для действий, которые могут выполняться с помощью безопасности на уровне приложений, например тех действий, которые могут быть предоставлены администраторам проекта, идентифицированным в ходе курса администрирования Jira, не может потребоваться никакая роль, аналогичные действия по настройке и другие, которые управляют своими собственными разрешениями. Для некоторых действий должна присутствовать роль использования. Это гарантирует, что пользователь зарегистрирован и идентифицирован.

Роль администратора требуется для всех действий администратора, поэтому вы должны быть уверены, что добавляете действие, в котором ваше новое действие имеет требуемые роли = «admin»(roles-required=“admin” ), или уверены, что оно ему не нужено. Роль sysadmin требует, чтобы пользователь был системным администратором, а роль использования (use) требует, чтобы они просто вошли в систему. (Другие определения можно найти в Permissions.java в источнике).

 

Действия не заботятся о пути URI, просто ActionName.jspa и необязательно суффикс !CommandName.

Плагины Webwork: у Jira могут быть новые действия, определенные с помощью Webwork. Эти действия также могут отменить существующие действия в Jira. Тем не менее, jsp-файлы в настоящее время не могут быть добавлены в файл-jar плагина и должны быть установлены на отдельном этапе при развертывании такого плагина. Существует плагин Webwork Sample, который содержит примеры действий и классов, которые могут быть использованы для более полного понимания этой темы.

Seraph

Почти вся аутентификация в Jira выполняется через Seraph, фреймворк  веб-аутентификации с открытым исходным кодом Atlassian. Целью seraph является предоставление простой, расширяемой системы аутентификации, которую мы можем использовать на любом сервере приложений.

Seraph реализован как фильтр сервлетов. Его единственная работа - с помощью веб-запроса (request ) - связать этот запрос(request ) с конкретным пользователем. Он поддерживает несколько методов аутентификации, включая базовую проверку подлинности HTTP, аутентификацию на основе форм (т. е. перенаправление на внутреннюю или внешнюю форму входа) и поиск учетных данных, уже сохраненных в сеансе пользователя (например, cookie, установленный системой единого входа).

Seraph не выполняет никакого управления пользователями. Он просто проверяет учетные данные входящего запроса(request) и делегирует любые функции управления пользователями (поиск пользователя, проверка правильности пароля пользователя) для управления пользователями Jira - Embedded Crowd (обсуждается далее в этом документе).

Если бы вы хотели интегрировать Jira с решением Single Sign-On (SSO)(системой единого входа), вы бы сделали это, написав собственный аутентификатор Seraph (и на самом деле это сделали многие клиенты). Обратите внимание, что по умолчанию Jira не поставляется с какой-либо интеграцией SSO, клиенты должны сами писать собственный аутентификатор. Вы также можете проверить Crowd и интегрировать Jira с Crowd.

Еще одна очень важная функция, которую выполняет Seraph в Jira, - разрешить пользователям с правами глобального администратора доступ к действиям WebWork, которые позволяют пользователю выполнять административные задачи. Доступ к этим действиям WebWork осуществляется по URL-адресам, начинающимся с «/ admin». Дополнительную информацию о разрешениях Jira см. в документации Jira.

Для получения дополнительной информации о том, как работает seraphвнутри, см. эту страницу.

Встраиваемая Crowd

Crowd - это инструмент управления идентификацией Atlassian и системой единого входа (SSO).

И Jira, и Confluence теперь внедряют подмножество основных модулей Crowd для мощного и последовательного управления пользователями.

Встраиваемая Crowd предоставляет следующие функции:

  1. Сохраняет пользователей и группы в базе данных Jira
  2. Сохраняет членство в группе (пользователи, входящие в группы) в Jira's DB
  3. Аутентифицирует пользователей (проверяет, совпадает ли пароль пользователя)
  4. Предоставляет API, который позволяет управлять (создавать, удалять) пользователей, группы и членство в группах (добавлять и удалять пользователей из групп).
  5. Позволяет Jira подключаться к внешним системам для получения данных пользователя / группы (например, Microsoft AD, LDAP или автономного сервера Crowd)
  6. Сохраняет копию любых внешних данных в локальной базе данных для более быстрого поиска и синхронизирует их в фоновом режиме.

Как упоминалось ранее, Seraph делегирует внедренную Crowd для аутентификации пользователя (т. е. проверяет, был ли введен правильный пароль, когда пользователь пытается войти в систему).

Информацию о таблицах базы данных (DB), используемых внедренной Crowd, см. в разделе «Пользователи и группы» на странице схемы базы данных Jira.

Jira поддерживает использование Jira: PropertySet для хранения пользовательских предпочтений

В Jira предпочтения включают такие вещи, как:

  • будет ли пользователь получать HTML или текстовое сообщение электронной почты
  • количество задач(issues) для отображения в навигаторе задач Jira
  • получать уведомления о собственных обновлениях пользователей по задачам(issues)
  • Местоположение (Язык) пользователя

Кроме того, встроенная Crowd также имеет собственную концепцию «Атрибуты пользователя».

Эти две концепции, хотя и связаны друг с другом, предоставляют различные преимущества и недостатки, поэтому разработчики плагинов должны учитывать свои индивидуальные требования, чтобы выбрать более подходящий способ.

Свойства пользователя в PropertySets

  • Набираются значения PropertySet.

Предусмотрено 11 различных типов, включая числа, даты, массивы байтов, проанализированные XML DOM, вложенные свойства и произвольные сериализованные объекты.

  • Они могут быть сколь угодно большими, поскольку они могут быть сохранены как CLOB или BLOB в базе данных.

Эти большие объемы данных не подходят для поиска.

  • PropertySets позволяют только сохранить одно значение для данного ключа.

Пользовательские атрибуты встроенной Crowd

  • Атрибуты Crowd хранят только текстовые данные.
  • Чтобы облегчить поиск, Crowd ограничивает значения до 255 символов или меньше.(Обратите внимание: MySQL имеет ограничение, которое означает, что вы не можете индексировать столбцы с> 255 символами)
  • Crowd позволяет хранить несколько значений по одному ключу.

Эти значения должны быть уникальными с тестом, нечувствительным к регистру.(Это следует за стандартным поведением LDAP).

PropertySetOpenSymphony's PropertySet - это фреймворк, который может хранить набор свойств (пары ключ / значение) для определенной «сущности» с уникальным идентификатором. «Сущность» может быть любым желанием. Например, UserPropertyManager Jira использует PropertySet для хранения пользовательских настроек. Поэтому в этом случае «сущность» является Пользователем.

Каждое свойство имеет ключ (который всегда является java.lang.String) и значением, которое может быть:

  1. java.lang.String
  2. java.lang.Long
  3. java.util.Date
  4. java.lang.Double

Каждое свойство всегда связано с одной сущностью. Что касается PropertySet, то «entity» имеет имя сущности и числовой идентификатор. Пока одна и та же комбинация имени / идентификатора сущности используется для хранения значения и получения значения, все будет работать.

В Jira PropertySet используются следующие таблицы базы данных:

  1. propertyentry - записывает имя и идентификатор сущности для свойства, его ключа и типа данных значения свойства. Каждая запись в этой таблице также имеет уникальный идентификатор.
  2. propertystring - записывает значения String
  3. propertydecimal - записывает значения Double
  4. propertydate - записывает значения даты
  5. propertynumber - записывает значения Long

 

Каждая из записей в таблицах свойств <type> также имеет столбец идентификатора. Идентификатор совпадает с идентификатором записи свойства для этого свойства. Поскольку ключ и значение свойства разбиты на 2 таблицы, чтобы получить значение свойства, необходимо выполнить соединение между таблицей свойств и одной из таблиц свойств <type>. Какую таблицу свойств <type> объединяет значение столбца propertytype в записи propertyentry.

Ниже приведен пример полного имени, сохраненного для пользователя:

(что делать)

PropertySet используется в Jira:

  1. Чтобы пользователь UserPropertyManager сохранял предпочтения пользователей.
  2. Чтобы сохранить свойства приложения, которые являются настраиваемыми параметрами, которые пользователь может изменить, чтобы настроить их установку Jira.
  3. Чтобы сохранять выбранные предпочтения гаджетов на пользовательских панелях управления.

 

Для получения дополнительной информации о PropertySet см. его документацию.  Также см. Схему базы данных Jira.

Приложения для Jira

Семейство приложений Jira в настоящее время состоит из Jira Software, Jira Service Desk и Jira Core. Приложение Jira построено на платформе Jira и расширяет и изменяет базовые функции, предоставляемые платформой Jira. Например, приложение Jira Software предоставляет возможности разработки программного обеспечения, которые не являются частью платформы Jira, такие как гибкие доски, связанные данные инструментов разработки (например, коммиты, сборки и т. д.) и шаблоны программных проектов.

Приложение представляет собой кучу надстроек, которые работают вместе над платформой для обеспечения функциональности. Дополнения можно разделить на три типа:

  1. Первичная надстройка: надстройка, определяющая продукт. Отключение этой надстройки приведет к отключению продукта. Для каждого приложения есть только одна основная надстройка. Основная надстройка может также обеспечить функциональность приложения.
  2. Надстройка приложения: надстройка, предоставляющая основные функции для приложения. Все надстройки продукта должны быть включены и работать, чтобы продукт считался рабочим. Надстройка продукта принадлежит продукту (то есть надстройка приложения не будет работать без основного дополнения приложения).
  3. Надстройки утилиты: надстройка, которая предоставляет утилиты для первичных и / или надстроек приложений. Надстройки утилиты не принадлежат Приложению (т. е. надстройка утилиты будет работать без основной надстройки приложения) и может использоваться несколькими Приложениями или другими надстройками без приложения.

 

Приложение может быть установлено, обновлено, отключено, удалено, лицензировано, и его конфигурация будет очищена динамически.

 

Если вы строите одно из приложений Jira, а не на платформе Jira, вам также необходимо знать следующее:

  • Лицензирование: каждое приложение Jira может быть лицензировано индивидуально. Вы можете установить одно или несколько приложений в Jira через страницу «Управление приложениями». Основное приложение Jira, Jira Core(ядро), обеспечивает базовые возможности отслеживания проектов для бизнес-команд. Все приложения Jira включают доступ к Jira Core(ядро), или вы можете лицензировать Jira Core(ядро) только для пользователей, которым необходим базовый доступ к Jira.
  • Управление пользователями: администраторы Jira могут предоставлять доступ к лицензированным приложениям определенным группам (например, jira-software-users) через страницу * Application access*(Доступ к приложениям) в Jira. Затем пользователи могут быть добавлены в эти группы, чтобы предоставить им доступ к приложениям Jira. Предоставление доступа пользователю для приложения, занимает место в лицензии для этого приложения Jira. Например, администратор Jira может предоставить пользователю доступ к  программному обеспечению Jira, которое будет использовать одно из мест в лицензии Jira Software для этого экземпляра.
  • Типы проектов: установка и лицензирование приложения в Jira предоставляет дополнительные типы проектов, характерные для этого приложения. Например, установка программного обеспечения Jira  позволяет пользователям создавать проект типа «разработка программного обеспечения Scrum», в котором есть доски, собственный рабочий процесс и собственные типы задач(issue).
  • API: платформа Jira имеет набор REST API и Java API. Кроме того, каждое приложение Jira имеет свои собственные API REST и Java API, которые позволяют программный доступ к функциональным возможностям, характерным для приложения. Например, программное обеспечение Jira REST API включает в себя методы создания, изменения и удаления спринтов.
  • Модули надстроек: модули надстроек:- это точки расширения пользовательского интерфейса UI, которые надстройки могут использовать для вставки содержимого в различные области интерфейса хост-приложения. Модули надстроек являются частью платформы Jira и поэтому являются общими для всех приложений Jira. Однако имейте в виду, что вы можете использовать эти модули для доступа к частям пользовательского интерфейса, специфичным для приложения. Например, вы можете добавить раскрывающийся список к доске agile в программном обеспечении Jira, указав модуль веб-панели, в котором есть «ссылки досок».

Утилита Jira и  классы Менеджера

Многие бизнес-логики в Jira реализованы в сотнях классов Java. Классы могут быть простыми классами утилиты или объектами Менеджера.

У объектов-менеджеров в Jira обычно есть одна конкретная цель (или тема). Например, com.atlassian.jira.project.version.VersionManager используется для работы с версиями проекта, то есть для создания, обновления, удаления и извлечения версий.

Объекты Manager используют множество внешних зависимостей, большинство из которых являются с открытым исходным кодом, но некоторые из них разрабатываются Atlassian и обычно используются между продуктами Atlassian.

Поскольку классы Jira 3.7 Manager обычно также обертываются соответствующим классом обслуживания. Идея состоит в том, что любая валидация необходимой бизнес-логики выполняется классами обслуживания, тогда как классы менеджера ответственны за фактическое выполнение действия. Например, см. Метод validateCreate ProjectService и соответствующий метод создания. Затем ProjectManager имеет только созданный метод, который уйдет и создаст проект, предполагая, что любая проверка уже была выполнена клиентом. Это позволяет клиентам просто вызвать класс службы для проверки и создания проекта, но при этом позволяет гибко обходить проверку, если ProjectManager используется напрямую.

Jira-специфические атласские события

Библиотека событий Atlassian доступна для всех надстроек, позволяя им слушать события, происходящие в Jira. События, доступные в Джире, показаны ниже. Вы также можете прочитать о жизненном цикле Jira надстройки или попробовать написать слушателей событий Jira с помощью учебника библиотеки событий atlassian.

Тип события

Описание

Источник

ApplicationPropertyChangeEvent

Брошено, когда в свойствах приложения происходят изменения.

Jira

IssueEvent

Бросок при возникновении изменений в задачах.

Jira

UserEvent

Брошено, когда изменения происходят у пользователей.

Jira

ClearCacheEvent

Брошено, когда Jira должна очистить и повторно инициализировать все свои кеши.

Jira

ClearHttpCacheEvent

Событие, которое приложение-хост может использовать для очистки кэша Shindig.

Gadgets

XMLRestoreFinishedEvent

Брошено при прекращении восстановления резервной копии XML.

Crowd

События версии:

 

·         VersionArchiveEvent

·         VersionCreateEvent

·         VersionDeleteEvent

·         VersionMergeEvent

·         VersionMoveEvent

·         VersionReleaseEvent

·         VersionUnarchiveEvent

·         VersionUnreleaseEvent

Бросок когда изменения сделаны в версии проекта.

Примечание. Все они расширяют AbstractVersionEvent)

Jira

События проекта:

 

·         ProjectCreatedEvent

·         ProjectUpdatedEvent

·         ProjectDeletedEvent

Бросок когда изменения сделаны в  проекте

 

Примечание. Все они расширяют AbstractProjectEvent)

Jira

По материалам Atlassian JIRA  Server Developer Architecture overview