PythonでRedmineを管理する - 準備編

職場でRedmineを使う機会が、チケットのインポート機能などが若干使いにくかった。

なにか便利にする機能はないかと調べてみたところ、PythonにRedmine管理用パッケージの「Python Redmine」があったので、Pythonの勉強がてらにこれを使って色々と出来ないかと実験してみることにする。


実験に利用する環境

実際に利用しているRedmineを実験に利用するといろいろと差し障りがあるのと、管理者権限がないということもあり、新たに実験用のRedimine、及び開発環境を用意する。

  1. planio
    30日間無料で試用できるクラウドのRedmineサービス。クレジットカードの登録無しで試用できるので選択。本当はAWSなりでRedmine用のサーバを用意したかったけども、とりあえず触ってみたかったのでそっちはまた別の機会に。
  2. python 3
    Python Redmineは3.4-3.7までサポート。今回は最新の3.8を使用してみたが、とりあえずは動いているっぽい。
  3. pycharm
    Windows、Mac、Linuxに対応したPytho用IDE。
  4. Python Redmine
    Redmineを操作するPython用パッケージ。pipでインストール可能。
    詳細についてはオンラインのドキュメントを参照。

Python環境のセットアップ

Python Redmineを利用するためにpipからパッケージをインストールする。

コンソールから実行してもよいが、今回はPycharmからpipを使ってのインストールを試みる。

まずは以下のようにシステム上のインタプリタを利用してプロジェクトを作成する。

プロジェクトを作成したら、メニューからFile>Settingを選択し、Project Interpreterを表示する。

右端の「+」ボタンをクリックし、パッケージのインストール画面を表示する。

検索ウィンドウに「python-redmine」を入力すると候補が絞られるので、「Install Package」ボタンをクリックすると、インストールが行われる。

その他に利用したいパッケージがあれば、同様の手順でインストールする。

 

とりあえずはこれで最低限の環境は構築出来ているはず。


PythonからRedmineに接続する

Python Redmineを利用してRedmineに接続するには、以下の二つの認証方式がある。

  1. ユーザーIDとパスワードを利用して認証する。
  2. APIキーを利用して認証する。

ユーザーID、パスワードをプログラムに利用するのはあまり好きではないので、今回はAPIキーを利用した認証を用いて実装することにする。

APIキーを利用して接続するには、以下のようにPythonを記述する。


# python redmineをインポート
from redminelib import Redmine

# 認証情報
appURL = "https://xxxxx.planio.jp/"
userKey = "xxxxx" # 一般ユーザのAPIキー
adminKey = "xxxxx" # 管理者ユーザのAPIキー

# Redmineに接続
userRedmine = Redmine(appURL, key=userKey)
adminRedmine = Redmine(appURL, key=adminKey)

APIキーは、Redmineのユーザー管理メニューから取得する。

今回のplanioの試用版の場合だと1ユーザーしか利用出来ないはずなので、管理者ユーザと一般ユーザのAPIキーは同じものを設定する。

接続に成功したら、以下のコードを実行し、チケットの情報を取得してみる。


# 一般ユーザー権限で全てのチケットを取得
tickets=userRedmine.issue.all()
# ヘッダ表示
print("チケットNo, プロジェクト名,チケット題名,チケット登録者,チケット担当者,開始日,期日")

# チケットを一つずつ取り出し、整形して表示
for ticket in tickets:
id = str(ticket.id)
subject = ticket.subject
authorName = ticket.author.name
authorID = ticket.author.id

# 担当者が設定されていない場合は"none"と表示
try:
assigned = ticket.assigned_to.name
except:
assigned = "none"

# 開始日が設定されていない場合は"none"と表示
try:
startDate = ticket.start_date
except:
startDate = "none"

# 期日が設定されていない場合は"none"と表示
try:
dueDate = ticket.due_date
except:
dueDate = "none"

projectName = ticket.project.name

# チケットの内容を表示
print('%s,"%s","%s",%s(%d),%s,%s,%s' % (id, projectName, subject, authorName, authorID, assigned, startDate, dueDate))

Python Redmineではチケットはissueという名前で定義されているらしい。

これは、元々の英語版だと「issue」だったのが、日本語版では意訳されて「チケット」となった。という経緯があるとのことだ。

 

これを実行すると、以下のように表示される。


チケットNo, プロジェクト名,チケット題名,チケット登録者,チケット担当者,開始日,期日

8,"sample","sampleチケット",真宏 塩冶(1),none,2020-01-07,none

7,"Webサイト リニューアル","Create your first issue",Miller Gerrit(5),真宏 塩冶,2020-01-06,2020-01-10

6,"Webサイト リニューアル","アクセス解析を設定",Miller Gerrit(5),Dupont Luc,2020-01-12,none

5,"Webサイト リニューアル","ユーザーテスト",Miller Gerrit(5),Miller Gerrit,2020-01-12,2020-01-14

4,"Webサイト リニューアル","Webサイトのコーディング",Dupont Luc(7),Dupont Luc,2019-12-27,2020-01-11

3,"Webサイト リニューアル","Webサイトの不具合です!",Goodworth Jack(4),Miller Gerrit,2019-12-27,none

2,"Webサイト リニューアル","ホームページのweb copy",Miller Gerrit(5),Miller Gerrit,2019-12-27,2019-12-31

1,"Webサイト リニューアル","イラストとインフォグラフィックの制作",Miller Gerrit(5),Redon Lesley,2020-01-03,2020-01-11


試しに登録してみたチケットと、サンプルとしてデフォルトで登録されているチケットが表示されたので、無事に動いているようだ。

その他にも取得できる情報はあるが、詳細はPython Redmineのドキュメントを参照。

https://python-redmine.com/resources/issue.html

 

ここまででRedmineを操作するための準備は整った。

次はPythonを使ってのチケット発行を試してみる。