Suresh Payankannur

Saturday, August 13, 2011

Agile Project Management with Redmine

Redmine is an open source issue tracking system using Ruby on Rails platform. Redmine is a fully featured application including issue tracking, Wiki, Forums, File Management etc. Full list of Redmine features can be found at the Redmine website.

I was searching for a Scrum project management tool for a new project. Experimented with a number of different open source tools. Even though these tools have unique features, they weren't a good fit for what I was looking for.

A great list of Scrum Project Management tools can be found here:


Then I came across Redmine. After playing a bit with it, I liked the features and the ability to customize key aspects of the product.

Required Redmine Plugins for Agile Project Management

Install the latest version of the following plugins. I am using Redmine version 1.2.1 with MySQL database on Ubuntu.

  1. Advanced Roadmap
  2. Redmine Charts
  3. Redmine Graphs
  4. Issue Due Date
  5. Issue History Tab
  6. Redmine Parking Lot
  7. Redmine Taskboard

Customize Redmine

One of the great strength about Redmine is that key aspects can be customized to suit the needs. To match the project structure and execution style, I customized the a number of features.

Customize User Groups

Customize the roles to closely match the roles used in a typical Agile/Scrum Project. Modify the User Groups to match your project organization.

Customize Trackers

Trackers are the issue types. I have customized the trackers as follows:

  1. Bug: A defect
  2. Feature: A feature defined by the business
  3. Clarification: A clarification request
  4. Task: A task that needs to be done
  5. Tech Need: A technical feature (eg. framework) that is needed to implement a business feature

Customize Issue Status

  1. New, Open, Re Open: Issue status.
  2. In Progress: Work is in progress
  3. Done: The work is done. Issue is assigned (should be done manually) to the reporter
  4. Closed: The reporter verifies the issue and mark ist as Closed when he/she is satisfied
  5. Rejected, Won't Fix: Associated typically with defects
  6. Blocked: The issue is blocked

Customize Permissions

Customize the permissions according to the organizational structure and guidelines.

Customize Workflow

Customize the workflow to ensure that the issues are are progressed correctly.

Customize Issue Priorities

  • Low, Normal, High, Urgent: Applicable to Defects
  • Immediate, Must Have, Should Have, Nice to Have: Applicable to Features

Custom Fields

Add a custom field to Versions to denote the start date for a version. By default, the version creation date is taken as the start date. That is not correct. A version can be created ahead of time and scheduled for later. This custom field should be called Start Date.

Customize Plugins

Some of the Redmine plugins need additional customization to make it better. This includes customization of graphs, task board and milestone plugin.

Customizing the Graphs Plugin

Customizing the Graphs plugin is explained in this post.

Customize the Roadmaps Plugin

This customization is to show the Blocked issues in bold red.

Modify the $REDMINE_ROOT/vendor/plugins/advanced_roadmap/app/views/versions/_info.html.erb. Similar to existing begin_strike/end_strike variables, add additional pair of variables begin_bold/end_bold and initialize set their values as follows:
if == 'Blocked'
  begin_bold = ''
  end_bold   = ''
  color      = 'red'
Then add begin_bold/end_bold tags after each begin_strike/end_strike tag. This will make any Blocked issues to stand out.

Customize Task Board Plugin

Task board plugin provides Kanban like feature to quickly visualize the status of each task. But it doesn't have a Blocked column. The customization is to:

  • Additional blocked column in the task board
  • Categorize the version selection page to open and closed versions
  • Show issues with different status correctly on the task board

The customizations require modifications to the following files:

  1. $REDMINE_ROOT/vendor/plugin/redmine_task_board/app/view/task_boards/show.html.erb and replace the existing code with the following
    <div id="task-columns">
     <%= render :partial => 'task_column', 
        :locals => {:title => 'To Do', :issues => @issues_to_do} %>
     <%= render :partial => 'task_column', 
        :locals => {:title => 'In Progress', :issues => @issues_in_progress} %>
     <%= render :partial => 'task_column', 
        :locals => {:title => 'Blocked', :issues => @issues_blocked} %>
     <%= render :partial => 'task_column', 
        :locals => {:title => 'Verify', :issues => @issues_to_verify} %>
     <%= render :partial => 'task_column', 
        :locals => {:title => 'Closed', :issues => @issues_closed} %>
  2. $REDMINE_ROOT/vendor/plugin/redmine_task_board/app/view/task_boards/_task_column.html.erb
       color = ''
       if title == 'To Do'
          color = 'style="background:#f8f8f8"'
       elsif title == 'In Progress'
          color = 'style="background:#66ff99"'
       elsif title == 'Blocked'
          color = 'style="background:#ff0000"'
       elsif title == 'Verify'
          color = 'style="background:#6699ff"'
       elsif title == 'Closed'
          color = 'style="background:#009966"'
    <div class="task-column">
        <h3 <%= color %> ><center><%= title %></center></h3>
        <% issues.each do |issue| %>
            <div class="issue">
                <a href="/issues/<%= %>">
                #<%= %> - <%= issue.tracker %> :
                <%= issue.subject %>
        <% end %>
  3. $REDMINE_ROOT/vendor/plugin/redmine_task_board/app/view/task_boards/index.html.erb

<h2>Choose a Sprint</h2>

<ul id="version-choice">
<% @project.versions.each do |version| %>
    <% if %>
       <li><%= link_to, '/task_boards/show/' + + '?project_identifier=' + version.project.identifier.to_s %></li>
    <% end %>
<% end %>
<ul id="version-choice">
<% @project.versions.each do |version| %>
    <% if version.closed? %>
       <li><%= link_to, '/task_boards/show/' + + '?project_identifier=' + version.project.identifier.to_s %></li>
    <% end %>
<% end %>

  • $REDMINE_ROOT/vendor/plugin/redmine_task_board/app/controllers/task_boards_controller.rb

  • def show
      @version = Version.find(params[:id])
      @project = @version.project
      @issues_to_do = Issue.find_by_version_id_and_status_names
                      (, ['New', 'Open', 'Re Open'])
      @issues_in_progress = Issue.find_by_version_id_and_status_names
                            (, ['In Progress'])    
      @issues_blocked = Issue.find_by_version_id_and_status_names
                        (, ['Blocked'])    
      @issues_to_verify = Issue.find_by_version_id_and_status_names
                          (, ['Done', 'Rejected', "Won't Fix"])
      @issues_closed = Issue.find_by_version_id_and_status_names
                       (, ['Rejected', 'Closed'])

  • $REDMINE_ROOT/vendor/plugin/redmine_task_board/asset/stylesheets/task_board.css
    .task-column {
        width: 18%;
        height: 100%;
        float: left; 
        margin-right: 1em;

  • Guidelines

    There are a few guidelines to follow. Ideally, these should be automatic. But there is not enough support for Redmine at present to address these. So follow these guidelines manually by the team.

    1. Business features should use the Feature tracker.
    2. Technical requirements should use the Tech Need tracker.
    3. Development tasks should be added as a subtask of a Feature

  • Development tasks should use the Task tracker.
  • When a Task is changed status (eg. to In Progress), manually change the status of the corresponding feature also
  • Similarly when all the tasks are Done or Closed, change the status of the corresponding feature
  • Use only one level of subtasks (Feature -> Task). Otherwise, the UI wont show the hierarchy properly.
  • Once the issue is Done, assign the issue back to the reporter

  • Results

    Product Backlog

    Sprint Backlog

    Burndown Chart

    Kanban Board

    Now it is important for the success of the process to get the team adopt to the tool and follow certain manual steps to ensure that the status is properly reflected in Redmine.


    Post a Comment

    Blog Archive

    Scroll To Top