気づき #902
Updated by 奈良 裕記 almost 5 years ago
Redmine本家チケットのコピー/VoteCount集計 Redmineアドベントカレンダー2018の21日目です。 アドベントカレンダーの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本家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を算出していましたが、 Python-Redmineを利用することで、Redmine上で直接集計し表示可能になりました。 (もちろん、本家Redmineサイトにvote pluginを入れれば解決する問題ですが、、) !redmine-vote-list.png! h1. Python-Redmineで実施した理由 Redmineの活用が進むにつれ、単一のRedmineで運用する事は困難になります。 密接に関連するRedmineが複数あれば、Redmine外からデータ処理する手段が必要になります。 (運用体制、利用状況により差異有り。過去にサーバ統合もしましたが必要ならやむを得ません。) ・関連項目のデータ集計など、Excel手作業が必要な箇所は減らすべき。 ・データ処理のカスタマイズをユーザサイドで実施可能とすれば、ユーザ満足度向上&adminの負荷を低減できる。(現場による) ・REST-APIでRedmineを操作するライブラリは沢山あるが、Pythonが一番受け入れられるだろう。 この辺を考えながら、Redmine本家をネタにして、Python-Redmineがどこまで利用できるか検証しました。 (社内環境だとそのまま公開できませんしw) 詳細は下記参照 https://www.slideshare.net/y503unavailable/redminepythonredmine python以外の言語/ライブラリ上で同様の処理を実施したい場合は下記参照 Redmine以外でのデータ表示/操作例 https://redmine.tokyo/issues/699 --- h1. Python-Redmineによる本家コピー作成方法 下記手順で作成しました。 h2. 今回の制約事項 DB=Mysql/MaridDB, Linux上、Redmine Redmine Version=3.4, 添付ファイルは対応せず。 h2. 事前準備 ・Redmine本家のアカウント作成(ID/PASSでログイン) ・転送先のサーバインスタンス作成(新規Redmineを強く推奨) ・以下は転送先サーバ上作業 ・Redmineをインストール。 ・管理者権限の作業用アカウント作成、REST-API有効化、APIキー作成 RESTによるWebサービスを有効にする ・Python-redmineをインストール(参考サイト) ・Python-redmineでRedmineにアクセスできることを確認 ・本チケット添付のファイルを展開(py-4ファイル、sql-3ファイル) ・本チケット添付のファイルを展開 (redmineorg_copy.py , redmineorg_copy_sub.py , authinfo.py , presetting.py) (custom_fields.sql , custom_fields_trackers.sql,trackers.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 -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本家のチケット転送 上記が成功している前提で実行してください。 10時間以上掛かる場合があるので、 nohup での実行を推奨します。 での実行推奨。 <pre><code class="python"> python ./redmine_org_copy.py </code></pre> 数千チケットを転送するとException発生する場合があります。 数千件実行するとException発生する場合があります。 その場合は上記を再度実行してください。転送完了チケットの次から再開します。 補足 votecountの算出処理は、上記のpython上で行っています。 処理はソースファイルを見てください。 再実行は、転送済チケット数を確認し、その番号から転送再開します。 再実行前後で途中のチケット削除/アクセス禁止があれば、転送チケットの重複/不足が発生します。 (Redmine本家のコピーでは実質的に問題ありませんが、普通の環境の場合にはチケット番号の確認処理を入れてください。)