へなちょこSEの考察

0x22歳のへなちょこSEが、日々思うことを考察します。自社内、金融系を経て現在法人系PKG開発に従事。

MS Project と Redmineの連携

MS Project と Redmine を連携させてみた

はじめに


プロジェクトの管理をしなければならなくなった。
これまでは一開発者だったんだけど、プロジェクトの同時進行が増えてきたために、ついにそのお役が回ってきてしまった感じ。
まぁいい機会なので頑張ってみようと思う。


で、Redmineは高機能だけど、プロジェクト管理には痒いところに手が届かない感がある。
プラグインもいろいろあるけど、なかなかうまく動いてくれなかったり、自動計算とかはあんまりやってくれないし。
ということで、MS Projectと連携させてみることにした。

前提


MS ProjectでWBSを起こし、タスクとリソースを管理する。
Redmineは作業の状況を入力してもらうだけで、開始日・終了日などは変更させない。

方法


まずMS ProjectでWBSを作った。
バージョンを工程とし、詳細設計、製造/単体試験に分けて、さらに機能毎などタスクに落としこむ。
一通りタスクが出来上がったらExcelに貼っつけてRedmineにインポートする。
CSVとかでやってもいいけど、今回はこの便利ツールを使った。


Redmineチケット★一括★の詳細情報 : Vector ソフトを探す!


で、登録されたチケットのIDをMS Project側にも書いておく。
(そういう意味でも上記ツールが楽)


MS Project側はマクロを設定し、REST API経由でチケットの情報を取得してくるように設定。
取得した情報は適宜MS Project側に貼り付けていく。
自分が取得しているのはとりあえず作業時間とトラッカーとステータスくらい。
まだ他にも必要になるかも。

運用


運用イメージはこんな感じ。


  1. MS Project側の情報をマクロで更新。
  2. 必要に応じてリソースの再割当てや開始日の調整を実施。
  3. Excelに貼り付けてツールで更新を反映。


こうすると、作業管理はRedmineでやりつつプロジェクトの状況を可視化したいときはMS Projectから素敵レポートを出力することができる。
とはいえ、MS Projectの使い方自体を勉強中なのでこれでうまくいくのかは未知数。


情報取込のマクロはこんな感じ。
拾い物を切り貼りしたやっつけです

Const API = "http://server/redmine/"
Const Key = "key=aaaaabbbbbccccc1234567890123457890"


' ###################################################################
' #
' # Redmineから情報を取得する。
' #
' # チケット番号が入力されたタスクを、Redmineの情報で更新する
' # チケット番号が入力されていないタスクは無視される
' #
' ###################################################################
Sub ImportRedmineData()

    Dim prj As Project
    Set prj = ThisProject
    Dim tsk As Task
    Dim ticket As Object
    
    ' すべてのタスクを対象に動かす
    For Each tsk In prj.Tasks
    
    ' チケット番号が入力されている場合
    If tsk.Text1 <> "" Then
    
        Set ticket = GetXmlData(API + "issues/" + tsk.Text1 + ".xml?" + Key)
        
        '説明
        tsk.Text6 = ticket.getElementsByTagName("description").Item(0).text
        
        'トラッカー
        tsk.Text2 = ticket.getElementsByTagName("tracker").Item(0).getAttribute("name")
        
        'ステータス
        tsk.Text4 = ticket.getElementsByTagName("status").Item(0).getAttribute("name")
        
        'トラッカー
        tsk.ActualWork = ticket.getElementsByTagName("spent_hours").Item(0).text
        
        If ticket.getElementsByTagName("parent").Length > 0 Then
        
            tsk.Text5 = ticket.getElementsByTagName("parent").Item(0).getAttribute("id")
        
        End If
        
    End If

    Next

End Sub