プロジェクト

全般

プロフィール

気づき #902

奈良 裕記 さんがほぼ5年前に更新

 
 Redmineアドベントカレンダー2018の21日目の記事です。 

 Redmine本家のvote count listを、Python-Redmineで作り直しました。 

 RedmineTokyo第15回勉強会でLT紹介しましたが、実際のコードを紹介します。 
 https://www.slideshare.net/y503unavailable/redminepythonredmine 

 h1. Redmine vote count listとは? 

 Redmine vote count listとは、Redmine本家の残チケットを、チケットの+1コメント数順にソートしたものです。(賛成数順) 

 (利用者視点で)各チケットの必要性を可視化し、Redmineにユーザニーズを反映し易くする為に作成しています。 
 有用と認めて頂いて、Redmine本家FormのOpen discussionトップに固定リンクされています。 

 http://www.redmine.org/projects/redmine/boards/1    (Redmine本家フォーラム1) 
 http://www.redmine.org/boards/1/topics/54369       (2018/1現在、+1が5件以上のリスト) 

 従来は、curlで未完了チケットを全件取得し、行頭+1を算出し、Excelで加工していましたが、 
 Python-Redmineを利用することで、Redmine上で直接集計し表示可能になりました。 
 (もちろん、本家Redmineサイトにvote pluginなどを入れれば解決しますが) 

 !redmine-vote-list.png! 

 h1. Python-Redmineで実施した理由 

 Redmineの活用が進むにつれ、実際の複雑な業務ロジックへの対応が必要になり、標準のRedmine/Pluginでは対応困難になる場合があります。 

 ・Redmine内部またはPluginに業務ロジックを入れる→Adminの作業負荷/ボトルネック 
 ・手作業やExcel等のファイル経由でユーザが対応→ユーザの作業負荷、作業ミスのリスク増加 

 Redmineが1台ならまだしも、複数台並列運用し集計必要なんて事になったら。。 

 Redmineをユーザ側で直接データ処理できる手段を提供することが一つの解決策となります。 

 ・関連項目のデータ集計など、Excel手作業が必要な箇所は減らすべき。 
 ・データ処理のカスタマイズをユーザサイドで実施可能とすれば、ユーザ満足度向上&adminの負荷を低減できる。(現場による) 
 ・REST-APIでRedmineを操作するライブラリは沢山あるが、Pythonが一番受け入れられるだろう。(言語ランキング) 

 この辺を考えながら、Redmine本家をネタにして、Python-Redmineがどこまで利用できるか検証しました。(社内環境だとそのまま公開できないしw) 

 *結果:REST-API自体による機能制約はあるが、上記目的には十分使える。* 

 詳細は下記参照 
 https://www.slideshare.net/y503unavailable/redminepythonredmine 

 python以外の言語/ライブラリ上でも対応できます。下記参照 
 Redmine以外でのデータ表示/操作例 
 https://redmine.tokyo/issues/699 

 --- 

 h1. Python-Redmineによる本家コピー作成方法 

 下記手順で作成しました。 

 h2. 今回の制約事項 

  DB=Mysql/MaridDB, Linux上、Redmine Version=3.4, 添付ファイルは対応せず。 

 h2. 事前準備 

 ・Redmine本家のアカウント作成(ID/PASSでログイン) 
 ・転送先のサーバインスタンス作成(設定上書きするので、新規Redmineを強く推奨) 
 ・以下は転送先サーバ上作業 
  ・Redmineをインストール。 
  ・管理者権限の作業用アカウント作成、REST-API有効化、APIキー作成 
   RESTによるWebサービスを有効にする 

  ・Python-redmineをインストール(下記参考サイト) 
  ・Python-redmineでRedmineにアクセスできることを確認 

  ・本チケット添付のファイルを展開(py-4ファイル、sql-5ファイル) 
   (redmineorg_copy.py , redmineorg_copy_sub.py , authinfo.py , presetting.py) 
   (custom_fields.sql , custom_fields_trackers.sql,trackers.sql,issue_statuses.sql,workflows.sql) 

 h3. 本節の参考サイト 

 Redmne3.4インストール(3.4-unofficialcooking edition) 
 https://github.com/y503unavailable/redmine-centos-ansible/ 

 利用・活用 Redmine API 
 https://www.farend.co.jp/blog/2017/02/redmine-api/ 

 Python-Redmin 
 https://python-redmine.com/ 

 Python Redmineを使用してRedmineを操作する 
 https://qiita.com/mima_ita/items/1a939db423d8ee295c85 

 --- 

 h2. 認証情報の設定 

 authinfo.pyに、下記情報を設定して保存してください。 

 redmine_copy_urlは、IPアドレスではなく、逆引き可能なURLを記入してください 

 <pre><code class="python"> 

 redmine_org_id='redmine.orgのID' 
 redmine_org_pass='redmine.orgのPASS' 

 redmine_copy_key='転送先RedmineのAPI-KEY' 
 redmine_copy_url='転送先RedmineのURL' 

 </code></pre> 

 --- 

 h2. カスタムフィールド+トラッカー定義の設定 

 下記理由から、カスタムフィールド、トラッカー定義については、RESTではなくSQLファイルを取込んで実行しました。 

 ・現在のRedmine REST-APIに、カスタムフィールド、トラッカー等の追加機能は無い。 
 ・Redmine自体のバージョン定義の追加は頻繁に発生するが、 
 ・Redmine本家サイトへの管理項目の追加変更は少ない。実質的に固定して考えられる。 
 ・カスタムフィールド定義の手動作成は面倒で間違いの素。 
 ・決め打ちにした方が転送作業も楽になる。 

 実際の処理内容は下記の通りです。 

 注意! 下記処理を実行すると、既存のカスタムフィールドとトラッカーの定義が上書きされます。 

 mysqlのログインID=redmine,PASS= pass-word1の場合の実行例 

 <pre><code class="sql"> 
 mysql -u redmine    -ppass-word1 redmine < custom_fields_trackers.sql 
 mysql -u redmine    -ppass-word1 redmine < custom_fields.sql 
 mysql -u redmine    -ppass-word1 redmine < trackers.sql 
 mysql -u redmine    -ppass-word1 redmine < issue_statuses.sql 
 mysql -u redmine    -ppass-word1 redmine < workflows.sql 

 mysql -u redmine    -ppass-word1 redmine -e "ALTER TABLE custom_fields set is_for_all=1;" 

 </code></pre> 

 実行後確認 
 ・Redmineの管理画面から、カスタムフィールド、トラッカーが作成されていることを確認 

 上のALTER TABLEの行はsql定義内容のパッチ修正です。気にせずまとめて実行してくださいw。 

 SQLファイルで対応したくない場合は、Ansibleでも可能です。 
 https://github.com/histudy/ansible-role-redmine/ 

 h2. カスタムフィールド定義のLONGTEXT設定 

 カスタムフィールドのテキスト定義はTEXT(len=2byte)であり、本家の一部チケットでオーバフローします。 
 下記手順によりカスタムフィールドをLONGTEXT対応に変更してください。 
 (Redmine4.1.0以降では不要、設定済のため) 

 <pre><code class="sql"> 
  mysql -u redmine    -ppass-word1 redmine -e "ALTER TABLE custom_values MODIFY value LONGTEXT;" 
 </code></pre> 

 参考 

 チケットのDescription.Journalsは、本変更により3.4.0でLONGTEXTに対応済です。 
 http://www.redmine.org/issues/20217 

 Long text custom fields don't accept values longer than 64KB if backend database is MySQL 
 http://www.redmine.org/issues/29209 

 オーバフロー発生するチケット 
 https://www.redmine.org/issues/337 

 --- 

 h2. Redmine本家のversion,issue_categoriesの転送 

 こちらはREST-APIを利用して設定できます。(随時変更されますし) 

 ・転送先Redmineにプロジェクト作成(identifier=redmineorg-copy) 
 ・Redmine本家のバージョン定義内容を読み出して、転送先Redmineに設定。 
 ・Redmine本家のカテゴリ定義内容を読み出して、転送先Redmineに設定。 

 注意! 下記実行すると、転送先Redmineに定義されているバージョンとカテゴリ定義内容が上書きされます。 注意! 下記登録を行うと、既存のバージョンととカテゴリ定義内容が上書きされます。 

 <pre><code class="python"> 
 python    ./presetting.py 
 </code></pre> 

 転送先Redmineプロジェクトに、バージョンとカテゴリ定義が追加されていることを確認 

 補足 

 Redmine本家の定義番号と合わせるため、下記処理を行っています。 
 ・最大の番号を取得し、ダミー定義作成。 
 ・Redmine本家の定義内容を参照し上書き。 
 (手抜きモードです。未定義分エラー回避のため、不要な項目をコメントアウト。本家削除済分ID残り) 

 --- 

 h2. Redmine本家のチケット転送 

 ここまで成功している前提で実行してください。 
 10時間以上掛かる場合があります。 nohup での実行を推奨します。 

 <pre><code class="python"> 
 python    ./redmine_org_copy.py 
 </code></pre> 

 数千チケットを転送するとException発生する場合があります。 
 その場合は上記を再度実行してください。転送完了チケットの次から再開します。 

 補足 

 votecountの算出処理は、上記のpython上で行っています。 
 処理はソースファイルを見てください。 

 再実行は、転送済チケット数を確認し、その番号から転送再開します。 
 再実行前後で途中のチケット削除/アクセス禁止があれば、転送チケットの重複/不足が発生します。 
 (Redmine本家のコピーでは実質的に問題ありませんが、普通の環境の場合にはチケット番号の確認処理を入れてください。) 

戻る