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:

  1. http://agilescout.com/best-agile-scrum-tools
  2. http://userstories.com/products

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 issue.status.name == 'Blocked'
  begin_bold = ''
  end_bold   = ''
  color      = 'red'
end
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} %>
    </div>
    
  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"'
       end
    -%>
    <div class="task-column">
        <h3 <%= color %> ><center><%= title %></center></h3>
        <% issues.each do |issue| %>
            <div class="issue">
                <a href="/issues/<%= issue.id %>">
                #<%= issue.id %> - <%= issue.tracker %> :
                <%= issue.subject %>
                </a>
            </div>
        <% end %>
    </div>
    
  3. $REDMINE_ROOT/vendor/plugin/redmine_task_board/app/view/task_boards/index.html.erb

<h2>Choose a Sprint</h2>

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


  • $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
                      (@version.id, ['New', 'Open', 'Re Open'])
      @issues_in_progress = Issue.find_by_version_id_and_status_names
                            (@version.id, ['In Progress'])    
      @issues_blocked = Issue.find_by_version_id_and_status_names
                        (@version.id, ['Blocked'])    
      @issues_to_verify = Issue.find_by_version_id_and_status_names
                          (@version.id, ['Done', 'Rejected', "Won't Fix"])
      @issues_closed = Issue.find_by_version_id_and_status_names
                       (@version.id, ['Rejected', 'Closed'])
    end
    


  • $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.

    0 comments:

    Post a Comment

    Blog Archive

    Scroll To Top