プロジェクト

全般

プロフィール

気づき #902

奈良 裕記 さんが5年以上前に更新

Redmine本家チケットのコピー/VoteCount集計 

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

 https://www.slideshare.net/y503unavailable/redminepythonredmine 
 のコード紹介になります。 

 h1. Redmine vote count list 

 Redmine本家残チケットに対して、+1をカウントし、並べたものです。 
 目的は(利用者視点で)チケット内容の必要性を可視化すること。 

 http://www.redmine.org/boards/1/topics/54369     (2018/1現在、+1が5件以上) 

 Redmine本家Form-Open discussionのトップに固定表示されています。 
 http://www.redmine.org/projects/redmine/boards/1 

 従来は、curlでチケット取得し、行頭+1を算出していましたが、Pythonで直接集計可能になりました。 従来は、curlでチケット取得し、行頭+1を算出していました。 

 !redmine-vote-list.png! 

 h2. 取り組んだ理由 

 (職場で)密接に関連するRedmineが複数あり、Redmine外からデータ処理する手段が欲しかったということです。 
 ・関連項目のデータ集計など、いつまでもExcel手作業を必要とするべきではない。 
 ・ユーザサイドで実行可能とし、ユーザ満足度向上&adminの負荷を低減する。 
 ・REST-APIでRedmineを操作するライブラリは沢山あるが、Pythonが一番受け入れられるだろう。 

 類似インスタンスなど増やしたくないし、過去にはサーバ統合も行いましたが、 
 諸般の事情で別インスタンスを作成し運用することになりました。(という愚痴) 

 Python-Redmineの練習として、Redmine本家をネタにして遊んでたというのが正直なところです。 
 (社内環境だと公開できないしw) 

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

 h1. 作成方法 

 多少面倒ですが、下記手順で対応可能です。 

 h2. 事前準備 

 ・Redmine本家のアカウント作成(ID/PASSでログイン) 
 ・転送先のサーバインスタンス作成(新規Redmineを強く推奨) 
 ・以下は転送先サーバ上作業 
  ・Redmineをインストール。 
  ・管理者権限の作業用アカウント作成、REST-API有効化、APIキー作成 
   RESTによるWebサービスを有効にする 
  ・Python-redmineをインストール(参考サイト) 
  ・Python-redmineでRedmineにアクセスできることを確認 
  ・本チケット添付のファイルを展開 
   (redmineorg_copy.py , redmineorg_copy_sub.py , authinfo.py , presetting.py) 
   (custom_fields.sql , custom_fields_trackers.sql,trackers.sql) 

 --- 

 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. カスタムフィールド定義の設定 

 現在のRedmine REST-APIに追加機能はありません。 

 カスタムフィールド定義の手動作成は面倒だし、決め打ちにした方が転送作業も楽です。 

 →カスタムフィールド、トラッカー定義については、作成済サーバの定義内容をSQLで直接設定します。 

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

 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 -e "ALTER TABLE custom_fields set is_for_all=1;" 

 </code></pre> 

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

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

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

 カスタムフィールドのテキスト定義はTEXT(len=2byte)であり、本家の一部チケットでオーバフローします。 
 下記手順によりLONGTEXTに変更してください。 
 (Description.Journalsは3.4.0で対応 #20217 ) 

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

 参考 
 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に設定。 

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

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

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

 補足 

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

 --- 

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

 上記が成功している前提で実行 

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

 数千件実行するとException発生する場合があります。 
 その場合は上記を再度実行してください。 

 補足 

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

戻る