GASでJIRAからバージョンの一覧を取得する方法

JIRAでバージョンを管理しているけれど、どのバージョンがいつリリース予定なのかを別のシステム（例えばスプレッドシートやSlack）で確認したいことってありますよね。
そんなとき、GASを使ってJIRAのREST APIを叩いて定期的にバージョン一覧を取ってこれると便利です。
ということで、GASでJIRAからバージョン一覧を取得するためのプログラムを書いてみました。

# 手順
1. GASプロジェクトを作成する
2. `/rest/auth/1/session`でログインする
3. `/rest/api/2/project/{projectIdOrKey}/versions`でバージョン一覧を取得する

# GASプロジェクトを作成する
* Googleドライブの新規作成をクリック

<img width="240" alt="スクリーンショット 2020-06-20 14.05.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/7b15414d-737e-37a6-2bf0-16b3c367643b.png">

* その他をクリック


<img width="317" alt="スクリーンショット 2020-06-20 14.05.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/013705d8-7177-0d13-2e51-f54c2213fa19.png">

* Google Apps Scriptをクリック


<img width="317" alt="スクリーンショット 2020-06-20 14.05.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188222/6abedcae-18ef-ccc6-1314-ce653f32597f.png">

まずは、上記手順で Google Apps Script プロジェクトを作成します。

# `/rest/auth/1/session`でログインする
作成したプロジェクトのgsファイルの中に、以下の関数を作成します。

```javascript
/**
 * ログインしてセッションIDを取得する関数
 *
 * @param username ログインするユーザ名
 * @param password パスワード
 * @param host アクセスするJIRAのURL（https://jira-host.co.jp的な感じ）
 * @return 取得したセッションID
 */
function getJIRASessionID(username, password, host) {
  const body = {
    username: username,
    password: password
  };
  const headers = {
    Accept: "application/json"
  };
  const options = {
    payload: JSON.stringify(body),
    muteHttpExceptions: true,
    contentType: "application/json",
    headers: headers,
    method: "post"
  };
  const response = UrlFetchApp.fetch(
    host + "/rest/auth/1/session",
    options
  );
  const responseHeaders = response.getAllHeaders();
  let cookies = [];
  if (typeof responseHeaders["Set-Cookie"] !== "undefined") {
    cookies =
      typeof responseHeaders["Set-Cookie"] == "string"
        ? [responseHeaders["Set-Cookie"]]
        : responseHeaders["Set-Cookie"];
    for (var i = 0; i < cookies.length; i++) {
      cookies[i] = cookies[i].split(";")[0];
    }
  }
  return cookies[0];
}
```

この関数はJira Server platform REST API referenceにおける[session-loginの項目](https://docs.atlassian.com/software/jira/docs/api/REST/8.9.1/#auth/1/session-login)にあるAPIを叩き、返ってきたヘッダーのクッキーを返す関数です。
この関数の返り値を次のリクエストのヘッダーに入れることで、ログイン状態を引き継いでくれます。

3. `/rest/api/2/project/{projectIdOrKey}/versions`でバージョン一覧を取得する

続いて、同じく作成したプロジェクトのgsファイルの中に、以下の関数を作成します。

```javascript
/**
 * バージョン一覧を取得する関数
 *
 * @param projectIdOrKey プロジェクトIDまたはプロジェクトKey
 * @param cookie getJIRASessionIDで取得した値を入れる
 * @param host アクセスするJIRAのURL（https://jira-host.co.jp的な感じ）
 * @return 取得したバージョン一覧
 */
function getVersions(projectIdOrKey, cookie, host) {
  const options = {
    headers: { cookie: cookie }
  };
  const response = UrlFetchApp.fetch(
    host + "/rest/api/2/project/" + projectIdOrKey + "/versions",
    options
  );
  const parse = JSON.parse(response);
  return parse;
}
```
この関数はJira Server platform REST API referenceにおける[project-getProjectVersionsの項目](https://docs.atlassian.com/software/jira/docs/api/REST/8.8.1/#api/2/project-getProjectVersions)にあるAPIを叩き、返ってきたJSONをパースしてから返す関数です。
例えばこの関数の返り値をスプレッドシートに展開したりすることで、JIRAでできない色んなことができるようになります。

# 使い方
自分はJIRAのURLやユーザ名/パスワードを固定で入れ、プロジェクトKeyを外から入れられるようにして、このプロジェクトをライブラリとして別のGASからインポートして使用しています。
ライブラリにする方法は別の記事にもあると思うので詳細は省きますが、ファイル＞版を管理＞Save new versionをクリックして、バージョンをつけておくと別プロジェクトのリソース＞ライブラリからインポートが可能です。
JIRAを使うのはおそらく個人ではなく会社だと思うので、ユーザ名/パスワードをシステム用で作ったアカウントで指定するとより良いでしょう。