Project

General

Profile

気づき #902

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

Added by 奈良 裕記 4 months ago. Updated 4 months ago.

Status:
解決
Priority:
通常
Assignee:
-
Category:
-
Target version:
-
Start date:
12/23/2018
Due date:
% Done:

0%

Estimated time:

Description

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

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

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

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などを入れれば解決しますが)

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


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

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

今回の制約事項

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

事前準備

・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)

本節の参考サイト

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


認証情報の設定

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

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


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

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


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

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

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

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

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

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

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;" 

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

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

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

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

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

 mysql -u redmine  -ppass-word1 redmine -e "ALTER TABLE custom_values MODIFY value LONGTEXT;" 

参考

チケットの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


Redmine本家のversion,issue_categoriesの転送

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

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

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

python  ./presetting.py

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

補足

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


Redmine本家のチケット転送

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

python  ./redmine_org_copy.py

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

補足

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

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


Files

redmine-vote-list.png (155 KB) redmine-vote-list.png 奈良 裕記, 12/23/2018 08:44 PM
custom_fields.sql (5.46 KB) custom_fields.sql 奈良 裕記, 12/23/2018 08:57 PM
custom_fields_trackers.sql (2.15 KB) custom_fields_trackers.sql 奈良 裕記, 12/23/2018 08:57 PM
presetting.py (3.46 KB) presetting.py 奈良 裕記, 12/23/2018 08:57 PM
redmineorg_copy.py (3.02 KB) redmineorg_copy.py 奈良 裕記, 12/23/2018 08:57 PM
redmineorg_copy_sub.py (5.31 KB) redmineorg_copy_sub.py 奈良 裕記, 12/23/2018 08:57 PM
trackers.sql (2.17 KB) trackers.sql 奈良 裕記, 12/23/2018 08:57 PM
authinfo.py (557 Bytes) authinfo.py 認証情報定義ファイル 奈良 裕記, 12/23/2018 11:21 PM
issue_statuses.sql (2.39 KB) issue_statuses.sql 奈良 裕記, 12/24/2018 05:14 AM
workflows.sql (14.6 KB) workflows.sql 奈良 裕記, 12/24/2018 10:47 AM

History

#1

Updated by 奈良 裕記 4 months ago

  • Subject changed from R to Redmine本家チケットのコピー/VoteCount集計
  • Description updated (diff)
#2

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#3

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#4

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#5

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#6

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#7

Updated by 奈良 裕記 4 months ago

#8

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#10

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#11

Updated by 奈良 裕記 4 months ago

  • File deleted (authinfo.py-ynara)
#12

Updated by 奈良 裕記 4 months ago

  • File deleted (authinfo.py)
#13

Updated by 奈良 裕記 4 months ago

#14

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#15

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#16

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#17

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
#18

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)
  • Status changed from 新規 to 解決
#19

Updated by 奈良 裕記 4 months ago

#20

Updated by 奈良 裕記 4 months ago

#21

Updated by 奈良 裕記 4 months ago

  • Description updated (diff)

Also available in: Atom PDF