21
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JIRA APIを使用してチケットを作成する

Last updated at Posted at 2018-06-30

JIRAは便利だけど、チケット作るの面倒!
定期的に作る必要があったり、細かく起票ルールが決まっている場合は、どうにか自動化させたいですよね。

その第一歩としてまずはJIRA APIを使用してチケットを作成してみました。

使用するAPI

  • JIRA Login API
  • JIRA Create issue API

環境

  • JIRA Software v7.3.6
  • Node v9.11.1

全体の流れ

app.js
function main () {
  const request = require('request')
  const JIRA_URI = 'https://jira.hogehoge.co.jp/'

  return loginJIRA()
    .then(function (data) {
      return createIssue(data.session.name, data.session.value)
    })
    .then(function (data) {
      console.log('create ticket id:' + data.key)
    })
}

チケット作成APIを実行する上で、まずログインAPIを実行し、JIRAセッションを取得する必要があります。
JIRAセッションをcreate issueAPIに渡し、チケットを作成します。

ログインAPI

login.js
  function loginJIRA () {
    let options = {
      uri: JIRA_URI + 'rest/auth/1/session',
      headers: {
        'Content-type': 'application/json'
      },
      body: {
        username: 'username',
        password: 'hogehoge'
      },
      method: 'POST',
      json: true
    }

    return new Promise(function (resolve, reject) {
      request(options, function (error, response, data) {
        if (!error && response.statusCode === 200) {
          console.log('JIRA login success!!')
          resolve(data)
        } else {
          console.log('error: ' + response.statusCode + ': ' + data.errorMessages[0])
          reject(data.errorMessages[0])
        }
      })
    })
  }
ログインAPIのレスポンス
{ session:
   { name: 'JSESSIONID',
     value: 'ABCDEFGHABCDEFGHABCDEFGHABCDEFGH' },
  loginInfo:
   { failedLoginCount: 30,
     loginCount: 5507,
     lastFailedLoginTime: '2018-04-11T00:45:19.514+0900',
     previousLoginTime: '2018-06-30T18:21:36.614+0900' } }

JIRA APIを利用するためにはsession.nameとsession.valueが必要になります。

チケット作成API

createIssue.js
  function createIssue (sessionName, sessionValue) {
    let payload = {
      fields: {
        project: {
          key: 'TEST'
        },
        summary: 'チケットタイトル',
        assignee: { // 担当者
          name: 'username'
        },
        priority: { // 優先度
          id: '3'
        },
        issuetype: { // チケットタイプ
          id: '3'
        },
        description: 'チケット説明'
      }
    }

    let options = {
      uri: JIRA_URI + '/rest/api/2/issue',
      headers: {
        'Content-type': 'application/json',
        cookie: sessionName + '=' + sessionValue
      },
      body: payload,
      method: 'POST',
      json: true
    }

    return new Promise(function (resolve, reject) {
      request(options, function (error, response, data) {
        if (!error && response.statusCode === 201) {
          console.log('JIRA ticket create success!!')
          resolve(data)
        } else {
          console.log('error: ' + response.statusCode + ': ' + data.errorMessages)
          reject(data.errorMessages)
        }
      })
    })
  }
チケット作成APIのレスポンス
{ id: '123456',
  key: 'TEST-123',
  self: 'https://jira.hogehoge.co.jp/rest/api/2/issue/123456' }

チケット作成APIのヘッダーにログインAPIで取得したセッションが必要になります。

今回はプロジェクト、タイトル、担当者、優先度、チケットタイプ、説明のみ指定しています。

チケットタイプ、優先度のIDがわからない場合は下記のAPIで調べることができます。
※jira.hogehoge.co.jpは使用しているJIRAのURLに変更してください。
チケットタイプ: https://jira.hogehoge.co.jp/rest/api/2/issuetype
優先度: https://jira.hogehoge.co.jp/rest/api/2/priority

まとめ

簡単なチケットであればこれで作成できそうです。
サブタスクや親子チケット、その他のフィールドを指定するチケットについては別途まとめようと思います。

参考

JIRA Server platform REST API reference(JIRA 7.3.6)

サンプルコード
## サンプルコード ```js:app.js function main () { const request = require('request') const JIRA_URI = 'https://jira.hogehoge.co.jp/'

return loginJIRA()
.then(function (data) {
return createIssue(data.session.name, data.session.value)
})
.then(function (data) {
console.log('create ticket id:' + data.key)
})

function loginJIRA () {
let options = {
uri: JIRA_URI + 'rest/auth/1/session',
headers: {
'Content-type': 'application/json'
},
body: {
username: 'username',
password: 'hogehoge'
},
method: 'POST',
json: true
}

return new Promise(function (resolve, reject) {
  request(options, function (error, response, data) {
    if (!error && response.statusCode === 200) {
      console.log('JIRA login success!!')
      resolve(data)
    } else {
      console.log('error: ' + response.statusCode + ': ' + data.errorMessages[0])
      reject(data.errorMessages[0])
    }
  })
})

}

function createIssue (sessionName, sessionValue) {
let payload = {
fields: {
project: {
key: 'TEST'
},
summary: 'チケットタイトル',
assignee: { // 担当者
name: 'username'
},
priority: { // 優先度
id: '3'
},
issuetype: { // チケットタイプ
id: '3'
},
description: 'チケット説明'
}
}

let options = {
  uri: JIRA_URI + '/rest/api/2/issue',
  headers: {
    'Content-type': 'application/json',
    cookie: sessionName + '=' + sessionValue
  },
  body: payload,
  method: 'POST',
  json: true
}

return new Promise(function (resolve, reject) {
  request(options, function (error, response, data) {
    if (!error && response.statusCode === 201) {
      console.log('JIRA ticket create success!!')
      resolve(data)
    } else {
      console.log('error: ' + response.statusCode + ': ' + data.errorMessages)
      reject(data.errorMessages)
    }
  })
})

}
}

main()


```sh:実行結果
$ node app.js
JIRA login success!!
JIRA ticket create success!!
create:TEST-123
21
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?