Pozwólcie, że podzielę się swoim doświadczeniem z tworzenia dodatkowych, spersonalizowanych stron w instancji Jira, które bazują na danych pochodzących ze zgłoszeń. Czasami zachodzi potrzeba przygotowania odrębnej strony zawierającej tabele, listy lub czegoś innego, co pobiera dane z bazy Jiry. Oczywiście można w tym celu stworzyć własny plugin za pomocą środowiska Atlassian SDK, ale jeżeli w instancji jest zainstalowany ScriptRunner, to można zrobić to dużo prościej i szybciej.
1. W pierwszej kolejności należy stworzyć REST Endpoint, który posłuży nam do generowania strony WWW (Mange Apps -> Script Runner -> REST Endpoints). Przykładowy skrypt znajduje się poniżej. Dodałem do niego kilka komentarzy, aby opisać sposób działania.
import com.onresolve.scriptrunner.runner.rest.common.CustomEndpointDelegate
import groovy.transform.BaseScript
import com.atlassian.jira.component.ComponentAccessor
import javax.servlet.http.HttpServletRequest
import com.atlassian.webresource.api.UrlMode
import com.atlassian.webresource.api.assembler.PageBuilderService
import com.atlassian.webresource.api.assembler.WebResourceAssembler
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.core.Response
@BaseScript CustomEndpointDelegate delegate
simplePage(httpMethod: "GET") { MultivaluedMap queryParams, body, HttpServletRequest request ->
PageBuilderService pageBuilderService = ComponentAccessor.getComponentOfType(PageBuilderService);
WebResourceAssembler assembler = pageBuilderService.assembler();
// Web resources from the our Jira Instance, e.g JQuery
List<String> requiredResources = ["jira.webresources:jquery","jira.webresources:global-static"];
requiredResources.each {
String moduleKey ->
assembler.resources().requireWebResource(moduleKey);
}
// #### You can get some necessary data from the current issue, e.g.
// 1. BaseUrl
def baseurl = ComponentAccessor.getApplicationProperties().getString().getString("jira.baseurl");
// 2. Data from the current issue, if you use a custom web item and define a link with parameters:
// e.g. <endpointURL>?issueId=${issue.key}
def issueId = queryParams.getFirst("issueId") as String; // get an id from the URL get parameter
def issue = ComponentAccessor.getIssueManager().getIssueObject(issueId); // now you can get an issue object
Writer sw = new StringWriter()
sw << """
<html>
<head>
<title>My simple page</title>""";
pageBuilderService.assembler().assembled().drainIncludedResources().writeHtmlTags(sw, UrlMode.AUTO)
sw << """
</head>
<!-- We can use style classes from our Jira instance -->
<body id="jira" class="aui-layout aui-theme-default">
<!-- We can include data from selected issue -->
<h1>My issue summary is: """ + issue.getSummary() + """</h1>
</body>
</html>
""";
Response.ok().type(MediaType.TEXT_HTML).entity(sw.toString()).build()
}
2. Po utworzeniu REST Endpointa można go wykorzystać we fragmentach ScriptRunnera, np. web-item w formie buttonu (Manage Apps -> ScriptRunner -> Fragments). Jeżeli chcemy, aby button kierujący do strony wyświetlał się np. w widoku zgłoszenia, to można określić w ustawieniach fragmentu sekcję jira.issue.tools, opcję Navigate to a link i dodać adres URL do REST Endpointa, który zawiera parametr ID zgłoszenia np. <endpoint_address>?issueId=${issue.key}