会社で百人単位でRedmineユーザを登録する必要がでてきまして、手で登録するのが嫌なのでC#で RedmineのREST APIをブッ叩いてCSVから一括登録するプログラムを作りました。

ADを導入しているのでLDAP認証で登録できればベストだったのですが、ネットワーク的事情でLDAP認証できない状態でした。あとは一括登録するプラグインとか、私が作ったプログラムと同じようにAPIをたたいてCSVから登録するRuby製のプログラムは存在したのですが、プラグインはできるだけインストールしたくなかったというのと、後者のプログラムに関してはRubyの実行環境を準備するのがめんどくさかったのとパスワードの強制変更が設定できなさそうだったので自作しました。

ダウンロード


こっからzipファイルをダウンロードしてください。

環境・要件


  • .NET Framework4.5以上
  • 実行クライアントWindows

です。「.NET Framework3.5とか4が許されるのは~小学生までだよね~」というわけで、4.5以上にした。いやね、使用しているパッケージのバージョン的に4.5で書かざるをえなかったんですよ。いや、パッケージのバージョン下げたら3.5でもイケそうだったんですけど、4.5で書いた後だったのでコードを書き直さないといけなくなるので、めんどくせ~からやりませんでした。

あと、monoでも動くかどうか試したんですけど、こっちも使用しているパッケージの最新版がmonoで動作しないっぽくて、バージョン下げるとコードを書き直さないといけない…という事情でWindowsだけにしました。Redmine側は3.3.2で動作確認してますけど、たぶんAPIは1.1の時から変わってないと思うので、古いRedmineでも使えるはずです。

また、後述してますがCSVもデータベースもUTF-8でしか確認してません。

CSV


下記のようなCSVを準備してください。
順番に…「ユーザID・パスワード・名前・苗字・メールアドレス・パスワードの強制変更有無」です。名前と苗字は逆転しやすいので注意ね。FirstNameが名前でLastNameが苗字です。

ヘッダーはいらないです。各項目はダブルクォーテーションで囲んでようが囲んでまいが動きます。

1
2
3
user1,pass1111,first1,last1,1@example.com,true
user2,pass1114,太郎,田中,2@example.com,false
user3,pass1114,花子,山田,3@example.com,true

また、CSVはUTF-8にしてください。UTF-8で読み込むようにしてるので。他の文字コードでやりたい場合はprogram.csの下記を変更してビルドしてください。

DBの文字コードについて


JSONでPOSTする際にUTF-8でやってるのですが、データベースがUTF-8以外の場合にどうなるかわかりません。ちょっと調べても出てこなかったし、Redmineのコード読むまではめんどくさくてやってないので…

API Key


API Keyを利用して登録するので、まずREST APIを有効にしてください。そのあと 管理者 のAPI Keyを控えてください。

実行


RedmineUserImport.exeを実行してください。「Waiting to enter values… Please input URL and APIKey and CSV File’s path below…」 という入力待ちのメッセージが表示されるので、下記の値を半角スペースで区切って入力してください。

順番
1 RedmineのURLです。 http://https:// をつけるようにしてください。
2 管理者のAPI Key
3 CSVファイルのパス
4 オプションです。APIを叩くスパン(秒)を指定します。指定しない場合は0です。

下記のような感じで実行します。

1
2
3
4
5
//入力待ちのメッセージ
Waiting to enter values... Please input URL and APIKey and CSV File's path below...

//値を入力
http://localhost:3000 fe2c4e9d42489b77356d3c6e0c23c8d518d649bd test.csv 3

実行すると、コンソールに下記のように表示されます。

1
2
3
4
5
6
7
Success: 1@example.com
Success: 2@example.com
Success: 3@example.com
Faild: 1@example.com {"errors":["Email has already been taken","Login has already been taken"]}
Success: 4@example.com

Finish. Please enter any keys.

下記のようにユーザが登録されます。

エラーとログ


エラーの場合は下記のように理由が表示されます。パースするのがめんどくさかったので返ってきたJSONをそのまま表示させてます。

1
Faild: 1@example.com {"errors":["Email has already been taken","Login has already been taken"]}

ログはlog/create.logに出力するようにしてます。