Create a GitHub issue viewer in Jira issues

Table of contents

The need: view GitHub issues directly in Jira

Project managers using Jira and GitHub might need to have access to GitHub issues and state of development directly from Jira. Linking GitHub issues and Jira issues can help have a global view and centralize info in a single place.

Solution: Connect Jira to GitHub and create a GitHub issue viewer

Connect Jira to GitHub and create a GitHub issue viewer with Elements Connect and ScriptRunner.

Sometimes, the rendering of a Connect field needs more space than is offered in the "Details" panel where custom fields are rendered. In this  scenario, Jira is used to manage a project with an open source component. With the "GitHub issue picker" field combined with a scripted "GitHub issue panel", a project manager can follow a GitHub open sourced development without leaving Jira, displaying all sorts of information from a remote issue in a single place.

In this example, we display the content of a GitHub issue

Configuration guide: how to populate Jira custom fields with GitHub data

Step 1: connect to the datasource

First, create a GitHub REST API resource:

Step 2: create Elements Connect field

  • Download the field configuration: GitHub_Issue_export.json

  • From Elements Connect administration, create an Elements Connect field of type Live Text

  • Click on the field name to configure it and select the third option: "Import an external configuration"

Select "Import an external configuration"

  • Select the "GitHub Issue" datasource created previously
  • Click the "Save" button to store your new configuration.
  • Define the screens on which your new Connect field should be accessible. You can do so via the Connect administration

    Add your field to the issue creation screen, but not to the issue view.
  • That's it! The field is now configured. You can adapt the query ("URL Path") to your needs.

Your field is now properly configured

Step 3: Add a Scripted Panel to display GitHub data in the issue view

  • From the "Manage apps" section, select "Fragments" in the ScriptRunner menu
  • Create Script Fragment
  • Select "Show a web panel"

We won't go through the detail of the item configuration, only the specific parts:

  • Select a "Location" available in the issue view - we selected "atl.jira.view.issue.left.context"
  • The most important part, the script.
    Do not forget to change the custom field ID, in this example it's 10000. You're not limited to one field, you can render as many field displays as you want.
import com.valiantys.nfeed.api.IFieldDisplayService
import com.valiantys.nfeed.api.View
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.component.ComponentAccessor
import com.onresolve.scriptrunner.runner.customisers.WithPlugin;
class NFeedDisplayService {
    Issue issue;
    String issueKey;
    Object plugin;
    Class serviceClass;
    Class viewClass;
    Object fieldDisplayService;
    def context;
    void init(context) {
        this.context = context;
        issue = context.issue as Issue
        issueKey = issue.getKey();
        plugin = ComponentAccessor.getPluginAccessor().getPlugin("com.valiantys.jira.plugins.SQLFeed");
        serviceClass = plugin.getClassLoader().loadClass("com.valiantys.nfeed.api.IFieldDisplayService");
        viewClass = plugin.getClassLoader().loadClass("com.valiantys.nfeed.api.View");
        fieldDisplayService = ComponentAccessor.getOSGiComponentInstanceOfType(serviceClass);
    String getDisplay(fieldId) {
        String display = "";
        def issue = context.issue as Issue
        def issueKey = issue.getKey();
        def dashBoardView = viewClass.DASHBOARD as View; // The DASHBOARD view is richer that the Issue view
        Object issueDisplay = ((IFieldDisplayService)fieldDisplayService).getDisplayResult(issueKey, fieldId, dashBoardView);
        if (issueDisplay != null) {
            if(!issueDisplay.hasError()) {
                if(issueDisplay.getDisplay() != null) {
                    display = issueDisplay.getDisplay();
        return display;
NFeedDisplayService displayService = new NFeedDisplayService();
// TODO Change the custom field id
// Note - you can render more fields if you'd like
// writer.write(displayService.getDisplay("customfield_14148"));

The result in your Jira ticket