LANG SELRCT

コードを書く場所についてはこちら

2018年1月2日火曜日

JIRA APIでissueを作成する


JIRA上で直接issueを作成せずにAPIで作成するコードの例です

作成後にissue keyをログに出しています


以下はご自身のものに変更してから実行して下さい
  • SITENAME
  • LOGIN_EMAIL
  • LOGIN_PASSWORD


以下の例ではカスタムフィールドを customfield_10026 としていますが任意のフィールドを指定して適切な値を設定して下さい



コード.gs
var ISSUE_URL = 'https://SITENAME.atlassian.net/rest/api/2/issue/';

function doPost() {
  var token = get_token();
  var payload = get_payload();
  var options = get_options(token, payload);
  var response = UrlFetchApp.fetch(ISSUE_URL, options);
  Logger.log(response);
  var key = get_key(response);
  Logger.log(key);
}

function get_token() {
  var id = "LOGIN_EMAIL";
  var pw = "LOGIN_PASSWORD";
  var token = Utilities.base64Encode(id + ":" + pw);
  return token;
}

function get_payload(values) {
  var email = Session.getActiveUser().getEmail();
  var data = {
    project: {key: "KEY"},
    issuetype: {name: "Task"},
    priority: {name: 'Medium'},
    summary: "たいとる",
    description: "タスクの説明です\n説明の2行め",
    customfield_10026: "対象のカスタムフィールドに入れる値",
    reporter: {name: email}
  };
  var fields = {fields: data};
  var payload = JSON.stringify(fields);
  return payload;
}

function get_options(token, payload) {
  var options = {
    method: "post",
    payload: payload,
    contentType: "application/json",
    headers: {"Authorization": " Basic " + token}
  }
  return options;
}

function get_key(response){
  var jobj = JSON.parse(response);
  var key = jobj["key"];
  return key;
}
意訳
issueのapiをたたくURLをISSUE_URLに入れる

この機能がやること
tokenを取得して
payloadを取得して
optionsを取得して
issueを作成して
responseをログに出して
keyを取得して
ログに出す


この機能がやること
JIRAのログインに使っているemailと
パスワードを
base64Encodeでエンコードして
返す


この機能がやること
実行しているユーザのemailを取得して
dataオブジェクトを作って
プロジェクトを指定して
課題タイプを指定して
優先度を指定して
タイトルを入力して
説明を入力して
カスタムフィールドを指定して値を入力して
報告者にuser_nameを入れて(例はuser_nameとemailが同じ場合)

fieldsに入れて
JSONに変換して
返す


この機能がやること
optionsのオブジェクトを作成して
methodをpostにして
渡されたpayloadを入れて
contentTypeをapplication/jsonにして
headersに {"Authorization": " Basic " + token}を入れて

返す


この機能がやること
受け取ったresponseをオブジェクトに変換して
keyを取得して
返す



補足


こんなエラーが出る場合
{"errorMessages":[],"errors":{"reporter":"Field 'reporter' cannot be set. It is not on the appropriate screen, or unknown."}}

考えられること
  1. 報告者(reporter)フィールドの編集権限がない(課題の作成画面で表示されていない)
  2. 報告者がJIRAのプロファイルのユーザー名(username)にいない

1. 報告者の編集権限を付与する
設定 > 権限 > アクション > 権限の編集 > 報告者の修正 編集リンク > 

許可先:アプリケーションアクセス→ログイン済みのユーザー全員
などにすると許可先を変更できるようです



2. JIRAのプロファイルのユーザー名(username)を確認する・変更する
サイト管理 > Users > ユーザのFull nameのリンククリック > Edit

表示されるEdit User画面の中のusernameがAPIでPOSTするときのreporterっぽいので
スクリプトの中のvar email = Session.getActiveUser().getEmail()で取得されるものと同じにする



1, 2への道のり

一度迷子になると時間を消耗してしまうので、今回僕がたどり着いた道のりを書き残しておきます


1. 報告者の編集権限を付与する道


プロジェクトの「設定」をクリックする


「権限」をクリックする


「アクション」をクリックして表示される「権限の編集」をクリックする


報告者の修正の「編集」をクリックする


許可先を指定して「許可」をクリックする
(アプリケーションアクセスでログイン済のユーザー全員に許可する場合の例)



2. JIRAのプロファイルのユーザー名(username)を確認する・変更する道のり


メニューを開いて「サイト管理」をクリックする


UsersのFull nameのリンクをクリックする


Editをクリックして表示されるUsernameがAPIでPOSTするときのreporterらしい



参考

Create issue
https://developer.atlassian.com/cloud/jira/platform/rest/#api-api-2-issue-post