Every 6 hours
Open Jira tickets for exploited vulnerabilities in your dependencies
Every 6 hours your repositories' dependencies are checked against public vulnerability data, and each new known vulnerability gets one Jira ticket.
- Runs
- Every 6 hours
- Apps
- GitHub, Jira
- AI
- Not needed
- Access
- GitHub contents read; Jira create
Send this to your assistant
Create a ClickRuntime automation: every 6 hours, export the dependency list of each repo in acme, check them against the OSV vulnerability database, and open a Jira ticket in SEC for each new vulnerability found.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A fintech startup must show auditors that known vulnerabilities in its software are tracked and fixed on time. Its security work lives in Jira, but vulnerability data lives in GitHub and public databases, so tracking is manual and patchy.
Checking every repository's dependencies regularly and opening one Jira ticket per new vulnerability creates an auditable record automatically. Each finding has an owner and a due date, and nothing depends on someone remembering to check.
What you get out of it
An audit trail by default
Every vulnerability becomes a ticket with a date. Showing auditors how findings were handled is straightforward.
One ticket per finding
Findings already ticketed are remembered. The security backlog is not flooded with duplicates.
Checked several times a day
New vulnerabilities are picked up within hours of being published. The window of exposure shrinks.
Works across all repositories
Every repository's dependency list is checked the same way. No project is forgotten.
How it works
What happens, step by step
Every 6 hours, ClickRuntime gets the list of dependencies for each of your GitHub repositories.
It checks each package and version against the public OSV vulnerability database.
It skips vulnerabilities it has already opened a ticket for.
For each new one, it creates a Jira ticket in your security project with the package, version, repository and advisory link.
Before it runs live
- Connect GitHub
- Connect Jira
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other GitHub and Jira steps into one automation
Under the hood
The code that runs this automation
from clickruntime import on_trigger, credentials, http, state
def gh(method, path, **kw):
resp = http.request(method, f"https://api.github.com{path}", headers={
"Authorization": f"Bearer {credentials.connection('github', 'work')}", "Accept": "application/vnd.github+json"}, **kw)
return resp.raise_for_status() or (resp.json() if resp.content else None)
JIRA = "https://api.atlassian.com/ex/jira/your-cloud-id"
def jira(method, path, **kw):
resp = http.request(method, JIRA + path, headers={"Authorization": f"Bearer {credentials.connection('jira', 'work')}", "Accept": "application/json"}, **kw)
return resp.raise_for_status() or (resp.json() if resp.content else None)
def adf(text):
return {"type": "doc", "version": 1, "content": [{"type": "paragraph", "content": [{"type": "text", "text": text}]}]}
REPOS, PROJECT = ["acme/app", "acme/api"], "SEC"
@on_trigger
def run(event):
seen, created = set(state.get("ticketed") or []), []
for repo in REPOS:
pkgs = gh("GET", f"/repos/{repo}/dependency-graph/sbom")["sbom"]["packages"]
purls = [r["referenceLocator"] for p in pkgs for r in p.get("externalRefs", []) if r["referenceType"] == "purl" and "@" in r["referenceLocator"]]
results = http.post("https://api.osv.dev/v1/querybatch", json={"queries": [{"package": {"purl": u}} for u in purls[:1000]]}).json()["results"]
for purl, res in zip(purls, results):
for v in res.get("vulns", []):
key = f"{repo}|{purl}|{v['id']}"
if key in seen:
continue
t = jira("POST", "/rest/api/3/issue", json={"fields": {"project": {"key": PROJECT}, "issuetype": {"name": "Task"},
"summary": f"{v['id']} in {purl.split('/')[-1]} ({repo})"[:250], "labels": ["dependency-vuln"],
"description": adf(f"Repository: {repo}\nPackage: {purl}\nAdvisory: https://osv.dev/vulnerability/{v['id']}")}})
seen.add(key)
created.append(t["key"])
state.set("ticketed", sorted(seen))
return {"created": created}FAQ
Common questions
Where does the vulnerability data come from?
Do I need anything turned on in GitHub?
Can it focus only on actively exploited issues?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Post a daily digest of Jira and GitHub activity
Every weekday morning Slack shows which Jira tickets moved and which pull requests were opened or merged, with a short summary.
See how it worksTurn GitHub bug reports into Jira tickets
When a bug is reported on GitHub, a Jira ticket is created with an AI summary and priority, and the GitHub issue gets a comment with the Jira key.
See how it worksKnow the moment your website goes down
Your team hears in Slack when the site stops responding or slows down, and again when it's back.
See how it worksKeep exploring
Set up “Open Jira tickets for exploited vulnerabilities in your dependencies” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.