LoginSignup
2
2

More than 3 years have passed since last update.

JIRA REST APIで任意の課題(JQLで指定)にグループメンバーをウォッチャーとして割り当てる。

Posted at

はじめに

  • JIRAの一括変更でグループメンバーへのウォッチャー割り当てができなかったためREST APIで実装してみました。

実施環境

作業の流れ

  1. getUsersInGroup関数を使ってメンバーのaccount_idの抽出
  2. searchJira関数を使って未ウォッチタスクの抽出
  3. addWatcher関数を使ってウォッチャーの割り当て
  4. mainでそれぞれの関数をasync/awaitで同期処理。

getUsersInGroup

  • グループ内のaccount_idの抽出
  • 同期処理をするためにPromiseを用意しておく。
index.js
// グループメンバーの抽出
function getUsersInGroup(groupName) {
  return new Promise((resolve, reject) => {
    var watcher =[];
      jira.getUsersInGroup(groupName) //getUsersInGroup(groupname: string, startAt: integer, maxResults: integer)
      .then(function(issue){
        console.log("getUsersInGroup:")
          for (  var i = 0;  i < issue.users.items.length;  i++  ) {
            if(issue.users.items[i].accountType == "atlassian"){
              watcher.push({id:issue.users.items[i].accountId,name:issue.users.items[i].displayName});
            }
          }
        console.log(watcher)
        return resolve(watcher);
      })
      .catch(function(err) {
        console.error(err);
      });
  });
}

searchJira

  • 未ウォッチタスクの抽出
  • wwatcher not in (" + user_id + ")だけではウォッチャーなしのタスクを抽出できなかったためorで watcher is EMPTYも接続しました。
index.js
// 未ウォッチタスクの検索
function searchNotWatch(issueKey,user_id) {
  return new Promise((resolve, reject) => {
    var jql_notWatch = jql + " and (watcher is EMPTY OR watcher not in (" + user_id + ")) "
    jira.searchJira(jql_notWatch,{maxResults: 1000}) //searchJira(searchString: string, optional: object): 
    .then(function(issue){
      for (var i = 0;i < issue.issues.length; i++){
        issueKey[i] = issue.issues[i].key
        console.dir(issueKey[i])
      }
      return resolve(issueKey);
    })
  });
}

addWatcher

  • ウォッチャーの割り当て
index.js
// ウォッチャー割り当て
function addWatcher(issueKey,user_id) {
  return new Promise((resolve, reject) => {
    jira.addWatcher(issueKey,user_id)
    .then(function(issue){
      console.dir(issueKey + "にウォッチャー割り当て")
      return resolve();
    })
  });
}

main

  • 各関数を同期処理
index.js
// main
async function main() {
  var watcher =[];
  console.log('start');
  watcher = await getUsersInGroup(group_name)
  console.log(watcher.length);
  for(var i = 0;i<watcher.length;i++){
    var issue_key = [];
    console.log(watcher[i].name+"さんの未ウォッチタスクは")
    issue_key = await searchNotWatch(issue_key,watcher[i].id);
    console.log(watcher[i].name+"さんにウォッチャー割り当て実行")
    for(var j =0;j<issue_key.length;j++){
      await addWatcher(issue_key[j],watcher[i].id)
    }       
  } 
  console.log('done');
}

つなげると

  • 一連の流れをつなげるとこんな感じになります。
index.js
//任意の課題(JQLで指定)にグループメンバーをウォッチャーとして割り当てる。

const JiraApi = require('jira-client');
const config = require('config');

const jql = "project = TEST_project" ; //任意のフィルターをJQLで指定。
const group_name = "TEST_group"; //割り当てたいグループを指定

// Setting
const jira = new JiraApi({
  protocol: config.protocol,
  host: config.host,
  username: config.username,
  password: config.password,
  apiVersion: config.apiVersion,
  strictSSL: config.strictSSL
})
// グループメンバーの抽出
function getUsersInGroup(groupName) {
  return new Promise((resolve, reject) => {
    var watcher =[];
      jira.getUsersInGroup(groupName) //getUsersInGroup(groupname: string, startAt: integer, maxResults: integer)
      .then(function(issue){
        console.log("getUsersInGroup:")
          for (  var i = 0;  i < issue.users.items.length;  i++  ) {
            if(issue.users.items[i].accountType == "atlassian"){
              watcher.push({id:issue.users.items[i].accountId,name:issue.users.items[i].displayName});
            }
          }
        console.log(watcher)
        return resolve(watcher);
      })
      .catch(function(err) {
        console.error(err);
      });
  });
}

// 未ウォッチタスクの検索
function searchNotWatch(issueKey,user_id) {
  return new Promise((resolve, reject) => {
    var jql_notWatch = jql + " and (watcher is EMPTY OR watcher not in (" + user_id + ")) "
    jira.searchJira(jql_notWatch,{maxResults: 1000}) //searchJira(searchString: string, optional: object): 
    .then(function(issue){
      for (var i = 0;i < issue.issues.length; i++){
        issueKey[i] = issue.issues[i].key
        console.dir(issueKey[i])
      }
      return resolve(issueKey);
    })
  });
}

// ウォッチャー割り当て
function addWatcher(issueKey,user_id) {
  return new Promise((resolve, reject) => {
    jira.addWatcher(issueKey,user_id)
    .then(function(issue){
      console.dir(issueKey + "にウォッチャー割り当て")
      return resolve();
    })
  });
}
// main
async function main() {
  var watcher =[];
  console.log('start');
  watcher = await getUsersInGroup(group_name)
  console.log(watcher.length);
  for(var i = 0;i<watcher.length;i++){
    var issue_key = [];
    console.log(watcher[i].name+"さんの未ウォッチタスクは")
    issue_key = await searchNotWatch(issue_key,watcher[i].id);
    console.log(watcher[i].name+"さんにウォッチャー割り当て実行")
    for(var j =0;j<issue_key.length;j++){
      await addWatcher(issue_key[j],watcher[i].id)
    }       
  } 
  console.log('done');
}

main();

終わりに

  • これで、タスクの検索 → 内容の変更 を一連の作業として行えるので、応用すればその他の修正作業も行えるはず。
2
2
0

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
2
2