Управление проектами
Project tracker - инструмент для управления проектами, организации рабочих процессов команд, мониторинга задач. Project tracker обеспечивает:
создание отдельных проектов;
планирование спринтов;
ведение бэклога задач;
постановку задач и отслеживание их статуса в текущем спринте на канбан-доске;
учет времени работы над задачами.
Создание портфеля проектов
Для создания портфеля проектов в рабочем пространстве Справочники перейдите в Портфели проектов, нажмите +, заполните информацию и сохраните:
Откроется информация о созданном портфеле:
В меню доступны разделы создания проектов (1), библиотека документов (2) и используемые справочники (3), переход в список портфелей (4).
Для портфеля будет автоматически создано рабочее пространство.
Создание проекта
Перейдите в Проекты нажмите +:
Доступно создание простого проекта и scrum проекта, поддерживающего спринты и бэклог.
Ниже рассмотрим создание scrum проекта.
На вкладке Основные обязательно укажите Название, Ключ автоматически сформируется из первых букв названия проекта, Ответственным автоматически назначится текущий пользователь, может быть изменен.
На вкладке Сроки укажите Дату старта и Планируемую дату окончания. При необходимости заполните дополнительные поля во вкладках. Сохраните.
Для проекта будет автоматически создано рабочее пространство.
Рабочее пространство проекта
Карточка рабочего пространства откроется сразу после создания проекта:
В дальнейшем портфель (1) и его проекты (2) доступны в списке рабочих пространств:
Предоставление доступа к рабочему пространству
Перейдите в режим редактирования:
Настройки рабочего пространства:
Определите участников. У участника могут быть права – пользователя или менеджера (с возможностью управления рабочим пространством). Пользователь, создающий пространство, получает роль «Менеджер».
Действия с проектом
Изменить статус
TBD
Перенести проект
TBD
Разделы
Активный спринт
На доске Scrum отображаются задачи, над которыми в данный момент работает команда. Задачи можно создавать и обновлять, а также перемещать их по рабочему процессу с помощью функции «перетаскивания».
Примечание
Активным может быть только 1 спринт.
Задачи проекта
Содержит список задач проекта. Представлены задачи во всех статусах.
Создание задачи
Нажмите +, выберите тип задачи
и заполните поля формы, вложите файлы при необходимости:
Статус задачи при создании по умолчанию – бэклог.
Карточка задачи
Карточка задачи состоит из виджетов:
Примечание
Чтобы ссылка на commit или MR (запросы на слияние) добавилась к задаче, укажите идентификатор задачи Project tracker, в комментарии к commit (Commit message) или названии (Title) merge request в GitLab. О настройке синхронизации с Gitlab см. ниже
Перевод в статус
Перевод задачи в статус осуществляется по действию «Изменить статус»:
Регистрация времени работы над задачей
Запись времени работы над задачей осуществляется по действию «Записать время»:
Добавление задачи в спринт
Указать спринт напрямую в карточке задачи:
Выбрать действие в журнале для быстрого добавления задачи в спринт:
Выбрать спринт:
Через групповое действие:
Эпики
Эпик — крупная цель или задача, включающая множество меньших задач.
В разделе по кнопке + доступно создание не только эпика, но и задач другого типа.
Карточка эпика
Добавление задачи в эпик
В карточке эпика перейти в виджет «Задачи эпика»:
Для уже созданных задач указать эпик напрямую в карточке задачи:
Бэклог
Бэклог продукта - упорядоченный и регулярно обновляемый перечень всех задач, запланированных для разработки и совершенствования продукта. Представлены задачи только в статусе «Бэклог».
В разделе по кнопке + доступно создание задач разного типа. См. подробнее Создание задачи
Карточка задачи бэклога
Карточка задачи состоит из виджетов:
Добавление задачи бэклога в спринт
Спринты
Спринт — фиксированный временной интервал в проектной деятельности, в пределах которого выполняются определённые задачи, выбранные из бэклога.
Создание спринта
Нажмите + и заполните поля формы:
Карточка спринта
Карточка спринта содержит статистику и прогресс его выполнения, список задач:
Запуск спринта
Перейдите в карточку спринта и выберите действие «Запустить спринт»
Подтвердите:
Спринт переходит в активный, все задачи спринта в статусе «Бэклог» будут автоматически переведены в статус «К выполнению».
Завершение спринта
Перейдите в карточку спринта и выберите действие «Завершить спринт»
Примечание
Если в спринте остались незавершенные задачи, то перед завершением текущего спринта их необходимо перенести в бэклог или другой спринт.
Релизы
Релиз — список готовых версий продукта.
Карточка релиза:
Подробно о функционале см. Релизы
Компоненты
Компоненты выполняют функцию категорий. Они позволяют разделить работу над большим проектом на отдельные части.
Добавленные в данном разделе компоненты, становятся доступны к выбору при создании задачи.
Теги
Теги позволяют классифицировать запросы в свободной форме, менее формально, чем компоненты.
Добавленные в данном разделе теги, становятся доступны к выбору при создании задачи.
Учет времени
Функционал, позволяющий отслеживать время, затраченное сотрудником на выполнение конкретной задачи или работу с документом, непосредственно из карточки задачи или документа.
Подробно о функционале см. Учет времени
Библиотека документов
Иерархический интерфейс для совместной работы с папками и документами.
В библиотеке доступны:
загрузка файлов и папок как по кнопке, так и перетаскиванием.
создание документов (текстовых, табличных, презентаций).
Подробно о функционале см. Библиотека документов
Настройки синхронизации Commits и Мerge requests
Включение данной интеграции позволяет автоматически отображать информацию о коммитах и запросах на слияние из GitLab в карточках задач проекта.
Для запуска синхронизаций commits и merge request необходимо:
Создать в GitLab Access token. В профиле GitLab перейти в User settings -> Access tokens
При создании токена обязательно необходимо указать Select scopes - read_api
Далее скопировать созданный токен:
Перейти в Рабочее пространство «Раздел администратора» → Модель → Секреты и указать его в Секрете gitlab-access-token
Перейти в Рабочее пространство «Раздел администратора» → Модель → Конечные точки настроить конечную точку gitlab-domain-url:
указать URL GitLab – например, https://gitlab.yourcompany.ru
выбрать в Данных для аутентификации Токен доступа Gitlab
Перейти в Рабочее пространство «Раздел администратора» → Интеграция → Camel DSL, запустить gitlab-merge-requests-sync и gitlab-commits-sync:
Примечание
Синхронизация будет происходить по всем проектам в GitLab, к которым созданный токен имеет доступ
Маппинг коммитов и MR к задачам происходит по ключу задачи Project tracker, указанному в комментарии к commit или названии MR в GitLab. То есть, если ключ задачи в Project Tracker равен PT-1, то в комментарии к commit или названии MR в GitLab должно быть указано PT-1
Подробнее о действиях, доступных с Camel DSL.
Настройка импорта задач из Jira
Введение
Данный раздел описывает настройку синхронизации проектов из Jira в Citeck. Функциональность реализована с использованием Apache Camel DSL и позволяет настраивать гибкие сценарии импорта данных.
Основные возможности
Импорт задач (issues) из проекта Jira в Citeck;
Импорт комментариев к задачам;
Импорт затраченного времени (work logs);
Импорт компонентов (components);
Импорт тегов (tags/labels);
Импорт релизов (releases);
Импорт спринтов;
Импорт вложений (attachments);
Настраиваемое маппирование типов задач, статусов и приоритетов;
Настраиваемое преобразование атрибутов;
Импорт связей между задачами.
Пример конфигурации
- route:
# Пример импорта задач из Jira
# Проект должен быть создан в Citeck
id: jira-crm-import
from:
uri: "jira-issues:crm-import"
# Проверьте доступ к jira пользователя, под которым запускается импорт
parameters:
delay: 5000
jiraHost: '{{ecos-endpoint:jira-host/url}}'
jiraUser: '{{ecos-endpoint:jira-host/credentials/username}}'
jiraToken: '{{ecos-endpoint:jira-host/credentials/password}}'
projectKey: "ECOSCRM"
steps:
#- to: log:raw-jira-issues?level=INFO&showBody=true
# Указание workspace и проекта обязательно
- set-property:
name: jiraImportedRecordIdPrefix
constant: "imported-jira"
- set-property:
name: _workspace
constant: "ECOSCRM"
- set-property:
name: link-project:project
constant: "emodel/ept-project@eadfe69d-676a-42a5-b21f-2db7d5fc18bf"
- set-property:
name: "valuesMapping"
constant: >
{
"_type": {
"10000": "emodel/type@ept-issue-epic",
"10001": "emodel/type@ept-issue-story",
"10002": "emodel/type@ept-issue-task",
"10003": "emodel/type@ept-issue-subtask",
"10004": "emodel/type@ept-issue-bug",
"10501": "emodel/type@ept-issue-task",
"10500": "emodel/type@ept-issue-story",
"10503": "emodel/type@ept-issue-bug"
},
"priority": {
"1": "100_urgent",
"2": "200_high",
"3": "300_medium",
"4": "400_low"
},
"_status": {
"1": "backlog",
"10010": "backlog",
"3": "in-progress",
"10000": "to-do",
"10561": "to-do",
"10011": "to-do",
"10510": "review",
"10101": "waiting-for-qa",
"10100": "in-qa-review",
"10537": "in-qa-review",
"10565": "in-qa-review",
"10001": "done",
"10541": "done",
"10530": "on-hold",
"10006": "on-hold",
"10531": "on-hold"
},
"resolution": {
"10000": "emodel/ept-issue-resolution@done",
"10001": "emodel/ept-issue-resolution@wont-do",
"10002": "emodel/ept-issue-resolution@duplicate",
"10003": "emodel/ept-issue-resolution@cannot-reproduce",
"10400": "emodel/ept-issue-resolution@cannot-reproduce"
}
}
- set-property:
name: "valuesConverter"
constant: >
{
"description": "jiraRenderedFieldToTextArea",
"_created": "jiraDateToInstant",
"_modified": "jiraDateToInstant",
"endDate": "jiraDateToInstant",
"reporter": "emailToPersonRef",
"implementer": "emailToPersonRef",
"epicLink": "issueKeyToRef",
"remainingEstimateMills": "secondsToMills"
}
- set-property:
name: "attributesMapping"
# Json path to EPT field
constant: >
{
"fields.issuetype.id": "_type",
"fields.priority.id": "priority",
"fields.summary": "summary",
"fields.description": "description",
"fields.resolution.id": "resolution",
"fields.labels": "tags",
"fields.resolutiondate": "endDate",
"fields.status.id": "_status",
"fields.reporter.emailAddress": "reporter",
"fields.assignee.emailAddress": "implementer",
"fields.timetracking.originalEstimate": "estimatedWorks",
"fields.timetracking.remainingEstimateSeconds": "remainingEstimateMills",
"fields.created": "_created",
"fields.updated": "_modified",
"fields.customfield_10002": "epicLink"
}
- set-property:
name: "staticAttributes"
constant: >
{
"__disableAudit": true
}
- set-property:
name: "linksMapping"
constant: >
{
"10000": "issue-links:blocker",
"10001": "issue-links:clone",
"10002": "issue-links:duplicate",
"10300": "issue-links:problem",
"10003": "issue-links:relates"
}
- split:
expression:
simple: "${body}"
steps:
- set-property:
name: "originalIssue"
simple: "${body}"
# Трансформация метаданных jira в поля ept
- to:
uri: "transform-jira-issue:crm-import"
parameters:
jiraHost: '{{ecos-endpoint:jira-host/url}}'
jiraUser: '{{ecos-endpoint:jira-host/credentials/username}}'
jiraToken: '{{ecos-endpoint:jira-host/credentials/password}}'
- to: log:transformed-issue?level=INFO&showBody=true
# Создание ept задачи через records
- to: "ecos-records-mutate:?sourceId=emodel/ept-issue"
#- to: log:created-record?level=INFO&showHeaders=true
- set-header:
name: eptIssueRef
simple: "${header.recordsMutated[0]}"
- step:
id: import-comments
steps:
- set-body:
simple: "${exchangeProperty.originalIssue}"
- set-header:
name: commentLinkToRecord
simple: "${header.eptIssueRef}"
- to: "transform-jira-comment:crm-import"
- to: "ecos-records-mutate:?sourceId=emodel/comment"
#- to: log:importcomments?level=INFO&showBody=true
- step:
id: import-components
steps:
- set-body:
simple: "${exchangeProperty.originalIssue}"
- set-header:
name: eptIssueRef
simple: "${header.eptIssueRef}"
- to: "import-jira-component:crm-import"
#- to: log:importcomponents?level=INFO&showBody=true
- step:
id: import-jira-tags
steps:
- set-body:
simple: "${exchangeProperty.originalIssue}"
- set-header:
name: eptIssueRef
simple: "${header.eptIssueRef}"
- to: "import-jira-tags:crm-import"
#- to: log:importtags?level=INFO&showBody=true
- step:
id: import-releases
steps:
- set-body:
simple: "${exchangeProperty.originalIssue}"
- set-header:
name: eptIssueRef
simple: "${header.eptIssueRef}"
- to:
uri: "import-jira-releases:crm-import"
parameters:
jiraHost: "{{ecos-endpoint:jira-host/url}}"
jiraUser: "{{ecos-endpoint:jira-host/credentials/username}}"
jiraToken: "{{ecos-endpoint:jira-host/credentials/password}}"
#- to: log:importreleases?level=INFO&showBody=true
- step:
# Если настроен плагин 2FA для Jira, то в нем нужно отключить принудительный
# 2FA для url /secure/attachment
id: import-attachments
steps:
- set-body:
simple: "${exchangeProperty.originalIssue}"
- set-header:
name: eptIssueRef
simple: "${header.eptIssueRef}"
- to:
uri: "import-jira-attachment:crm-import"
parameters:
jiraHost: "{{ecos-endpoint:jira-host/url}}"
jiraUser: "{{ecos-endpoint:jira-host/credentials/username}}"
jiraToken: "{{ecos-endpoint:jira-host/credentials/password}}"
#- to: log:importattachments?level=INFO&showBody=true
- step:
id: import-sprint
steps:
- set-body:
simple: "${exchangeProperty.originalIssue}"
- set-header:
name: eptIssueRef
simple: "${header.eptIssueRef}"
- to:
uri: "import-jira-sprint:crm-import"
parameters:
# Поле в jira, в котором хранится спринт
sprintFieldId: "customfield_10006"
#- to: log:importsprint?level=INFO&showBody=true
- step:
id: import-work-logs
steps:
- set-body:
simple: "${exchangeProperty.originalIssue}"
- set-header:
name: worklogLinkToRecord
simple: "${header.eptIssueRef}"
- to: "transform-jira-worklog:crm-import"
#- to: log:transformworklog?level=INFO&showBody=true
- to: "ecos-records-mutate:?sourceId=emodel/ecos-time-tracking-type"
#- to: log:importworklogs?level=INFO&showBody=true
Быстрая настройка
Создайте проект в Citeck. После этого должно создаться рабочее пространство проекта.
В jira создайте пользователя для импорта задач, получите его токен или пароль.
В журнале Конечные точки (Рабочее пространство «Раздел администратора» → Модель) создайте конечную точку, заполните URL, данные для аутентификации с типом Basic.
В журнале Camel DSL (Рабочее пространство «Раздел администратора» → Интеграция ) создайте маршрут с контекстом на основе примера выше. Обязательно укажите параметры подключения к Jira,
_workspaceиlink-project:project.Логи импорта доступны в журнале Журнал синхронизаций (Рабочее пространство «Раздел администратора» → Интеграция).
Посмотреть состояние импорта, сбросить его можно в журнале Состояние синхронизации (Рабочее пространство «Раздел администратора» → Интеграция).
После того, как задачи импортированы, выключите маршрут.
Скорректируйте генератор счетчика задач. Для этого необходимо выполнить скрипт в консоли браузера:
const record = Records.get("emodel/num-template-action@");
record.att("type", "set-next-number");
record.att("args",
{
"templateRef": "emodel/num-template@ept-issue-num-template",
"counterKey": "emodel/ept-project@767a669f-8455-4cf3-b43f-75b66c6eeb8f",
"nextNumber": 39
})
record.save();
"nextNumber": 39- следующий номер задачи, который будет присвоен при создании новой задачи."counterKey": "emodel/ept-project@767a669f-8455-4cf3-b43f-75b66c6eeb8f"- recordRef проекта, аналогичный полюlink-project:projectв маршруте импорта.
Параметры настройки
Основные параметры
jiraHost - URL сервера Jira
jiraUser - Имя пользователя для подключения к Jira
jiraToken - Токен или пароль пользователя для подключения к Jira
projectKey - Ключ проекта в Jira для импорта
delay - Интервал проверки новых задач в миллисекундах
Указание рабочего пространства и проекта
Для корректной работы импорта обязательно необходимо указать рабочее пространство и проект в Citeck:
- set-property:
name: _workspace
constant: "ECOSCRM" # id рабочего пространства
- set-property:
name: link-project:project
constant: "emodel/ept-project@eadfe69d-676a-42a5-b21f-2db7d5fc18bf" # recordRef проекта, должен быть связан с рабочим пространством
Настройка маппинга значений
valuesMapping позволяет указать соответствие значений из Jira значениям в Citeck:
{
"_type": {
"10000": "emodel/type@ept-issue-epic",
"10001": "emodel/type@ept-issue-story",
"10002": "emodel/type@ept-issue-task",
"10003": "emodel/type@ept-issue-subtask",
"10004": "emodel/type@ept-issue-bug"
},
"priority": {
"1": "100_urgent",
"2": "200_high",
"3": "300_medium",
"4": "400_low"
},
"_status": {
"1": "backlog",
"10010": "backlog",
"3": "in-progress"
}
}
Конвертеры значений
valuesConverter определяет преобразование значений полей из формата Jira в формат Citeck:
{
"description": "jiraRenderedFieldToTextArea",
"_created": "jiraDateToInstant",
"_modified": "jiraDateToInstant",
"endDate": "jiraDateToInstant",
"reporter": "emailToPersonRef",
"implementer": "emailToPersonRef",
"epicLink": "issueKeyToRef",
"remainingEstimateMills": "secondsToMills"
}
Доступные конвертеры:
jiraRenderedFieldToTextArea - преобразует отрендеренное HTML-содержимое поля Jira в формат TextArea для Citeck, сохраняя форматирование и ссылки
jiraDateToInstant - преобразует дату из формата Jira в формат Instant для Citeck
emailToPersonRef - преобразует email-адрес пользователя Jira в ссылку на пользователя в Citeck
issueKeyToRef - преобразует ключ задачи Jira (например, ECOSCRM-123) в ссылку на соответствующую задачу в Citeck
secondsToMills - преобразует время в секундах в миллисекунды для корректного отображения в Citeck
Маппинг атрибутов
attributesMapping определяет соответствие полей Jira атрибутам сущностей в Citeck:
{
"fields.issuetype.id": "_type",
"fields.priority.id": "priority",
"fields.summary": "summary",
"fields.description": "description",
"fields.resolution.id": "resolution",
"fields.labels": "tags",
"fields.resolutiondate": "endDate",
"fields.status.id": "_status",
"fields.reporter.emailAddress": "reporter",
"fields.assignee.emailAddress": "implementer",
"fields.timetracking.originalEstimate": "estimatedWorks",
"fields.timetracking.remainingEstimateSeconds": "remainingEstimateMills",
"fields.created": "_created",
"fields.updated": "_modified",
"fields.customfield_10002": "epicLink"
}
Маппинг связей между задачами
linksMapping определяет соответствие типов связей между задачами в Jira типам связей в Citeck:
{
"10000": "issue-links:blocker",
"10001": "issue-links:clone",
"10002": "issue-links:duplicate",
"10300": "issue-links:problem",
"10003": "issue-links:relates"
}
Статические атрибуты
staticAttributes позволяет указать атрибуты, которые будут добавлены ко всем импортируемым сущностям:
{
"__disableAudit": true
}
Для корректного установления атрибутов _created, _modified и т.д. необходимо указать __disableAudit: true
Компоненты и этапы синхронизации
Импорт задач (Issues)
Основной компонент синхронизации, выполняет загрузку задач из Jira и их преобразование в сущности Citeck. Для работы использует JiraIssuesComponent и TransformJiraIssueComponent.
Импорт комментариев
Компонент TransformJiraCommentComponent импортирует комментарии к задачам из Jira в Citeck, сохраняя их как связанные записи с типом "emodel/type@ecos-comment".
Импорт затраченного времени
Компонент TransformJiraWorkLogComponent импортирует записи о затраченном времени (work logs) из Jira в Citeck, сохраняя их как сущности с типом "emodel/type@ecos-time-tracking-type".
Импорт компонентов
Компонент ImportJiraComponentComponent импортирует компоненты, присвоенные задачам в Jira.
Импорт тегов
Компонент ImportJiraTagsComponent импортирует метки (labels) из Jira, преобразуя их в теги Citeck.
Импорт релизов
Компонент ImportJiraReleasesComponent импортирует информацию о релизах (fixVersions и affectedVersions) из Jira в Citeck.
Импорт спринтов
Компонент ImportJiraSprintComponent импортирует информацию о спринтах, к которым отнесены задачи в Jira.
Импорт вложений
Компонент ImportJiraAttachmentComponent загружает вложения задач из Jira и импортирует их в Citeck.
Дополнительные возможности
Префикс идентификаторов
Для уникальной идентификации импортированных записей можно задать префикс через свойство jiraImportedRecordIdPrefix:
- set-property:
name: jiraImportedRecordIdPrefix
constant: "imported-jira"
Все созданные записи в рамках импорта будут использовать данные префикс, обратите внимание, если импорт будет выполняться несколько раз, то существующие записи будут обновлены, а новые созданы.
Если необходимо запустить импорт заново, то можно сбросить состояние импорта в журнале Состояние синхронизации (Рабочее пространство «Раздел администратора» → Интеграция).
Ограничения и рекомендации
Перед настройкой импорта убедитесь, что пользователь Jira имеет необходимые права доступа к проекту.
При использовании двухфакторной аутентификации в Jira необходимо использовать API-токен вместо пароля.
Для импорта вложений может потребоваться отключение принудительной 2FA для URL
/secure/attachmentв настройках Jira.Рекомендуется начинать с небольшого набора задач для проверки корректности импорта.
При импорте большого количества задач рекомендуется увеличить значение параметра
delay.Убедитесь, что корректно указаны
_workspaceиlink-project:project.
Устранение неполадок
Проблема: Задачи не импортируются.
Решение: Проверьте правильность указания
jiraHost,jiraUser,jiraTokenиprojectKey.Проблема: Не импортируются вложения.
Решение: Проверьте настройки двухфакторной аутентификации в Jira для URL
/secure/attachment.Проблема: Неверное маппирование типов/статусов.
Решение: Проверьте значения ID в Jira и обновите соответствующую секцию
valuesMapping.Проблема: Ошибка «Value mapping for field does not contain value».
Решение: Добавьте отсутствующее значение в соответствующую секцию
valuesMapping.