Usine Redmine REST API with PowerShell
Redmine を PowerShell から REST API で操作する方法のメモです。
「してみた」系の、Issueを大雑把なフィルタ指定で取得するゆるい記事ではちょっと物足りないので、試行錯誤しました。
普段の運用業務で Microsoft の Windows や Office365 などを相手にする PowerShell ヘビーユーザのため、PowerShell の Invoke-RestMethod を使用します。
必要なもの
- APIキー
- redmine URL
- http://url of redmine/resource.xml
- http://url of redmine/resource.json
- Request Body の Content-Type に合わせて使い分けます(あまりよくわかっていません)
- Redmine API Reference
- https://www.redmine.org/projects/redmine/wiki/rest_api
- 最新版のものですが、旧バージョンによっては実装されてないAPIがあります。バージョンサポートに起因する問題は、よく掲示板などで見つかります。
このほかに、ちょっとしたテストのため
も適宜使用しています。
実行環境
- PowerShell Ver5.1
- Redmine Ver2.3.1
- 実行ユーザは、'システム管理者'ロールを割り当てています
Get issue by issue ID
Redmine APIリファレンスにある id,issue_id のフィルタは、Redmine ver.3.3 から実装されているようです。私の環境の Redmine は Ver2.3.1 のため、id のフィルタを指定しても機能せず、最新から limit=25 件のチケットを取得するだけでした。私の環境でIDを指定してIssueを取得するには、サンプルような .../Issues/ID.xml 形式のURLで取得する必要がありました。
# Web API の URI $URL = 'http://urlofredmine' # 取得した API Key $ApiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # Request Header $headers = @{ 'X-Redmine-API-Key' = $ApiKey } # Request Body $body = @{ limit = 1 page = 0 } #Issue IDを使用したURIを生成する $issue_id = '735997' $AppUri = $URL + '/issues/' + $issue_id + '.xml' # GET API を叩く $Issues = Invoke-RestMethod -Method Get -Uri $AppUri -Body $body -Headers $headers $Issues.Issue $Issues.Issue.Project $Issues.Issue.tracker $Issues.Issue.status $Issues.Issue.priority $Issues.Issue.author $Issues.Issue.assigned_to $Issues.Issue.custom_fields.custom_field
Create issue
Project_id を指定して、Issue を作成します。
サンプルは最低限。このほかのプロパティ名や、custom_field のセット方法は、Redmine API リファレンスを見ながら実装する必要があります。
なぜか配列で指定するとどうやっても「題名を指定してください」エラーを消せななったので、RequestBody を JSON で記述しています。
Issueの作成に成功すると、作成した Issue が返されるので、作成された Issue の検査などに使用します。
# Web API の URI $URL = 'http://urlofredmine' $URI = '/issues.json' $AppUri = $URL + $URI # 取得した API Key $ApiKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # Request Header $headers = @{ 'X-Redmine-API-Key' = $ApiKey 'Content-Type'='application/json' } # Request Body - json # クォーティングに注意 $body = ' {"issue": {"project_id":25, "subject":"Redmine issue for with REST API" } }' # GET API を叩く $Issue = Invoke-RestMethod -Method POST -Uri $AppUri -Body $body -Headers $headers