のぴぴのメモ

自分用のLinuxとかの技術メモ

Jira Service ManagementでRest APIで課題を操作したメモ

はじめに

Jira Service ManagementのREST API操作を調査したメモです。
最終的にServer PlatformでREST APIを叩く必要があったため、Jira REST API V3ではなくJira REST API V2前提で調べていますので、注意ください。

JiraのREST API

REST API リファレンス

Jiraにはクラウド版とサーバ版があり、それぞれAPIのバージョンが異なるようです。

2022/9/1時点では、クラウド版がJira REST API V3で、サーバ版の最新が Jira REST API V2(Jira 9.2.0)のようです。
ただ使った限りではクラウド版でもJira REST API V2が実行できるようです。

Jira Server platformのREST APIの種類

JiraのAPIは以下の3種類があるようですが、とりあえず基本の Jira Server platform REST API を見ておけばよさそうです。

REST APIで課題の情報を取得する

curl -u "${ID}:${PASSWD}" https://<Project-name>.atlassian.net/rest/api/2/issue/${ISSUE_ID} | jq

以下はあらかじめ変数で設定しておきます。

  • ${ID} : 接続用に使うJiraユーザのID
  • ${PASSWD}: : API トークン(ログインパスワードではないです。アカウント管理 -> セキュリティ -> APIトークンで生成します)
  • ${ISSUE_ID}/ : 課題のキー(XX-99)か、課題ID(XMLエクスポートして、<key id="99999">XX-99</key>の99999部分)を指定

REST APIで課題をトラジションする

Transitionsの取得

curl -u "${ID}:${PASSWD}" https://<Project-name>.atlassian.net/rest/api/2/issue/${ISSUE_ID}/transitions

Transitionsする

Transitionsの取得で取得したデータから、実行したいTransitionのidを取得して以下を実行します。

TRANSITION_ID=99   #取得したISSUE IDに書き換え

BODY='{
    "transition": {
        "id": "'"${TRANSITION_ID}"'"
    }
}'

curl \
    -u "${ID}:${PASSWD}"  \
    -X POST -d "${BODY}"  \
    --header 'Content-Type: application/json'  \
    --header 'accept: application/json'  \
    --url https://<Project-name>.atlassian.net/rest/api/2/issue/${ISSUE_ID}/transitions

Transitionsしてかつコメントを追記する

前提

前提として該当Transistionを実行したときに以下のような画面が出てくるよう、Transistionを設定する必要があります。

  • Trasition時にコメント追加ができるようにする設定方法
    • 画面(Screen)を新規作成します。フィールドタブは何も設定しないでOKです。
    • 該当ワークフローを編集します。
      • 対象のトランジットを開き、編集を開きます
      • 画面で、新規作成した画面を指定して保存します。
REST API実行
TRANSITION_ID=99   #取得したISSUE IDに書き換え

BODY='{
    "update": {
        "comment": [
            {
                "add": {
                    "body": "Test Message."
                }
            }
        ]
    },
    "transition": {
        "id": "'"${TRANSITION_ID}"'"
    }
}'

curl \
    -u "${ID}:${PASSWD}"  \
    -X POST -d "${BODY}"  \
    --header 'Content-Type: application/json'  \
    --header 'accept: application/json'  \
    --url https://<Project-name>.atlassian.net/rest/api/2/issue/${ISSUE_ID}/transitions

Transitions時に特定のフィールド値を変更する

前提
  • その1) Transitionの画面設定

前提として、該当Transitionでフィールド更新ができるよう、Transitionに割り当てた画面設定で、更新したいフィールドを追加する必要があります。

  • その2) カスタムフィールドの内部キー取得

動かした限りでは、例えばカスタムフィールドAwsAccountIdを更新しようとする時、transitionでAwsAccountIdは指定できず、内部で管理しているcustomfield_10016のような無機質なキーで指定する必要があるようです。Jiraの残念な仕様ですね。

カスタムフィールドの名前と内部のキーのマッピングの一覧は以下で取得することができるので、これで事前に変更したいカスタフィールドの内部キーが何かを確認しておく必要があります。

 curl -u "${ID}:${PASSWD}" "https://<Project-name>.atlassian.net/rest/api/2/search?maxResults=1&expand=names"
REST API実行
TRANSITION_ID=99   #取得したISSUE IDに書き換え

BODY='{
    "fields": {
        "customfield_10075": "bbb hoge hoge"
    },
    "transition": {
        "id": "'"${TRANSITION_ID}"'"
    }
}'

curl \
    -u "${ID}:${PASSWD}"  \
    -X POST -d "${BODY}"  \
    --header 'Content-Type: application/json' \
    --header 'accept: application/json'  \
    --url "https://<Project-name>.atlassian.net/rest/api/2/issue/${ISSUE_ID}/transitions?expand=transitions.fields"

課題(ISSUE)の特定フィールドを変更する

ISSUEの特定フィールドを更新する場合は、ISSUEの編集で対応できます。

BODY='{
    "fields": {
        "customfield_10075": "000000000000"
    }
}'

curl \
    -u "${ID}:${PASSWD}"  \
    -X PUT -d "${BODY}"  \
    --header 'Content-Type: application/json' \
    --header 'accept: application/json'  \
    --url "https://<Project-name>.atlassian.net/rest/api/2/issue/${ISSUE_ID}"