MISSION
SlackのOutgoing Webhooksを利用して、ブログの新規投稿をJIRA課題として作成する。
KEY
SlackのRSS設定
Outgoing Webhooksの設定
JIRA API
Blogger
Blogger
- SlackでブログのRSSフィードをキャッチする仕組みを作っておく→作り方
- ブログに新規投稿する
- キャッチした新規投稿をOutgoing Webhooksで外部Webアプリに送る
- 外部Webアプリでメッセージから情報を抽出する
- 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);
}
|



