{"id":13573804,"url":"https://github.com/pawelrychlik/jira-dependency-graph","last_synced_at":"2025-04-05T09:07:08.619Z","repository":{"id":14354026,"uuid":"17063678","full_name":"pawelrychlik/jira-dependency-graph","owner":"pawelrychlik","description":"Graph visualizer for JIRA tickets' dependencies","archived":false,"fork":false,"pushed_at":"2024-04-22T15:19:47.000Z","size":186,"stargazers_count":288,"open_issues_count":8,"forks_count":92,"subscribers_count":17,"default_branch":"master","last_synced_at":"2025-03-29T08:07:35.434Z","etag":null,"topics":["chart","docker","epics","graph","graph-visualization","jira","jira-dependency-graph","jira-tickets","project-management","python","python27","python3","visualization"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pawelrychlik.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2014-02-21T17:17:23.000Z","updated_at":"2025-03-21T14:39:52.000Z","dependencies_parsed_at":"2024-04-22T15:31:03.530Z","dependency_job_id":"abec95ec-a946-45af-95f4-8c9de283f9ea","html_url":"https://github.com/pawelrychlik/jira-dependency-graph","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pawelrychlik%2Fjira-dependency-graph","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pawelrychlik%2Fjira-dependency-graph/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pawelrychlik%2Fjira-dependency-graph/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pawelrychlik%2Fjira-dependency-graph/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pawelrychlik","download_url":"https://codeload.github.com/pawelrychlik/jira-dependency-graph/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247312078,"owners_count":20918344,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chart","docker","epics","graph","graph-visualization","jira","jira-dependency-graph","jira-tickets","project-management","python","python27","python3","visualization"],"created_at":"2024-08-01T15:00:41.469Z","updated_at":"2025-04-05T09:07:08.555Z","avatar_url":"https://github.com/pawelrychlik.png","language":"Python","funding_links":[],"categories":["Python","docker"],"sub_categories":[],"readme":"jira-dependency-graph\n=====================\n\nGraph visualizer for dependencies between JIRA tickets. Takes into account subtasks and issue links.\n\nUses JIRA rest API v2 for fetching information on issues.\nUses [Google Chart API](https://developers.google.com/chart/) for graphical presentation.\n\nExample output\n==============\n\n![Example graph](examples/issue_graph_complex.png)\n\nRequirements:\n=============\n* Python 2.7+ or Python 3+\n* [requests](http://docs.python-requests.org/en/master/)\n\nOr\n* [docker](https://docs.docker.com/install/)\n\nUsage:\n======\n```bash\n$ git clone https://github.com/pawelrychlik/jira-dependency-graph.git\n$ virtualenv .virtualenv \u0026\u0026 source .virtualenv/bin/activate # OPTIONAL\n$ cd jira-dependency-graph\n$ pip install -r requirements.txt\n$ python jira-dependency-graph.py --user=your-jira-username --password=your-jira-password --jira=url-of-your-jira-site issue-key\n```\n\nOr if you prefer running in docker:\n```bash\n$ git clone https://github.com/pawelrychlik/jira-dependency-graph.git\n$ cd jira-dependency-graph\n$ docker build -t jira .\n$ docker run -v $PWD/out:/out jira python jira-dependency-graph.py --user=your-jira-username --password=your-jira-password --jira=url-of-your-jira-site --file=/out/output.png issue-key\n```\n\n```\n# e.g.:\n$ python jira-dependency-graph.py --user=pawelrychlik --password=s3cr3t --jira=https://your-company.jira.com JIRATICKET-718\n\nFetching JIRATICKET-2451\nJIRATICKET-2451 \u003c= is blocked by \u003c= JIRATICKET-3853\nJIRATICKET-2451 \u003c= is blocked by \u003c= JIRATICKET-3968\nJIRATICKET-2451 \u003c= is blocked by \u003c= JIRATICKET-3126\nJIRATICKET-2451 \u003c= is blocked by \u003c= JIRATICKET-2977\nFetching JIRATICKET-3853\nJIRATICKET-3853 =\u003e blocks =\u003e JIRATICKET-2451\nJIRATICKET-3853 \u003c= relates to \u003c= JIRATICKET-3968\nFetching JIRATICKET-3968\nJIRATICKET-3968 =\u003e blocks =\u003e JIRATICKET-2451\nJIRATICKET-3968 =\u003e relates to =\u003e JIRATICKET-3853\nFetching JIRATICKET-3126\nJIRATICKET-3126 =\u003e blocks =\u003e JIRATICKET-2451\nJIRATICKET-3126 =\u003e testing discovered =\u003e JIRATICKET-3571\nFetching JIRATICKET-3571\nJIRATICKET-3571 \u003c= discovered while testing \u003c= JIRATICKET-3126\nFetching JIRATICKET-2977\nJIRATICKET-2977 =\u003e blocks =\u003e JIRATICKET-2451\n\nWriting to issue_graph.png\n```\nResult:\n![Example result](examples/issue_graph.png)\n\n\nAdvanced Usage:\n===============\n\nList of all configuration options with descriptions:\n\n```\npython jira-dependency-graph.py --help\n```\n\n### Excluding Links\n\nIn case you have specific issue links you don't want to see in your graph, you can exclude them:\n\n```bash\n$ python jira-dependency-graph.py --user=your-jira-username --password=your-jira-password --jira=url-of-your-jira-site --exclude-link 'is required by' --exclude-link 'duplicates' issue-key\n```\n\nThe grapher will still walk the link, just exclude the edge. This especially useful for bidirectional links and you only\nwant to see one of them, e.g. *depends on* and *is required by*.\n\n### Excluding Epics\n\nIn case you want to exclude walking into issues of an Epic, you can ignore them:\n\n```bash\n$ python jira-dependency-graph.py --user=your-jira-username --password=your-jira-password --jira=url-of-your-jira-site --ignore-epic issue-key\n```\n\n### Including Issues\n\nIn order to only specify issues with a certain prefix pass in `--issue-include \u003cXXX\u003e` and all tickets will be checked that they match the prefix `XXX`.\n\n### Excluding Issues\n\nBy passing in `--issue-exclude`, or `-xi` the system will explicitly ignore the ticket. It can be repeated multiple times, e.g. `-xi MYPR-456 -x MYPR-999` to ignore both issues. \nUse it as a last-resort only, when other means of exclusion do not suit your case, e.g. to omit a part of the graph for better readability.\n\n### Authentication\n\nIt is possible to either use:\n* the username/password combination\n* to login via a token passing in `--bearer \u003cBEARER TOKEN\u003e`. This allows to use a Personal Access Token generated in your JIRA profile (https://confluence.atlassian.com/enterprise/using-personal-access-tokens-1026032365.html)\n* to login via the browser passing in `--cookie \u003cJSESSIONID\u003e`. This logins via the browser and is useful in scenarios where Kerberos authentication is required.\n\nIf you are using Atlassian Cloud, use your API token instead of your account password. You can generate one with the following steps:\n\n1. Access https://id.atlassian.com/manage-profile/security/api-tokens.\n2. Click \"Create API token\".\n3. Copy the token and store it in a safe place.\n\nMore details about API authentication is available in the [official documentation](https://developer.atlassian.com/cloud/jira/platform/basic-auth-for-rest-apis/).\n\n### Closed Issues\n\nBy passing in `--ignore-closed` the system will ignore any ticket that is closed.\n\n### Multiple Issues\n\nMultiple issue-keys can be passed in via space separated format e.g.\n```bash\n$ python jira-dependency-graph.py --cookie \u003cJSESSIONID\u003e issue-key1 issue-key2\n```\n\n### JQL Query\n\nInstead of passing issue-keys, a Jira Query Language command can be passed with `--jql` e.g.\n```bash\n$ python jira-dependency-graph.py --cookie \u003cJSESSIONID\u003e --jql 'project = JRADEV'\n```\n\n\nUsage without Google Graphviz API:\n============\nIf you have issues with the Google Graphviz API limitations you can use your local graphviz installation like this:\n\n```bash\n$ git clone https://github.com/pawelrychlik/jira-dependency-graph.git\n$ cd jira-dependency-graph\n$ python jira-dependency-graph.py --user=your-jira-username --password=your-jira-password --jira=url-of-your-jira-site --local issue-key | dot -Tpng \u003e issue_graph.png\n```\n\n*Note*: Its possible that the graph produced is too wide if you have a number of issues. In this case, it is better to firstly pipe the graph to a 'dot' text file e.g.\n\n```bash\n$ python jira-dependency-graph.py --jira=url-of-your-jira-site --local issue-key \u003e graph.dot\n```\n\nand then process it using `unflatten`:\n\n```bash\nunflatten -f -l 4 -c 16 graph.dot  | dot | gvpack -array_t6 | neato -s -n2 -Tpng -o graph.png\n```\n\nFor a slightly cleaner layout (that preserves the ranks), or if your system doesn't have `unflatten`, you can use `sed` to insert `rankdir=LR;` into the dot file before processing it:\n```bash\nsed -i 's/digraph{/digraph{ rankdir=LR;/g' graph.dot | dot -o graph.png -Tpng\n```\n\nNotes:\n======\nBased on: [draw-chart.py](https://developer.atlassian.com/download/attachments/4227078/draw-chart.py) and [Atlassian JIRA development documentation](https://developer.atlassian.com/display/JIRADEV/JIRA+REST+API+Version+2+Tutorial#JIRARESTAPIVersion2Tutorial-Example#1:GraphingImageLinks), which seemingly was no longer compatible with JIRA REST API Version 2.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpawelrychlik%2Fjira-dependency-graph","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpawelrychlik%2Fjira-dependency-graph","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpawelrychlik%2Fjira-dependency-graph/lists"}