明日にはでっかい太陽が昇るかもしれません。

「覚悟」とは!! 暗闇の荒野に!!進むべき道を切り開く事だッ!

Trac に JSON-RPC の機能を追加して、curl でチケットを作成してみた

今の仕事では、客先は Redmine を使用している。

だが、客先の Redmine には社内事情をかけないため、必然的に社内的な作業を管理する ITS が必要となるのだが、個人的な事情 (Ruby ×、Python ○ なので) により Trac を使用している。

ちょっとした事情から、Redmine のチケットを Trac に同期させたいなーと思い、調べたところ、客先の Redmine では REST API が解放されていることを発見!

これは RPC で Trac に自動的にチケットを同期するボットを作成するしかない!と思い、 TracXmlRpcPlugin をインストールしてみたのだが、 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 と同期できていい感じにできそう。