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); } |