This project provides an automated workflow that bridges Figma, GitHub, and Jira to streamline bug reporting and tracking. When a bug issue is created on GitHub (either manually or via Figma plugins), it automatically creates a corresponding Jira ticket with extracted details using AI.
The integration works as follows:
- Figma → GitHub: Use Figma plugins to create GitHub issues directly from your designs
- GitHub → Jira: Automatically create Jira tickets from GitHub bug issues using AI-powered extraction
- AI Processing: Extracts structured information (priority, Figma links, attachments, description) from issue body
To create GitHub issues from Figma, install one of these plugins:
- GitHub Issue Sync: https://www.figma.com/community/widget/1101944648482192724
- Issue to GitHub: https://www.figma.com/community/widget/1306216732737885211
These plugins allow you to:
- Select elements in Figma and create GitHub issues with attached screenshots
- Automatically include Figma frame/selection links
- Tag issues with relevant labels
- A GitHub repository with Actions enabled
- A Jira Cloud instance with API access
- OpenAI API access (via GitHub Models)
- Copy the
.github/workflows/issue-to-jira.ymlfile to your repository - Copy the
prompts/issue-extract.prompt.ymlfile to your repository - Configure the required secrets and variables (see below)
Configure these secrets in your GitHub repository settings (Settings → Secrets and variables → Actions → Secrets):
| Secret Name | Description |
|---|---|
JIRA_API_TOKEN |
Your Jira API token. Generate at https://id.atlassian.com/manage-profile/security/api-tokens |
Configure these variables in your GitHub repository settings (Settings → Secrets and variables → Actions → Variables):
| Variable Name | Description | Example |
|---|---|---|
JIRA_BASE_URL |
Your Jira Cloud instance URL | https://yourcompany.atlassian.net |
JIRA_EMAIL |
Email address associated with your Jira account | you@example.com |
JIRA_PROJECT_KEY |
The project key where tickets will be created | PROJ, BUG, DEV |
The workflow file .github/workflows/issue-to-jira.yml performs the following steps:
on:
issues:
types: [opened]The workflow triggers whenever a new issue is opened in the repository.
jobs:
sync-bug-to-jira:
environment: development
if: contains(github.event.issue.labels.*.name, 'bug')Only processes issues labeled with bug.
- name: Checkout repository
uses: actions/checkout@v4Checks out the repository to access the prompt file.
- name: Prepare single-line body
id: prepare
run: |
BODY="${{ github.event.issue.body }}"
SINGLE_LINE=$(echo "$BODY" | tr '\n' ' ' | sed 's/ */ /g')
echo "body=$SINGLE_LINE" >> $GITHUB_OUTPUTConverts the multi-line issue body into a single line by replacing newlines with spaces. This ensures proper handling by the AI inference action.
- name: Extract issue details
id: inference
uses: actions/ai-inference@v1
with:
prompt-file: './prompts/issue-extract.prompt.yml'
input: |
body: ${{ toJSON(steps.prepare.outputs.body) }}Uses GitHub's AI inference action with GPT-4o to extract structured data from the issue body. See the Prompt Configuration section for details on the extraction schema.
- name: Login
uses: atlassian/gajira-login@v3
env:
JIRA_BASE_URL: ${{ vars.JIRA_BASE_URL }}
JIRA_USER_EMAIL: ${{ vars.JIRA_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}Authenticates with Jira using the configured credentials.
- name: Create Jira ticket
id: create
uses: atlassian/gajira-create@v3
with:
project: ${{ vars.JIRA_PROJECT_KEY }}
issuetype: Bug
summary: ${{ github.event.issue.title }}
description: |
h2. Priority
*h3. ${{ fromJSON(steps.inference.outputs.response).priority }}*
h2. GitHub issue
[issue #${{ github.event.issue.number }}|${{ github.event.issue.url }}]
h2. Summary
${{ fromJSON(steps.inference.outputs.response).content }}
h2. Figma Links
${{ join(fromJSON(steps.inference.outputs.response).figma_urls, ' , ') }}
h2. Attachments
!${{ join(fromJSON(steps.inference.outputs.response).attachment_urls, '!!') }}!Creates a Jira ticket with:
- Project: From
JIRA_PROJECT_KEYvariable - Issue Type: Bug
- Summary: The GitHub issue title
- Description: Formatted with extracted priority, summary, Figma links, and attachment URLs
- name: Store Jira URL
if: steps.create.outputs.issue != ''
run: |
echo "JIRA_KEY=${{ steps.create.outputs.issue }}" >> $GITHUB_ENV
echo "JIRA_URL=${{ vars.JIRA_BASE_URL }}/browse/${{ steps.create.outputs.issue }}" >> $GITHUB_ENVStores the created Jira ticket key and URL for later use.
- name: Comment Jira link on GitHub issue
if: env.JIRA_URL != ''
uses: actions/github-script@v7
with:
script: |
const body = `**Jira ticket** [${{ env.JIRA_KEY }}](${{ env.JIRA_URL }}) created via GitHub Action.`;
await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body
});Adds a comment to the original GitHub issue with a link to the newly created Jira ticket.
The prompts/issue-extract.prompt.yml file configures the AI extraction:
- Model:
openai/gpt-4o - Temperature:
0.5(balanced creativity and consistency)
The AI extracts the following fields from issue body:
| Field | Type | Description |
|---|---|---|
content |
string | Complete issue description including reproduction steps |
priority |
string | One of: Critical, Non-Critical, Cosmetic, Nice to have |
figma_urls |
array | List of Figma URLs found in the issue |
attachment_urls |
array | List of non-Figma attachment URLs |
{
"content": "Login button doesn't respond on mobile view. Steps: 1. Open login page 2. Resize to mobile 3. Click button",
"priority": "Critical",
"figma_urls": ["https://www.figma.com/file/abc123/Login-Page"],
"attachment_urls": ["https://user-images.githubusercontent.com/.../screenshot.png"]
}- Select the element(s) in Figma you want to report
- Open the Figma plugin
- Fill in issue details
- Submit to create a GitHub issue (automatically labeled as
bug)
- Create a new GitHub issue
- Add the
buglabel - Include Figma links in the body if applicable
- Attach screenshots if needed
- Submit - the workflow will automatically create a Jira ticket
See a real-world example of this workflow in action: Issue #60
This issue demonstrates:
- A bug report created with Figma context
- AI-extracted information (priority, summary, Figma links)
- The automated Jira ticket creation
- The workflow comment with the Jira ticket link
- Original GitHub Issue: Contains the bug description with Figma links and screenshots
- GitHub Actions Workflow: Automatically triggered when the issue was labeled as
bug - AI Extraction: The prompt extracted structured data from the issue body
- Jira Ticket Created: A corresponding bug ticket was created in Jira
- Comment Posted: The workflow commented on the issue with the Jira ticket link
This is the expected result after setting up the workflow in your own repository.
The workflow requires these permissions:
permissions:
issues: write # To comment on GitHub issues
contents: read # To checkout repository
models: read # To use GitHub AI inference- Ensure the issue has the
buglabel - Check that all required secrets and variables are configured
- Verify the Jira API token hasn't expired
- Ensure the prompt file exists at
prompts/issue-extract.prompt.yml - Check GitHub Models access is enabled for your repository
- Verify
JIRA_BASE_URLmatches your Jira Cloud URL exactly - Regenerate your Jira API token if needed
- Ensure the email matches your Jira account
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
For issues or questions:
- Check the Troubleshooting section
- Open an issue in this repository
- Review the GitHub Actions documentation
- Check the Jira API documentation