LANG SELRCT

コードを書く場所

2018年1月2日火曜日

JIRA APIでissueを作成する


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

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


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


※JIRA APIの仕様変更
usernameではなくaccountIdを使うようになりました。accountIdの取得については以下の記事に書きました。
JIRAのAPIでemailからaccountIdを取得したい

Email: Passwordでの認証方法ではなく、Email: API Tokenでの認証方法になりました。
API Tokenの取得については以下の記事に書きました。
JIRAでAPIトークンを取得したい



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

function doPost() {
  var payload = getPayload();
  var options = getOptions(payload);
  var response = UrlFetchApp.fetch(ISSUE_URL, options);
  var key = getKey(response);
  Logger.log(key);
}

function getPayload(values) {
  var email = Session.getActiveUser().getEmail();
  var data = {
    project: {key: "KEY"},
    issuetype: {name: "Story"},
    summary: "たいとる",
    description: ["タスクの説明です\n説明の2行め"],
    reporter: {id: getAccountId()}
  };
  var fields = {fields: data};
  var payload = JSON.stringify(fields);
  return payload;
}


function getProp(key) {
  return PropertiesService.getScriptProperties().getProperty(key);
}

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

function getKey(response){
  var jobj = JSON.parse(response);
  var key = jobj["key"];
  return key;
}

function getAccountId() {
  var project = 'KEY';//プロジェクトを指定する
  var email = Session.getActiveUser().getEmail();
  var url = BASE_URL + '/rest/api/3/user/search?query=' + email;
    var options = {
    method: "get",
    contentType: "application/json",
    headers: {"Authorization": " Basic " + getProp('token')}
  }
  var response = UrlFetchApp.fetch(url, options);
  var jobj = JSON.parse(response);
  var accountInfo = getAccountInfo(jobj, email);
  var accountId = accountInfo['accountId'];
  return accountId;
}

function getAccountInfo(jobj, email) {
  var accountInfo;
  for(var i = 0; i < jobj.length; i++) {
    var emailAddress = jobj[i]['emailAddress'];
    if(emailAddress === email) {
      accountInfo = jobj[i];
    }
  }
  return accountInfo;
} 


カスタムフィールドも入れたい場合
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: {id: accountId}
  };
  var fields = {fields: data};
  var payload = JSON.stringify(fields);
  return payload;
}



補足


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

考えられること
  1. 報告者(reporter)フィールドの編集権限がない(課題の作成画面で表示されていない)
  2. 報告者がJIRAのプロファイルのユーザー名(username)にいない
    → username は廃止されて accountId を使うようになりました
    JIRAのAPIでemailからaccountIdを取得したい

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