Jak utworzyć własną stronę w instancji Jira Server?

Jira Server / Data Center

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.

Groovy
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}

Go to top