QLOOKアクセス解析
ホーム   »  Redmine
Category | Redmine

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

db:migrete_pluginsしてもテーブルが生成されなくなった時の対処方法

プラグイン開発時にdb:migrete_pluginsしても
テーブルが生成されない現象が発生。

原因は、schema_migrations テーブルの情報と
実際の情報に不整合が出てしまっていたのが原因でした。

schema_migrations テーブルでマイグレーションの管理をしてるのですが
手動で色々消したり追加したりしていたのでバージョン不整合が起きてしまい
正常に認識されなかったようです。(昔はschema_infoという名前だったらしい)

select version from schema_migrations where version like '%pluginname%';
でデータを確認

delete * from schema_migrations where version like '%pluginname%';
でデータを一律削除

でdb:migrete_pluginsが正常に動作するようになりました。
スポンサーサイト

Redmineを半年使ってみた振り返り

Redmineをプロジェクトに導入して半年が経ったので振り返り。
基本的には良いツールだと思います。

当たり前ですがツールはツールなので後は使う側の問題です。
今後はより活用していくために自分のマネジメントにあった
プラグインを作成していこうと思います。

◆プロジェクト概要
・規模は10-15人程度
・業務内容は通常のウォーターフォール型の開発に加えて
 突発的な割り込み作業のハイブリッド。
 割り込み作業は市場での問題点の対応や、新たな要求の見積りや対応など。

◆目的
・通常のWF型の開発業務については細かな計画もあり、各種数値管理もかなり
 細かく管理する仕組みがあり不自由はなかったが、割り込み作業については
 管理が出来ておらず、見える化が出来ていなかったので見える化がしたかった。
 ⇒なので今回は割り込み部分だけをRedmineで管理した。

・開発に関連する情報が色々なサーバなどに散らばっており過去のナレッジが
 体系的の残っていかない、開発中に必要な情報も探しにくく非効率という面があったので
 RedmineのWiki/文書管理を利用して情報共有の効率化を行いたい。

・トレーサビリティの向上
 通常の開発作業については管理する仕組みがあり特に課題は無かった。 
 ただ、突発的に発生する顧客の問い合わせや、市場で発生した問題の対応については
 メールだけでしか情報が残っていないという状況が多く、
 後に対応の経緯や工数などの問い合わせがあった場合、すぐに対応が難しかった。
 Redmineのチケットに情報を残しておくことでそれらを解決したかった。

◆運用する時に気を付けた方がよいこと
・チケットは小さい単位の方が良い。開発にリズムがでる。
 メンバが毎日チケットを確認するぐらいの周期の方が良い。
・メール通知機能は便利だけど現場の環境で使うのは
 いつも色々面倒だった。
 セキュリティとか色々あるので。
・チケットの棚卸をやる。
 週1回ぐらいはだれかがやった方が良い。
・カテゴリ設計は最初にある程度きっちり決めておいた方が良い


◆良かった点
・割り込み作業の作業管理については見える化が進み
 各自の残作業が分かりやすくなった。
 工数についてもチケットでの集計が出来るようになった。
 ただ、通常作業と割り込み系の作業で2つ管理となっている面はやはり
 やりにくい面があり、今後はRedmineで一元管理をしていきたい。

・自分のチームは複数のプロジェクトの作業を受け持っているので
 それぞれの運用ルールや開発環境などまとめていった。
 いままではメールや色んなサーバに開発に関する情報が散乱していたのが
 「ここを見れば良い」という感じになったのは良かった点。

・チケットに各種情報や経緯を記載することで
 トレーサビリティは向上した。
 その作業に関連する情報はチケットに集約されるので
 メンバのスイッチする時ときも楽になった。
 メールの場合、色々情報をサルベージする時間が必要だったので。

・Excel管理よりもメンバが楽しそうだった
 やっぱりこの業界で働いているだけあって新しい事をやると楽しい雰囲気がでた。
 Excelでタスクがいっぱりあるとげんなりするけど、
 チケットだとやる気が出たりする。
 チケットをいっぱい消化すると、メンバの貢献度が見える形になるのも良いと思います。

◆悪かった・微妙だった点
・最初の計画化はやっぱりMSProjectが優位。
 最初の計画Fixまでは日々状況が変化するため、
 日程の入れ替えや担当者の変更、追加作業など追加などが頻発する。
 そうなるとRedmineでは厳しい。
 MSProjectだとeasyです。特にリソース配分状況が一目で分かるのと、
 マウス操作で作業入れ替えが出来るのは便利です。
 最初はMSProject、Fix後はRedmineで管理という運用にしてました。

・Wiki
 貧弱。また文書を書くには若干慣れが必要。

・工数メトリクス集計
 デフォルト機能では大まかな集計は可能だが
 細かな単位で管理したい場合はカテゴリ設計などをきっちりしたりする必要あり。
 またそれでDB上は集計できる値が残るが、簡単に集計出来る仕組みがないので
 報告資料を作る際にはひと手間必要。



redmineでEVMプラグイン作成(1)

Redmineを仕事で使い始めて半年程度経ちます。とても便利だと感じていますが
集計機能についてはやはりもう少し強化してほしいと思っています。
特にEVM(アーンド・バリュー・マネジメント)のグラフについては個人的にはどうしても欲しい!
ということでEVMプラグイン作成に着手したいと思います。

とはいえ、本業はJava/C++なのでRuby/Railsは初心者です。
日曜プログラマで頑張るので作成完了はまだまだ先になりそうです。。
とりあえずメモしていきます。

◆各種値の定義
以下でグラフを作成する。
・PV (Planned Value)
 ⇒チケットの予定工数。完了予定日に100%計上する。

・EV (Earned Value)
 ⇒チケットの予定工数×進捗率

・AC (Actual Cost)
 ⇒チケットの実績工数


◆データの取得方法についての考察
・PV
 ⇒完了予定日に100%計上するのであれば issues テーブルから簡単に取得可能。

・EV
 ⇒データ集計日のスナップショットだけ欲しいのであれば簡単。
  issues テーブルから取得するだけ。
  但しEVMのグラフを作成するには推移情報が必要。
  Redmineでは進捗率の履歴情報は保持していないので新規にテーブルを作成して保持するようにする。
  この際以下の点に留意すること。
  ・見積り工数が変わった場合にEV値も変わるように考慮する
  ・進捗率については後から日付を指定して変更可能すること
   例えば本当は先週に50%完了してたけど入力忘れてた時とかに対応出来るように。

・AC
 ⇒time_entries テーブルで保持されているので集計すれば良いだけ。


◆グラフ描画
gruffを採用。
Flash系ライブラリはカッコが良くて機能も豊富なんですが
週報とかに張り付ける時とかにpngとかの方がうれしかったりする場面が多そうなので。

Redmineのチケット登録でのレコード生成調査 その2

Redmineのチケット登録については

  • Redmineのチケット登録でのレコード生成調査
  • RedmineのチケットをVBAで登録してみる

    で紹介しましたがその続きです。

    チケットでカスタムバリューを使っている場合はもう少しデータ生成が必要です。

    ◆カスタムフィールドの定義custom_fields テーブルに登録されています。
    チケットのカスタムフィールドは type が「IssueCustomField」になっているもの。
    field_formatやpossible_valuesに定義した値が入っています。

    ◆チケットに紐付いたカスタムフィールドの値custom_values テーブルに登録されます。
    チケット登録を行う際にカスタムフィールドに値を設定したい場合は
    このテーブルにインサートを行います。

    以下の値を設定します。
    customized_type: "Issue"を指定(固定)
    customized_id: このデータを紐付けるチケットのidを指定
    custom_field_id: どのカスタムフィールド定義かを示す。custom_fields.id を指定。
    value: カスタムフィールドの値を指定

    ◆各プロジェクトでのカスタムフィールド有効/無効設定
    custom_fields_projects テーブルで管理しています。
    各プロジェクトでカスタムフィールドを有効にした場合、
    このテーブルに対象のカスタムフィールドIDとプロジェクトIDが登録されます。
    custom_field_id:有効にするカスタムフィールドのIDを指定
    project_id: 有効にするプロジェクトのIDを指定
  • RedmineのチケットをVBAで登録してみる

    現場のWBSからチケット登録を行いたかったのでVBAで作成しました。
    その時のサンプルを少し修正して雛型として公開します。
    トラッカーやカテゴリ、チケットの親子関係等は
    色々カスタマイズしているのですが、とりあえず以下のサンプルは固定値を入れているので
    皆さんの環境に合わせてカスタマイズしてもらえれば良いと思います。

    サンプルではredmineで利用しているDBとはODBC接続しています。

    CSVからの登録などのプラグインはあるのですが
    今回自作をしたのは、WBSから登録する際に単純にチケット登録
    するだけでなく、フェーズ別にカテゴリ設定したり、
    バージョンを設定したり、集計用にカスタムフィールドを設定したり・・
    と色々な事をやりたかったので自作する事にしました。

    ◆バージョンの指定
    versionsテーブルのidで指定します。

    ◆チケットの親子関係を作る場合
    root_id、parent、lft、rgtを指定しないといけません。

    ◆担当者id、作成者id
    usersテーブルのidと紐付きます。

    ◆優先度、プロジェクトID、ステータスID、チケット作成者ID
    これらはWBSから登録時に、同じ値を設定するので
    Excel上で共通設定として指定する形としています。
    それぞれRedmineのテーブルとの紐付けは以下の通りです。

    優先度:enumerations テーブルの type がIssuePriority
    プロジェクトID:projects.id
    ステータスID:issue_statuses.id
    チケット作成者ID:users.id


    Sub insertTicket()
    ' DB接続オブジェクト
    Dim con As ADODB.Connection
    Set con = New ADODB.Connection

    ' DB接続Open
    ' ここではDataSource名「dsredmine」を利用している。
    ' 個々の環境に合わせて下さい。
    con.connectionString = "Provider=MSDASQL.1;Data Source=dsredmine"
    con.Open

    Dim start_date As String
    Dim fixed_version_id As String
    Dim root_id As String
    Dim lft As String
    Dim rgt As String
    Dim subject As String
    Dim assigned_to_id As String
    Dim tracker_id As String
    Dim category_id As String
    Dim due_date As String
    Dim parent_id As String
    Dim description As String

    '=================================
    ' 以下はツール実行時の情報を設定
    '=================================
    Dim updated_on As String
    Dim created_on As String

    'チケット作成日
    created_on = Format(Date, "'yyyy-mm-dd ") & Format(Now, "hh:nn:ss'")

    'チケット更新日
    updated_on = Format(Date, "'yyyy-mm-dd ") & Format(Now, "hh:nn:ss'")

    '===========================================
    ' 以下はインポートするExcelデータから取得する。
    ' とりあえず以下は固定値。固定値の部分をセル取得などにカスタマイズする。
    '===========================================

    '開始日
    start_date = "'2011-11-25'"

    '終了日
    due_date = "'2011-11-30'"

    'バージョン (versions の ID)
    fixed_version_id = "7"

    'ルートID
    '親子関係のあるチケットの場合に継承のルートになるチケットのIDを設定。
    '必ずしも直接の親チケットIDではないことに注意。
    '継承関係が親子までの場合は parent_idと同じ値が設定される。
    '親子関係がない場合は 自身のIDを設定。
    root_id = "123"

    '親チケットID
    '初期値はNULL。親子関係がある場合は親チケットIDを設定。
    'root_id と異なり直接の親のIDを指定する。
    parent_id = "NULL"

    'lft/rgt
    'チケットの入れ子を表現
    lft = "1"
    rgt = "2"

    '件名
    subject = "'WBSのテスト'"

    '担当者
    assigned_to_id = userIdFromName("hogehoge")

    'トラッカーID
    tracker_id = "14"

    'カテゴリーID
    category_id = "1"

    '説明
    description = "'説明テスト'"


    '=================================================
    ' 以下はチケット共通設定なので共通設定シートのようなものを
    ' 用意してそこから取得する。
    '=================================================
    Worksheets("ツール").Select

    '優先度 (enumerations の type がIssuePriority)
    Dim priority_id As String
    priority_id = ActiveSheet.Range("D13").Value

    'プロジェクトID (projects.id)
    Dim project_id As String
    project_id = projectIdSetting()

    'ステータスID (issue_statuses.id)
    Dim status_id As String
    status_id = ActiveSheet.Range("D15").Value

    'チケット作成者ID (users.id)
    Dim author_id As String
    author_id = ActiveSheet.Range("D16").Value

    '=================================
    ' SQL文の生成
    '=================================
    Dim sql As String

    sql = _
    "INSERT INTO `issues` (`start_date`, `estimated_hours`, `priority_id`, `created_on`, `project_id`, `is_private`," & _
    "`fixed_version_id`, `lock_version`, `root_id`, `lft`, `subject`, `assigned_to_id`," & _
    "`updated_on`, `done_ratio`, `tracker_id`, `category_id`, `due_date`, `parent_id`, `description`, `status_id`," & _
    "`author_id`, `rgt`) VALUES" & _
    "(" + start_date + ", 0.0," & _
    priority_id + "," & _
    created_on + "," & _
    project_id + "," & _
    "0," & _
    fixed_version_id + ", 0, " & _
    root_id + "," & _
    lft + ", " & _
    subject + "," & _
    assigned_to_id + ", " & _
    updated_on + ", 0, " & _
    tracker_id + "," & _
    category_id + ", " & _
    due_date + "," & _
    parent_id + "," & _
    description + "," & _
    status_id + "," & _
    author_id + ", " & _
    rgt + ")"

    ' Insetr実行
    con.Execute sql

    ' DB接続クローズ
    con.Close
    End Sub
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。