ほんじゃーねっと

おっさんがやせたがったり食べたがったりする日常エッセイ

Node.jsでRedmineのREST APIにアクセスしてチケット取得&一括登録

とあるWeb開発プロジェクトで

WBS(Excel製)に書かれた、機能ごとの開発担当・開始日・期日・予定工数を

そのままRedmineのチケットとして登録するという、

手作業でやったらえらく時間のかかりそうな作業があったので、

RedmineのAPI経由でチケットを一括登録できるスクリプトを作成した。

前回Bit.ly APIにアクセスするスクリプトを作って結構楽しかったので、

今回もNode.jsで作成してみる。

blog.honjala.net

RedmineのAPIは、管理者権限を持ったユーザーで

許可すれば、あとはユーザーごとにAPIキーを発行して

REST APIが使えるようになっている。

今回のようにチケットを登録するだけでなく、

ユーザー情報を取得するようなAPIも用意されているようなので、

進捗を分析したい時なんかに使えそうだ。

APIの詳細は下記の本家サイトが詳しい:

www.redmine.org

Node.jsからREST APIへのアクセスについては、

上記の記事でも使用したnode-rest-client を使う。

www.npmjs.com

プロジェクトのチケット一覧を取得する

今回はチケットを一括登録するのが目的だが、

ひとまずAPIへのアクセス方法やらデータの取り出し方を確認するために

チケットを取得するスクリプトを作ってみた。

get_tickets.js

var RestClient = require('node-rest-client').Client;

var ENDPOINT_BASE = '<RedmineのルートURL>';

var rmClient = new RestClient();

var getTicketList = function (params, project, callback) {
    rmClient.get(ENDPOINT_BASE + '/projects/' + project + '/issues.json', {
        headers: {
            'Content-type': 'application/json'
        },
        parameters: params
    }, function (data, response) {
        var result = JSON.parse(data.toString('utf8'));
        callback(result);
    });
};

getTicketList({}, '<Redmineプロジェクトコード>', function (result) {
    console.log(result);
}); 

やっていることは

指定したプロジェクトコードのプロジェクトのチケットを取得して

ドバっとコンソールに表示しているだけだ。

ちゃんと表示されるようなので、先に進む。

補足だが、このコードには認証処理が入っていないので、

ログイン必須のRedmine環境で動作させるには、別途認証処理を追加する必要がある。

認証の追加方法は、

下記のチケット登録処理のAPIキーをリクエストに埋め込んでいる箇所を参考にしていただきたい。

チケットを一括登録する

下記が作成したチケット一括登録用スクリプトだ。

指定したExcelファイルの「Sheet1」という名前のシートを読み込み、

1行1タスクとしてRedmineにチケットを登録していく。

A列が空になるところまで進んで終了する。

下記のような列構成を想定している:

  • A列: タスク名(=チケットのタイトル)
  • B列: 作業担当のRedmine担当者コード
  • C列: 予定作業時間数
  • D列: 開始日
  • E列: 終了日

手抜きスクリプトなので担当者名から担当者コードを取得したりはしない。

あらかじめRedmineに担当者をユーザーとして登録しておき、

担当者名の代わりにその担当者のコードを書いておいてやる必要がある。

自分で作ったのに、めんどくさいものになってしまった。

チケット登録には認証が必要なので、APIキーをリクエストのヘッダーに埋め込んでいる。

APIキーの発行はRedmineの設定画面かどこかで各ユーザーごとに発行できる。

create_tickets.js

var RestClient = require('node-rest-client').Client;
var xlsx = require('xlsx');

var xlsxFilePath = '<Excelのファイルパス>';
var ENDPOINT_BASE = '<RedmineのルートURL>';

var rmClient = new RestClient();

var createIssueTicket = function (params, callback) {
    rmClient.post(ENDPOINT_BASE + '/issues.json', {
        headers: {
            'Content-type': 'application/json',
            'X-Redmine-API-Key': '<RedmineのAPIキー>'
        },
        data: params
    }, function (data, response) {
        var result = JSON.parse(data.toString('utf8'));
        callback(result);
    });
};

var workbook = xlsx.readFile(xlsxFilePath, {cellNF: true, cellStyles: true});
var sheet = workbook.Sheets['Sheet1'];

var rowNumber = 2;
while (sheet['A' + rowNumber] != null) {
    var ticketParams = { 
        issue: {
            project_id: '<project name>',
            tracker_id: '2',
            subject: sheet['A' + rowNumber].v.trim(),
            assigned_to_id: sheet['B' + rowNumber].v,
            estimated_hours: sheet['C' + rowNumber].v,
            start_date: sheet['D' + rowNumber].v.trim(),
            due_date: sheet['E' + rowNumber].v.trim()
       }   
    };  

    createIssueTicket(ticketParams, function (result) {
        console.log(result);
    }); 
    rowNumber += 1;
}

Excel操作には「xlsx」というモジュールを使っている。

www.npmjs.com

おわり

即席手抜きコードなのでプロジェクトが変わる度に中身を書き換える必要があるが、

手作業でチケットを登録するよりは速いはず。

次に必要になることがあったら、もう少し安心して使いまわせるものにしたい。

blog.honjala.net

Redmine実践ガイド 理論と実践、事例で学ぶ新しいプロジェクトマネジメント

Redmine実践ガイド 理論と実践、事例で学ぶ新しいプロジェクトマネジメント