/jira2org-story.py

Extract Jira Issues and Generate Org-mode Headings

Primary LanguagePythonGNU General Public License v3.0GPL-3.0

jira2org-story.py - Extract Jira Issues and Generate Org-mode Headings

This Python script fetches information of Jira issues and returns an Org-mode representation of those issues in Org-mode format. This Org-mode format is highly specific for my own purpose but you are able to modify this structure to meet your requirements. Therefore, this script works as a blueprint or template for you.

You can use one to many Jira issue numbers (for stories) as command line parameter. If you use Jira issues that are Epics, all corresponding stories are retrieved as well.

  • Author: Karl Voit
  • License: GPLv3 or higher
  • Coding was started in May 2016

Installation

  1. Install Python version 2.x
  2. Install Python Jira library via pip install jira or similar
  3. Invoke the script via python ./jira2org-story.py
  4. Generate the file jiraconfig.py
    • similar to the template from the previous script output
    • in the same directory as the other Python script
  5. Re-start the script via python ./jira2org-story.py 1234 and it should give you a similar output as stated below

Command Line Parameters

python ./jira2org-story.py --help
usage: jira2org-story.py [-h] [--version] IPD [IPD ...]

This tool retrieves a Jira issue and returns an Org-mode
representation according to the system of Karl Voit.

The output is highly specific for my personal usage. If you want to have
a similar functionality, you have to adapt it to your needs. This would
require at least a search&replace of "IPD" with the Jira project ID of
your choice, all Jira URLs, and the custom org-mode link "ipd:1234".

positional arguments:
  IPD         One or many IPD numbers of stories or epics (without "IPD-"
              prefix)

optional arguments:
  -h, --help  show this help message and exit
  --version   show program's version number and exit

autor:      Karl Voit <tools@Karl-Voit.at>
license:    GPL v3 or any later version
URL:        https://github.com/novoid/jira2org-story.py/
bugreports: via GitHub
version:    Time-stamp: <2016-05-13 14:00:47 karl.voit>

Motivation and Similar Projects

I work as a Product Owner in an agile Scrum process. To simplify my digial life, I use Org-mode for almost everything there is.

For managing my scrum stories, I was using an Org-mode representation long before I extracted things from Jira via scripts. I did not want to change how I am using Org-mode for Jira stories.

This is why I do not use ready-to-use projects that mirror or synchronize Jira with Org-mode:

Example

Following headings are an example output when I call my script with the parameter “1234” (as of 2016-05-14).

Usually, I do use babel to execute the script:

#+BEGIN_SRC sh :results output raw :dir c:/Users/karl.voit/src/jira2org-story.py/
c:/Users/karl.voit/src/jira2org-story.py/jira2org-story.py 1234
#+END_SRC

Some remarks:

  • Please note that I make use of task dependencies using TRIGGER and BLOCKER properties according to org-depend.el.
  • I did create a customized link so that “IPD:1234” links to its Jira representative “https://product.infonova.at/jira/browse/IPD-1234”.
  • Usually, I manually do search&replace “i1234” with a human-readable short version of the story title.
  • You might wonder about the status “NEXT”. I am using “TODO” to define a task which will be of interest in future (but not now) and “NEXT” for a task that can be done now.

This structure is in constant change as I add and remove things or modify my Org-mode-related workflows.

*** TODO [[IPD:1234]] This Is The Title Of The Story [0/7]                   :US_i1234:
:PROPERTIES:
:CREATED:  [2016-05-14 Sat 19:14]
:ID: 2016-05-14-Story-i1234
:END:

| [[IPD:1234][1234]] | This Is The Title Of The Story | Joe.Assignee |

**** STARTED create Jira [[IPD:1234]]
:PROPERTIES:
:CREATED:  [2016-05-14 Sat 19:14]
:ID: 2016-05-14-i1234-create-jira-ipd
:BLOCKER:
:TRIGGER:  2016-05-14-i1234-define-champ(NEXT) 2016-05-14-i1234-estimation(NEXT)
:END:

- fill out:
  - [X] set reporter
  - [ ] set level red
  - [ ] fixVersion

**** NEXT create Confluence page with template
SCHEDULED: <2016-05-14>
:PROPERTIES:
:CREATED:  [2016-05-14 Sat 19:14]
:ID:    2016-05-14-i1234-create-confluence-page
:BLOCKER:
:TRIGGER:  2016-05-14-i1234-write-acceptance-criteria(NEXT)
:END:

- fill out:
  - [ ] add Jira-Link [[IPD:1234]]
  - [ ] PO
  - [ ] Title
  - [ ] Business Value
- [ ] add Confluence-short-URL to story table above

**** TODO write Acceptance Criteria, Docu, Perms
:PROPERTIES:
:CREATED:  [2016-05-14 Sat 19:14]
:ID: 2016-05-14-i1234-write-acceptance-criteria
:BLOCKER: 2016-05-14-i1234-create-confluence-page
:TRIGGER: 2016-05-14-i1234-confidence-green(NEXT) 2016-05-14-i1234-hand-over-team(NEXT)
:END:

**** TODO add Champ to Confluence and Jira                                            :refinement:
:PROPERTIES:
:CATEGORY: refinement
:CREATED:  [2016-05-14 Sat 19:14]
:ID: 2016-05-14-i1234-define-champ
:BLOCKER:
:END:

**** TODO get Estimation on [[IPD:1234]]                                                  :refinement:
:PROPERTIES:
:CREATED:  [2016-05-14 Sat 19:14]
:CATEGORY: refinement
:ID: 2016-05-14-i1234-estimation
:BLOCKER: 2016-05-14-i1234-create-jira-ipd
:TRIGGER:
:END:

- Estimation:

**** TODO get confidence-level green on [[IPD:1234]]                                      :refinement:
:PROPERTIES:
:CATEGORY: refinement
:CREATED:  [2016-05-14 Sat 19:14]
:ID: 2016-05-14-i1234-confidence-green
:BLOCKER: 2016-05-14-i1234-write-acceptance-criteria 2016-05-14-i1234-estimation
:TRIGGER:
:END:

**** TODO hand over to team
:PROPERTIES:
:CREATED:  [2016-05-14 Sat 19:14]
:BLOCKER: 2016-05-14-i1234-write-acceptance-criteria 2016-05-14-i1234-estimation
:ID: 2016-05-14-i1234-hand-over-team
:TRIGGER:  2016-05-14-i1234-accept(WAITING) 2016-05-14-Story-i1234(TEAM)
:END:

**** acceptance + finish US
:PROPERTIES:
:CREATED:  [2016-05-14 Sat 19:14]
:ID: 2016-05-14-i1234-accept
:BLOCKER: 2016-05-14-i1234-hand-over-team
:TRIGGER: 2016-05-14-Story-i1234(DONE)
:END: