Jira is Atlassian’s flagship issue tracking and agile project management platform used by thousands of engineering teams worldwide to plan, track, and manage software development projects.
The Jira Backstage plugin brings tickets into Backstage by surfacing project information directly in your developer portal. Originally developed by Roadie and now widely adopted across the Backstage ecosystem, this plugin connects your Backstage entities to their corresponding Jira projects, providing real-time visibility into development progress without leaving your service catalog.
What the plugin provides
The plugin integrates seamlessly with both Jira Cloud and Server/Data Center instances to display:
- Project overview and health metrics - See active issues, sprint progress, and project status at a glance
- Issue tracking and lifecycle management - Track stories, bugs, and epics directly from your service pages
- Activity streams and recent updates - Monitor project activity and stay informed of changes affecting your services
- Custom JQL query results - Display filtered issue lists based on complex queries tailored to your team’s needs
- Personal dashboards - View tickets assigned to you across all projects from your Backstage homepage
Why use this plugin
Developers can access Jira information directly alongside service documentation, dependencies, and deployment status in Backstage. This unified view reduces context switching and provides a complete picture of your service’s development lifecycle.
Major organizations like John Lewis & Partners have successfully integrated Jira data into their Backstage deployments, with John Lewis noting: “We use Backstage with data aggregated from key applications such as Gitlab, Pagerduty, JIRA, Kubecost and Google Cloud, serving that data via Big Query to specific Backstage panels.”
This guide covers installation for both Jira Cloud and Server instances, configuration options for single and multiple projects, and usage examples to help you get started quickly.
Installation Instructions
These instructions apply to self-hosted Backstage only. To use this plugin on Roadie, visit the docs.
Install the plugin into Backstage.
yarn --cwd packages/app add @roadiehq/backstage-plugin-jira
Add proxy configuration to app-config.yaml
# app-config.yaml
proxy:
'/jira/api':
target: '<JIRA_URL>'
headers:
Authorization: ${JIRA_TOKEN}
Accept: 'application/json'
Content-Type: 'application/json'
X-Atlassian-Token: 'nocheck'
User-Agent: "MY-UA-STRING"
jira:
proxyPath: /jira/api
product: cloud # Use 'cloud' for Jira Cloud or 'datacenter' for Server/Data Center
Set img-src in Content Security Policy
// app-config.yaml
backend:
# ...
csp:
img-src:
# "'self'" and 'data' are from the backstage default but must be set since img-src is overriden
- "'self'"
- 'data:'
# Allow your Jira instance for @roadiehq/backstage-plugin-jira
- 'JIRA_URL'
Add plugin API to your Backstage instance
// packages/app/src/components/catalog/EntityPage.tsx
import {
EntityJiraOverviewCard,
isJiraAvailable,
hasJiraQuery,
EntityJiraQueryCard,
} from '@roadiehq/backstage-plugin-jira';
const overviewContent = (
<Grid container spacing={3} alignItems="stretch">
<EntitySwitch>
<EntitySwitch.Case if={isJiraAvailable}>
<Grid item md={12}>
<EntityJiraOverviewCard />
</Grid>
</EntitySwitch.Case>
<EntitySwitch.Case if={hasJiraQuery}>
<Grid item md={12}>
{/* This card can be used as an alternative or in addition to the overview card */}
<EntityJiraQueryCard title="Our Custom Query" />
</Grid>
</EntitySwitch.Case>
</EntitySwitch>
</Grid>
);
Add annotation to the yaml config file of a component
metadata:
annotations:
# Find this in the project settings page
jira/project-key: <example-jira-project-key>
# optional, you might skip this value to fetch data for all components
jira/component: <example-component>
# optional, used for Activity stream feed. If you are using Basic auth you can skip this.
jira/token-type: Bearer
# optional, refine filter based on a label or labels (CSV)
jira/label: <example-label>
# optional, used by EntityJiraQueryCard, this query supports basic templating with the above annotations if present, and information from the user profile. e.g. "assignee = {{ userEmail }} AND label = ({{ label }})"
jira/all-issues-jql:
Even though you can use Bearer token please keep in mind that Activity stream feed will only contain entries that are visible to anonymous users. In order to view restricted content you will need to authenticate via Basic authentication, as described in official documentation.
# Set your environment variable
export JIRA_TOKEN='Basic <your-base64-encoded-credentials>'
# Or run Backstage locally with the token
env JIRA_TOKEN='Basic <your-base64-encoded-credentials>' yarn dev
Things to Know
The plugin displays your Jira project information directly in the entity overview, showing issue counts, project details, and activity streams at a glance.
Plugin Components
The Jira plugin provides several UI components that you can add to your entity pages and homepage:
Overview Card
The EntityJiraOverviewCard
displays essential project information:
- Project name and key
- Issue counts by status (To Do, In Progress, Done)
- Recent project activity
- Direct link to the Jira project dashboard
Query Card
The EntityJiraQueryCard
allows custom JQL queries:
- Displays results of custom JQL searches
- Supports dynamic templating with entity annotations
- Configurable title and query parameters
- Useful for team-specific or filtered views
import { EntityJiraQueryCard } from '@roadiehq/backstage-plugin-jira';
<Grid item md={6}>
<EntityJiraQueryCard title="Critical Bugs" />
</Grid>
Homepage Component
The HomePageMyJiraTicketsCard
shows personalized ticket information:
- Open and In Progress tickets assigned to the current user
- Quick access to your most relevant work items
- Integrates with Backstage’s user profile system
import { HomePageMyJiraTicketsCard } from '@roadiehq/backstage-plugin-jira';
<Grid item xs={12} md={6}>
<HomePageMyJiraTicketsCard />
</Grid>
Required Annotations
To connect your Backstage entities to Jira projects, add specific annotations to your entity metadata:
Basic Project Mapping
For a single Jira project:
metadata:
annotations:
jira/project-key: MYPROJ
Component-Specific Issues
To filter issues by Jira component:
metadata:
annotations:
jira/project-key: MYPROJ
jira/component: backend-service
Label-Based Filtering
Filter issues by labels (supports comma-separated values):
metadata:
annotations:
jira/project-key: MYPROJ
jira/label: microservice,backend
Custom JQL Queries
For advanced filtering with JQL (Jira Query Language):
metadata:
annotations:
jira/project-key: MYPROJ
jira/all-issues-jql: 'assignee = "{{ userEmail }}" AND status != "Done" AND project = "{{ projectKey }}"'
The JQL query supports templating with:
{{ userEmail }}
- Current user’s email{{ projectKey }}
- The project key from annotations{{ component }}
- Component name from annotations{{ label }}
- Labels from annotations
Configuration Options
Single Jira Instance
For organizations using a single Jira instance:
### app-config.yaml
proxy:
'/jira/api':
target: 'https://your-company.atlassian.net'
headers:
Authorization: ${JIRA_TOKEN}
Accept: 'application/json'
Content-Type: 'application/json'
X-Atlassian-Token: 'nocheck'
User-Agent: "Backstage-Jira-Plugin"
jira:
proxyPath: /jira/api
product: cloud
Authentication Setup
Obtaining a Jira API Token
- Visit Atlassian API Tokens
- Click “Create API token”
- Give it a descriptive name (e.g., “Backstage Integration”)
- Copy the generated token immediately (it won’t be shown again)
Creating the Authentication Header
-
Create a base64-encoded string in the format:
<your-atlassian-email>:<your-api-token>
For example:
[email protected]:hTBgqVcrcxRYpT5TCzTA9C0F
-
Encode this string to base64:
echo -n "[email protected]:hTBgqVcrcxRYpT5TCzTA9C0F" | base64
Result:
am9obi5kb2VAY29tcGFueS5jb206aFRCZ3FWY3JjeFJZcFQ1VEN6VEE5QzBG
-
Set your environment variable with the
Basic
prefix:export JIRA_TOKEN='Basic am9obi5kb2VAY29tcGFueS5jb206aFRCZ3FWY3JjeFJZcFQ1VEN6VEE5QzBG'
Token Types and Activity Streams
For Activity Stream feeds, you can optionally specify the token type:
metadata:
annotations:
jira/project-key: MYPROJ
jira/token-type: Bearer # Default is Basic
Note: Activity streams with Bearer tokens only show publicly visible content. For private or restricted content, use Basic authentication as described above.
Feature Flags
The plugin supports feature flags for optional functionality:
Linked Pull Requests
Enable the display of linked pull requests in issue views:
### app-config.yaml
jira:
# other config...
featureFlags:
showLinkedPRs: true
This feature is particularly useful for Jira Data Center instances and provides visibility into code changes associated with specific issues.
Troubleshooting
Common Issues
Plugin not displaying: Verify your entity has the correct jira/project-key
annotation and that the project exists in your Jira instance.
Authentication errors: Check that your API token is valid. The user associated with the token should have read access to the projects you’re trying to display. Make sure the token is base64 encoded correctly.
CORS issues: Ensure your proxy configuration is correct and that the X-Atlassian-Token: 'nocheck'
header is included.
Activity stream not showing: This typically indicates the content is private. Switch to Basic authentication or adjust your Jira project permissions.
Required Permissions
Your Jira user needs these permissions:
- Browse Projects - View project details and issues
- View Development Tools - See linked development information
- Read Attachments - View issue attachments in activity streams
Performance Considerations
For large Jira projects, consider:
- Using component or label filters to limit the number of issues displayed
- Implementing custom JQL queries to show only relevant issues
- Configuring appropriate caching headers in your proxy setup
Advanced Usage
Custom Activity Stream Integration
Configure the Activity Stream to show specific types of updates:
metadata:
annotations:
jira/project-key: MYPROJ
jira/component: api-service
jira/label: critical,backend
# This will show activity for critical backend issues in the api-service component
Dashboard Integration
Use the HomePageMyJiraTicketsCard
component to create personalized dashboards:
// packages/app/src/components/home/HomePage.tsx
import { HomePageMyJiraTicketsCard } from '@roadiehq/backstage-plugin-jira';
<Grid container>
<Grid item xs={12} md={6}>
<HomePageMyJiraTicketsCard />
</Grid>
{/* Other dashboard components */}
</Grid>
This provides developers with immediate visibility into their assigned work when they open Backstage, improving productivity and reducing the need to check multiple tools.
References
Set up Backstage in minutes with Roadie
Focus on using Backstage, rather than building and maintaining it.