Skip to content

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.

Paste it into your assistant. It tells you what it will send or change before it runs live.

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

  1. Every 6 hours, ClickRuntime gets the list of dependencies for each of your GitHub repositories.

  2. It checks each package and version against the public OSV vulnerability database.

  3. It skips vulnerabilities it has already opened a ticket for.

  4. 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

RunsEvery 6 hours
Open Jira tickets for exploited vulnerabilities in your dependenciestoday, 9:00Succeeded
Jira · SECSEC-88 GHSA-4w2v-q235-vp99 in axios@1.6.0 (acme/app)

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • 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

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
jira_tickets_for_exploited_vulnerabilities_in_github_dependencies.pyexample
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?
From OSV, a free public database of known vulnerabilities in open-source packages, checked against the dependency list GitHub generates for each repository.
Do I need anything turned on in GitHub?
The dependency graph must be on for each repository, which it is by default for most. No paid features are required.
Can it focus only on actively exploited issues?
Yes. It can also check the list of vulnerabilities known to be exploited in the wild and only open tickets for those, or raise their priority.
What permissions does it need?
GitHub contents read; Jira create. Nothing else in your accounts is used.
Does it need AI?
No. It runs without AI, so it doesn't use your plan's AI allowance.
How many runs does it use?
One run each time it runs (every 6 hours). Checks that find nothing to do and stop right away aren't counted.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

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.