Trac に JSON-RPC の機能を追加して、curl でチケットを作成してみた
今の仕事では、客先は Redmine を使用している。
だが、客先の Redmine には社内事情をかけないため、必然的に社内的な作業を管理する ITS が必要となるのだが、個人的な事情 (Ruby ×、Python ○ なので) により Trac を使用している。
ちょっとした事情から、Redmine のチケットを Trac に同期させたいなーと思い、調べたところ、客先の Redmine では REST API が解放されていることを発見!
これは RPC で Trac に自動的にチケットを同期するボットを作成するしかない!と思い、 Trac に XmlRpcPlugin をインストールしてみたのだが、 curl でのチケット作成でちょっと手間取ったので、メモを残しておく。
ちなみに、 Trac のアカウント管理には AccountManagerPlugin を入れているが、 RPC を試すにあたりサーバの構成上 API キーが欲しかったので 拡張 している。
$ cat body.json { "method": "ticket.create", "id": 1234, "params": [ "summary", "description", { "keywords": "keywords", "refs": "123", "due_assign": {"__jsonclass__": ["datetime", "2017-01-01T00:00:00+0900"]} }, false, {"__jsonclass__": ["datetime", "2017-01-01T00:00:00+0900"]} ] } $ curl -X POST -H "Content-Type: application/json" -H "X-Trac-Api-Key: TRAC_ADMIN-PERM-API-KEY" --data @body.json -v http://172.17.0.2:8000/trac-plugin-test/login/jsonrpc * Hostname was NOT found in DNS cache * Trying 172.17.0.2... * Connected to 172.17.0.2 (172.17.0.2) port 8000 (#0) > POST /trac-plugin-test/login/jsonrpc HTTP/1.1 > User-Agent: curl/7.35.0 > Host: 172.17.0.2:8000 > Accept: */* > Content-Type: application/json > X-Trac-Api-Key: TRAC_ADMIN-PERM-API-KEY > Content-Length: 353 > * upload completely sent off: 353 out of 353 bytes < HTTP/1.1 200 Ok < Content-Type: application/json < Content-Length: 43 < Date: Sat, 18 Mar 2017 03:22:48 -0000 * Server 0.0.0.0 is not blacklisted < Server: 0.0.0.0 < {"id": 1234, "result": 112, "error": null} * Connection #0 to host 172.17.0.2 left intact
作成日や更新日も自由に設定できるため、 Redmine と同期できていい感じにできそう。