How to set up a quasi-kanban for Jira in VS CodeApril 29, 2021 in Software
The Kanban, in action
Jira is undeniably a powerful project management system, that can fit many cases for many teams. Sadly, its flexibility comes at a cost - basic developer workflows become tedious, and the slow web UI doesn’t help.
After struggling for a bit with the web UI and the MacOS app, I found a Jira flow that works for me, and it’s based on VS Code, where I do all of my work.
- Install the Jira and Bitbucket (Official) VS Code extension.
- Set it up - either globally, or per workspace. Tip: you can disable it globally, then enable for certain workspaces - that’s what I do.
- Ensure the sidebar “Atlassian” item is showing; otherwise right-click the sidebar and turn it on.
- Create filters (see below)
My “Kanban” filters for Jira
The Atlassian sidebar from the extension lists Jira tasks, and lets you add new tasks. But it is a simple list - with no way to see anything but the task name. So, out of the box, it is not very useful.
However, instead of looking at the inconvenient list of all tasks in Jira, you can define a number of JQL filters that will become sub-lists. JQL is a query language for Jira tasks, that can pull up almost any selection of tasks.
So what do I do? I set up a Kanban. Kanban is a board that lists tasks divided by workflow stages. This way it’s immediately clear what stage needs the most attention. Should you focus on defining work, doing the implementation, or closing pull requests? Kanban shows you the way.
Usually kanban is organized horizontally, but in my implementation, it goes vertically in the Atlassian sidebar. I created several JQL filters for the sidebar, and each filter displays one stage of the workflow.
(Note: I list filters in the workflow order, but I actually have them reversed in my sidebar - because later stages of the workflow need more attention.)
Created by me & unassigned
This is the ultimate inbox/icebox for requests and promises. Before, I was hesitant to use Jira as an inbox, as tasks tend to get lost, unless put in the right place. But with this filter, nothing I add is ever lost.
assignee is EMPTY AND creator = currentUser() AND project = "My Project" ORDER BY lastViewed DESC
My epics + unassigned
This is an inbox for all work that anyone creates in an epic that I’m responsible for. It exists because sometimes people add tasks to an epic but don’t assign them.
Tasks here should be reviewed and assigned to me, or to somebody else. Then they move into the “Backlog”.
assignee is EMPTY AND "Epic Link" in (MP-1234) AND project = "My Project" ORDER BY lastViewed DESC
Unfortunately, I haven’t found a way to do a “join” on epics, to say
"Epic Link" in (SELECT epics WHERE assignee=currentUser()), and the list of epics is manual. But it doesn’t have to update too often.
This is all of the tasks that I am responsible for, and have not started yet.
assignee = currentUser() AND status = Backlog AND project = "My Project" ORDER BY lastViewed DESC
This is all of my active work.
assignee = currentUser() AND status not in (Backlog, Closed, Accepted, Cancelled, "In Testing") AND development[pullrequests].all=0 AND project = "My Project" ORDER BY lastViewed DESC
pullrequests filter is the clever part and it is used to separate tasks from the next filter: In PR.
Once I’ve made a PR for a task, the nature of my work on it changes - now the task is being reviewed and finalized. So it’s useful to see such tasks separately.
assignee = currentUser() AND status not in (Backlog, Closed, Accepted, Cancelled, "In Testing") AND development[pullrequests].all>0 AND project = "My Project" ORDER BY lastViewed DESC
These tasks are no longer my responsibility but the QA engineer’s. But I still prefer to track a task until its completion.
assignee = currentUser() AND status = "In Testing" AND project = "My Project" ORDER BY lastViewed DESC
Closed (not shown)
Finally, all tasks that don’t match the filters above are closed - no need to see them anymore!
Adapting the filters for yourself
- Replace the
projectfilter with your project name, or just remove it
- Fill in the
epicsquery with your epic IDs (and set a reminder to check them after your iteration planning meeting)
- Tune the status filters to match your workflow (these are configurable, so you probably have a different set)
My work loop
- Every iteration, after the planning meeting:
- Check epics query
- Create tasks for myself in my epics.
- Every day:
- Check that “In PR” and “In testing” tasks are moving along
- Check inbox lists if there is something I should start today, and move to “Backlog”, or even “Active”, to prioritize
- Every time I start working:
- Pick an “Active” task to finish
- If no “Active”, pick a task from “Backlog” to start and change state to “In Development”
- When it is done, create PR (make sure to specify task ID so it gets auto-assigned), or move to “In Testing” / “Closed”
- Every time I promise something, or have a good idea, or am asked to do something ad hoc: create a task, maybe fill in a description, and move along. That’s the power of an inbox: you can add items quickly, and be sure they are not lost.
To reprase Alf, if you don’t like Jira, you just don’t know how to cook it!