Всем привет!
В этой статье я расскажу о том, как добавлять свои свойства к проектам в Jira (project property) с помощью SIL.
SIL это язык программирования, который позволяет Вам автоматизировать Ваши действия в Atlassian Jira и Confluence. Вы можете найти больше информации о SIL здесь.
Что такое свойство проекта?
Как Вы знаете проект в Jira содержит такие поля как Категория, Руководитель проекта, Наименование проекта, URL проекта и так далее. Этот лист не может быть расширен с помощью базовой функциональности в Jira. А что если мы хотим добавить новое поле к нашему проекту?
Допустим мы пишем интеграцию с Salesforce. В Jira мы будем создавать проекты, каждый из которых должен быть привязан к аккаунту из Salesforce. Далее в каждом проекте будем создавать ишью к каждому opportunity, который привязан к аккаунту, который связан с этим проектом. Но как идентифицировать какой проект привязан к какому аккаунту?
Нам нужно как-то сделать связь между проектом в Jira и аккаунтом. Мы могли просто записать наименование аккаунта в наименование проекта. Но тогда, если наименование аккаунта изменилось, то нам нужно менять наименования проектов в Jira. Это неудобно.
Мы можем записать ид аккаунта в наименование проекта, но тогда наименование проекта будет непонятным.
Мы можем записать ид аккаунта в ключ проекта, но тогда ключ будет сложным, а ключ в Jira как раз должен быть легко запоминаем, чтобы им можно было бы легко пользоваться.
Вот как раз в этом случае нам и нужно добавить свойство проекта. Мы добавим свойство accountId к каждому проекту, которое будет содержать ид аккаунта.
Как это сделать в SIL?
Если посмотреть на существующие функции в SIL, то мы не увидим функций для работы со свойствами проектов. Поэтому нам нужно написать свои функции на Groovy и их использовать.
Для этого установите бесплатный плагин SIL groovy connector app. Этот плагин позволяет вызывать Groovy код в SIL
После того, как Вы установили этот плагин, создайте следующие файлы в SIL Manager:
getAccountIdForProject.groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.bc.project.property.ProjectPropertyService
import com.atlassian.jira.entity.property.EntityPropertyService
import com.atlassian.jira.entity.property.EntityProperty
import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper()
def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser();
ProjectPropertyService projectPropertyService = ComponentAccessor.getComponent(ProjectPropertyService.class);
EntityPropertyService.PropertyResult propertyValues = projectPropertyService.getProperty(user, "${projectKey}", "sfdc");
if (propertyValues?.getEntityProperty().isEmpty()) {
return ""
}else {
def accountId = jsonSlurper.parseText(propertyValues?.getEntityProperty()?.get().getValue()).accountId
if (accountId) {
return accountId
} else {
return ""
}
}
Вот самая важная строчка:
EntityPropertyService.PropertyResult propertyValues = projectPropertyService.getProperty(user, "${projectKey}", "sfdc");
Мы получаем свойство с ключом “sfdc” для проекта ${projectKey}. ${projectKey} это шаблон. Позже в скрипте SIL мы поставим в этот шаблон ключ проекта, который нам нужен.
setAccountIdForProject.groovy
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.bc.project.property.ProjectPropertyService
import com.atlassian.jira.entity.property.EntityPropertyService
import com.atlassian.jira.entity.property.EntityProperty
import com.atlassian.fugue.Option
def builder = new groovy.json.JsonBuilder()
def root = builder {
accountId ${accountId}
}
def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser();
def project = ComponentAccessor.getProjectManager().getProjectObjByKey("${projectKey}");
ProjectPropertyService projectPropertyService = ComponentAccessor.getComponent(ProjectPropertyService.class);
EntityPropertyService.SetPropertyValidationResult result = projectPropertyService.validateSetProperty(
user,
project.getId(),
new EntityPropertyService.PropertyInput(builder.toString(), "sfdc"));
// return result.getErrorCollection()
if (result.isValid()) {
projectPropertyService.setProperty(user, result);
}
В этом скрипте я записываю json вот такого вида {“accountId” : ${accountId}} как свойство проекта с ключом sfdc для проекта ${projectKey}. Позже в скрипте SIL я заменю ${accountId} и ${projectKey} на ид аккаунта и ключ проекта, который мне нужен.
Теперь сделаем наш скрипт SIL.
test.sil
function getAccountIdForProject(string projectKey) {
string silPath = silEnv("sil.home");
string script = readFromTextFile(silPath + "/SFDC/groovy/getAccountIdForProject.groovy");
script = replace(script, "${projectKey}", projectKey);
return executeGroovyScript(script);
}
function setAccountIdForProject(string projectKey, string accountId) {
string silPath = silEnv("sil.home");
string script = readFromTextFile(silPath + "/SFDC/groovy/setAccountIdForProject.groovy");
script = replace(script, "${accountId}", accountId);
script = replace(script, "${projectKey}", projectKey);
executeGroovyScript(script);
}
runnerLog(setAccountIdForProject("AP", "133"));
runnerLog(getAccountIdForProject("AP"));
Вот скриншот всех файлов, которые я создал:

Что происходит в test.sil?
function getAccountIdForProject(string projectKey) {
string silPath = silEnv("sil.home");
string script = readFromTextFile(silPath + "/SFDC/groovy/getAccountIdForProject.groovy");
script = replace(script, "${projectKey}", projectKey);
return executeGroovyScript(script);
}
Мы создаем функцию по получению ид аккаунта из проекта Jira:
- мы получаем путь к скриптам SIL (silEnv(“sil.home”))
- читаем содержимое файла getAccountIdForProject.groovy
- меняем ${projectKey} на нужный нам ключ проекта
- выполняем скрипт
Так же определяем функцию для записи ид аккаунта в проект Jira, а затем вызываем обе функции:
runnerLog(setAccountIdForProject("AP", "133"));
runnerLog(getAccountIdForProject("AP"));
Сначала мы устанавливаем 133 в качестве ид аккаунта для проекта AP, а затем считываем этот ид аккаунта. Вот так это работает:
