Automating Jira Ticket Creation from GitHub Using Python, Flask & AWS (Introducing: JiraSyncBot)


Simplifying developer workflows with automation, one issue at a time.
Project Overview
Meet JiraSyncBot — a lightweight automation tool I built to instantly create Jira tickets from GitHub issues using just a comment: /Jira
.
This tool helps developer teams stay organized across platforms by syncing GitHub and Jira with zero manual work. It’s powered by:
Python
Flask
AWS EC2
GitHub Webhooks
Jira REST API
Why I Built This
As developers, we often create issues in GitHub but track tasks in Jira. This results in repeated manual work, copying over titles, descriptions, and keeping both platforms updated.
I wanted a solution where:
Developers stay in GitHub
A comment like
/Jira
would do the heavy liftingJira tickets are created automatically
The system is scalable, secure, and cloud-native
And that’s how JiraSyncBot was born.
Tech Stack
Tech | Purpose |
Python | Core scripting and REST handling |
Flask | Web server to receive GitHub events |
AWS EC2 | Hosting the API |
GitHub Webhooks | Trigger automation from GitHub |
Jira REST API | Create tickets programmatically |
Architecture
textCopyEditGitHub (Issues)
⬇️ Webhook (issue_comment)
Flask API hosted on AWS EC2
⬇️
Jira REST API
⬇️
New Jira Ticket
Only when
/Jira
is commented on an issue, the webhook triggers ticket creation.
Step-by-Step Build
1. Jira Setup
Created a Jira Atlassian account
Generated an API token
Explored the Jira REST API Docs
2. Python Script to Create Jira Ticket
Wrote a Python script(entire script available on my GitHub repo) to:
Authenticate with Jira
Create a ticket with title, description, and type
3. Converted Script into Flask API
Built a Flask app with /webhook
route to:
Receive webhook payload from GitHub
Check if a comment contains
/Jira
Extract issue title/body
Trigger ticket creation
pythonCopyEdit@app.route('/webhook', methods=['POST'])
def webhook():
payload = request.json
comment = payload['comment']['body']
if '/Jira' in comment:
issue_title = payload['issue']['title']
issue_body = payload['issue']['body']
create_jira_ticket(issue_title, issue_body)
4. Deployed to AWS EC2
Launched a Ubuntu EC2 instance
Installed Python, Flask, and dependencies
Deployed with
gunicorn
andnginx
Configured security groups for HTTP access
5. Configured GitHub Webhook
Pointed webhook to EC2 public IP
Listens for
issue_comment
eventsSends payload to
/webhook
endpoint
Demo Flow
Developer opens a GitHub issue
Comments
/Jira
Webhook sends the event to Flask
JiraSyncBot creates a new Jira ticket 🚀
GitHub:
Issue: “Fix mobile login bug”
Comment:/Jira
Jira:
New ticket: “Fix mobile login bug” created in the
BUGS
project
📷 (Issues from our GitHub issues)
What I Learned
How to securely work with API tokens and webhooks
Hosting Flask apps on AWS EC2
Setting up GitHub webhooks with custom conditions
Automating real DevOps workflows that make life easier
What’s Next
Here’s what I’m planning to add:
Slack/Discord notification when a ticket is created
Automatically map labels/assignees
Bi-directional sync between Jira and GitHub
About Me
Daniel Mankong
DevOps | Automation | Cloud | Python
📍 Austin, TX
🔗 https://github.com/danielbangm | https://www.linkedin.com/in/dmankong/
Let's Connect
If you’re passionate about DevOps, automation, or just love clean developer workflows — I’d love to hear your thoughts or feedback on JiraSyncBot!
🔗 Project GitHub Repo: github.com/danielbangm/JiraSyncBot
Subscribe to my newsletter
Read articles from Daniel Mankong directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
