Redmine API を利用してチケット ID からチケット情報を出力するシェルスクリプトを書いた
Redmine API を利用して、curl
でチケット情報を取得し、jq
で整形して出力するシェルスクリプトを書いた。引数チェックとかもするようにした。
以下のスクリプトを red
とかいうファイル名で保存して、PATH が通っているところに置いて実行権限を付ければ OK。
#!/bin/sh
# ================================================================================
# red : Redmine API を利用してチケット情報を出力する
#
# - 前提事項
# jq コマンドがインストールされていること
# - インストール方法
# PATH が通っている場所にこのファイルを置き
# $ chmod a+x red
# で実行権限を付与する
# - 使用例
# $ red 42
# 42:生命、宇宙、そして万物についての究極の疑問の答えを探す
# 担当 : ディープ・ソート
# 状況 : 作業中
# 開始日 : 2018-01-01
# 期日 : 2018-12-31
# ================================================================================
# 定数宣言
# --------------------------------------------------------------------------------
# Redmine アドレス : 最後の「/」は抜きで書く
REDMINE_URL='http://my-server.com/redmine'
# API キー : 個人設定ページで確認できるものを書いておく
REDMINE_API_KEY='0089b123d7ddf138ece4f66871c47e6f43cc4b01'
# チケット番号 : 引数1
REDMINE_ISSUE_ID="$1"
# 引数チェック : 引数1がなければ中止する
# --------------------------------------------------------------------------------
if [ "$REDMINE_ISSUE_ID" = "" ] ; then
echo '引数でチケット番号を指定してください'
echo " Usage : $(basename $0) 42"
exit 1
fi
# チケット情報取得: curl で JSON を取得後、jq コマンドで整形する
# --------------------------------------------------------------------------------
RESULT=$(curl -sS "$REDMINE_URL/issues/$REDMINE_ISSUE_ID.json?key=$REDMINE_API_KEY" | jq -r '.issue | (.id|tostring) + ":" + .subject, "担当 : " + .assigned_to.name, "状況 : " + .status.name, "開始日 : " + .start_date, "期日 : " + .due_date')
if [ "$RESULT" = "" ] ; then
echo "$REDMINE_ISSUE_ID : 取得失敗"
echo " 当該チケットが参照できるか確認してください"
echo " $REDMINE_URL/issues/$REDMINE_ISSUE_ID"
exit 1
fi
echo "$RESULT"
こんな感じ。
- シェルスクリプトで引数を受け取るため、
$1
を取得した。if
でチェックする時などはダブルクォートで囲み、未入力の際に構文エラーにならないようにする。 - 自分が試した限りだと、
curl
に渡す Redmine API の URL は、シングルクォートかダブルクォートで囲んでおかないと、レスポンスが返された後にプロンプトに戻らないという問題が起きた。- 参考 : Linux - curlが最後で止まる原因について(16396)|teratail … 事象はこれに近い感じ。
- Redmine API も Transfer-Encoding が chunked だったので、ゼロ終端を待っている感じだったのかしら。なぜクォートで囲むと結果が変わるのかはよく分からなかった。
jq
をバリバリ使ってみた。jq -r
オプションで生データを取得。コレにより文字列がダブルクォートで囲まれずに出力される。.issue
を抽出した後、その中身を掘り下げていくため、パイプ|
を利用。コレにより、.issue.id, .issue.subject
と毎回.issue
を書かずに、.issue | .id, .subject
と書けるようになった。- 文字列結合は
"固定文言" + .title
のように+
記号で行える。その際、.issue.id
のように数値が返されるフィールドについては、(.issue.id|tostring)
と、カッコ()
で囲んで|tostring
(s
は小文字!) パイプに繋いで文字列化する。 - 参考 : json - How do I use jq to convert number to string? - Stack Overflow
curl | jq
の結果を変数RESULT
に入れ、改行を出力するためにecho
文で"$RESULT"
とダブルクォートで囲んだ。-e
オプションはsh
シェルだと使えないっぽい?
シェルスクリプト、なかなか楽しい。