LANG SELRCT

Apps Script Reference  (Create: Create new Spreadsheet | Create new Apps Script

Sunday, August 2, 2020

SlackのOutgoing WebhooksでJIRAに課題を作りたい


MISSION
SlackのOutgoing Webhooksを利用して、ブログの新規投稿をJIRA課題として作成する。


KEY
SlackのRSS設定
Outgoing Webhooksの設定
JIRA API
Blogger


PROCESS
  1. SlackでブログのRSSフィードをキャッチする仕組みを作っておく→作り方
  2. ブログに新規投稿する
  3. キャッチした新規投稿をOutgoing Webhooksで外部Webアプリに送る
  4. 外部Webアプリでメッセージから情報を抽出する
  5. JIRA APIで課題を作る

この記事では
外部WebアプリをGoogle Apps Scriptで作成します。
このブログの新規投稿をキャッチして#generalに通知し、JIRAに課題を作った手順を書きます。

あくまで例として見ていただければと思います。


STEPS 

STEP1
Slackの#generalにBloggerの新規投稿を通知する仕組みを作っておきます


STEP2
Slackに通知されたメッセージを解析して、JIRAに課題を作るコードを作っておきます。
作り方→コード.gs


STEP3
#generalに通知されたメッセージをOutgoing WebhooksでGoogle Apps Scriptに送る仕組みを作っておきます。


STEP4
ブログに新規投稿します。


#generalに通知が来ます。


GoogleドライブにSlackデータを保存するとこのようなデータが確認できます。


JIRAに課題が作成されます。



関連記事

 


コード.gs
/************************************
環境によって異なる値は各自の環境に合わせて値を設定します
************************************/
const BASE_URL = 'https://SITENAME.atlassian.net/';// 対象のJIRA URL
const ISSUE_URL = BASE_URL + '/rest/api/3/issue/';// バージョンは2or3
const accountId = "ACCOUNT_ID";// 自分のJIRAアカウントのID
const FOLDER_ID = "FOLDER_ID";// create_fileで保存するときのGoogleドライブのフォルダID
const projectKey = "PROJECT_KEY";// JIRA課題を作成するプロジェクトキー

/************************************
SlackのOutgoing WebhookでこのプロジェクトのWebアプリのURLを指定している
eventObjにデータが飛んでくる
そのデータから欲しい値を抽出してJIRA APIに送ってissueを作成する
************************************/
function doPost(eventObj) {
  //create_file(JSON.stringify(eventObj, null, 2));// eventObjの中身を見たい時に使う
  const slackToJiraObj = parseSlackMessage(eventObj);
  postToJira(slackToJiraObj);
}

/************************************
Slackから送られてきたeventObj
{
  "parameter": {
    ...
    "text": "<https://www.pre-practice.net/2020/08/blog-post_2.html|テスト投稿>\nテスト用のブログ投稿です。ここに本文が入ります。",
  }
  ...
}

************************************/
function parseSlackMessage(eventObj) {
  const param = eventObj.parameter;
  const text = param["text"];
  const title = text.split("|")[1].split(">")[0];
  const url = text.split("<")[1].split("|")[0];
  const slackToJiraObj = {
    "text": text,
    "title": title,
    "url": url
  };
  return slackToJiraObj;
}

/************************************
飛んできたSlackのデータを元にJIRA課題を作る
************************************/
function postToJira(slackToJiraObj) {
  const payload = getPayload(slackToJiraObj);
  const options = getOptions(payload);
  const response = UrlFetchApp.fetch(ISSUE_URL, options);
  const key = JSON.parse(response)["key"];
  Logger.log(key);
}

/************************************
payloadを作って返す
************************************/
function getPayload(slackToJiraObj) {
  const data = {
    "project": {"key": projectKey},
    "issuetype": {"name": "Story"},
    "summary": slackToJiraObj["title"],
    "description": createDescription(slackToJiraObj["text"]),
    "reporter": {"id": accountId},
    // "customfield_10034": slackToJiraObj["url"]// JIRAにURLフィールドを作っておく
  };
  const fields = {"fields": data};
  const payload = JSON.stringify(fields);
  return payload;
}

/************************************
JIRA API v3ではdescriptionをこのように作るらしい
************************************/
function createDescription(text) {
  const description = {
    "type": "doc",
    "version": 1,
    "content": [
      {
        "type": "paragraph",
        "content": [
          {
            "text": text.replace(/。/g, "。\n"),// 。で改行を入れてやる
            "type": "text"
          }
        ]
      }
    ]
  }
  return description;
}

/************************************
optionsを作って返す
************************************/
function getOptions(payload) {
  const options = {
    "method": "post",
    "payload": payload,
    "contentType": "application/json",
    "headers": {"Authorization": " Basic " + getProp('jira_token')}
  }
  return options;
}

/************************************
スクリプトのプロパティから値を取得して返す
************************************/
function getProp(key) {
  return PropertiesService.getScriptProperties().getProperty(key);
}

/************************************
Googleドライブの指定フォルダにJSONファイルを保存する場合に使う
************************************/
function create_file(json) {
  const content_type = "application/json";
  const file_name = "Slack Message";
  const blob = Utilities.newBlob("", content_type, file_name);
  const file = blob.setDataFromString(json, "UTF-8");
  const folder = DriveApp.getFolderById(FOLDER_ID);
  folder.createFile(file);
}



Latest post

Extracting data from Google Sheets with regular expressions

Introduction Regular expressions are a powerful tool that can be used to extract data from text.  In Google Sheets, regular expressions ca...