Как добавлять свои свойства к проектам Jira в SIL

Всем привет!

В этой статье я расскажу о том, как добавлять свои свойства к проектам в 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, а затем считываем этот ид аккаунта. Вот так это работает:

Leave a Reply

%d bloggers like this: