気づき #902
Updated by 奈良 裕記 almost 5 years ago
Redmine本家チケットのコピー/VoteCount集計
アドベントカレンダーの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が一番受け入れられるだろう。
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)
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. カスタムフィールド定義の設定
現在の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本家では実質的に問題ありませんが、普通の環境の場合にはチケット番号の確認処理を入れてください。)