JIRA REST APIで課題情報を取得（jira-client-npm を使用）

#はじめに
* JIRA Softwareが10ユーザーまで無料で使えるようになったため家でもJIRAを触れるようになりました。
* ということでREST APIの勉強をしつつ、結果を記事に残していこうと思います。
* まずは課題の情報を取得する方法から。

#実施環境

| 項目 | 値 |
|:--|:--|
| JIRA バージョン | JIRA Software フリープラン|
| プログラム言語 | Node.js v12.16.2|
| nodeモジュール | jira-client v6.16.0|
| 認証 | googleアカウント|

* [jira-client-npm](https://www.npmjs.com/package/jira-client)を使うと比較て簡単に実装できました。

#事前準備
* [node.js](https://nodejs.org/ja/)をインストールしておく。
* JIRAで host / username / password / issueNumber(課題key）が必要になります。
* Googleアカウント認証を使用している人は、APIトークンを取得する必要があります。
* 取得の仕方はJIRA画面の右上プロフィールと設定（アバターマーク）　→　アカウント設定　→　セキュリティー　→　APIトークンの作成と管理　→APIトークンを作成　（一度しか表示されないようなのでご注意を）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319430/a7840ce4-2cef-7e89-69c5-c8b8cbe14aa6.png)


* jira-client-npm のインストールはプロンプト画面で作業ディレクトリまで移動し下記を実行。

```bush
$ npm install jira-client
```
#課題情報の取得
* 作業ディレクトリにindex.jsファイルを作り下記内容を転記。
* 使いそうな情報を全て載せてみましたので必要なところを適宜抜粋してご利用ください。

```index.js
const JiraApi = require('jira-client');

var issueNumber = "" //keyを入力
var customfield_n = ""

// Initialize
var jira = new JiraApi({
  protocol: 'https',
  host: 'hostname.atlassian.net', //hostnameに置き換え
  username: 'username', //google認証の方はGmailアドレスに置き換え
  password: 'password', //google認証の方はAPIトークンに置き換え
  apiVersion: '3',
  strictSSL: true
});
// 課題情報の取得
jira.findIssue(issueNumber)
  .then(function(issue) {
		//customfieldの値を確認
		/*for (  var i = 10001;  i < 10100;  i++  ) {
			customfield_n = "customfield_" + i
			console.dir(customfield_n + ":" + JSON.stringify(eval("issue.fields." + customfield_n)))
		} */
//		console.dir(issue.fields) //issue.fieldsをすべて確認
		console.log('プロジェクト名: ' + issue.fields.project.name);
		console.log('要約: ' + issue.fields.summary);
		console.log('タイプ: ' + issue.fields.issuetype.name);
		console.log('優先度: ' + issue.fields.priority.name);
		console.log('ステータス: ' + issue.fields.status.name);	
		console.log('エピック名: ' + issue.fields.customfield_10011);
		console.log('エピックリンク: ' + issue.fields.customfield_10014);
		if(issue.fields.parent == null){ 
			console.log('親:なし')
		}else{
			console.log('親: ' + issue.fields.parent.key);
		}
		if(issue.fields.description != null){	
			console.log('説明:');
			console.log(issue.fields.description.content[0].content)	
		}
		if(issue.fields.assignee == null){ 
			console.log('担当者: 未割当')
		}else{
			console.log('担当者: ' + issue.fields.assignee.displayName);
		}
		if(issue.fields.reporter == null){
			console.log('報告者: 未割当')
		}else{
			console.log('報告者: ' + issue.fields.reporter.displayName);
		}
		console.log('作成日: ' + issue.fields.created);
		console.log('更新日: ' + issue.fields.updated);
		console.log('期限　: ' + issue.fields.duedate);
		if(issue.fields.components == ""){
			console.log('コンポーネント:なし')
		}else{
			for (  var i = 0;  i < issue.fields.components.length ;  i++  ) {
				console.log('コンポーネント' + i +': ' + JSON.stringify(issue.fields.components[i].name))
			}
		}
		if(issue.fields.labels == ""){
			console.log('ラベル:なし')
		}else{
			console.log('ラベル: ' + JSON.stringify(issue.fields.labels));
		}
		
		if(issue.fields.comment.total == 0){		
			console.log('コメント:なし');
		}else{
			console.log(issue.fields.comment.comments[issue.fields.comment.comments.length-1].body.content[0].content)
		}
		if(issue.fields.attachment == ""){
			console.log('添付ファイル:なし')
		}else{
			for (  var i = 0;  i < issue.fields.attachment.length ;  i++  ) {
				console.log('添付ファイル' + i +': ' + JSON.stringify(issue.fields.attachment[i].content))
			}
		}
		console.log('ウォッチ済: ' + issue.fields.watches.isWatching);
		console.log('ストーリーポイント: ' + issue.fields.customfield_10026);
		console.log('ストーリーポイント見積もり値: ' + issue.fields.customfield_10016);
		})
  .catch(function(err) {
    console.error(err);
  });

```
実行

```bush
$ node index.js
```

#おわりに
* 今後、課題の作成・データの書き換え等の情報もアップしていこうと思います。