Corredor

ウェブ、プログラミングの勉強メモ。

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 は、シングルクォートかダブルクォートで囲んでおかないと、レスポンスが返された後にプロンプトに戻らないという問題が起きた。
  • jq をバリバリ使ってみた。
    • jq -r オプションで生データを取得。コレにより文字列がダブルクォートで囲まれずに出力される。
    • .issue を抽出した後、その中身を掘り下げていくため、パイプ | を利用。コレにより、.issue.id, .issue.subject と毎回 .issue を書かずに、.issue | .id, .subject と書けるようになった。
    • 文字列結合は "固定文言" + .title のように + 記号で行える。その際、.issue.id のように数値が返されるフィールドについては、(.issue.id|tostring) と、カッコ () で囲んで |tostring (s は小文字!) パイプに繋いで文字列化する。
  • curl | jq の結果を変数 RESULT に入れ、改行を出力するために echo 文で "$RESULT" とダブルクォートで囲んだ。-e オプションは sh シェルだと使えないっぽい?

シェルスクリプト、なかなか楽しい。

Redmine超入門(日経BP Next ICT選書)

Redmine超入門(日経BP Next ICT選書)

Redmineによるタスクマネジメント実践技法

Redmineによるタスクマネジメント実践技法