Date
2017/05/30
はじめに
こんにちは。 yoshitsugu です。 普段Slackを使っていると、「この発言は流れてほしくない」というものがあると思います。
通常であればSlackのpin機能などで事足りると思いますが、バグの報告などはそのままGitHub Issue化できると便利です。そこで、今回はSlackの発言にreactionをつけることでGitHub Issue化するSlack botを作ってみました。
今回のゴール
- Slack上で発言にEmoji reactionをつけるとそのままGitHub Issueとして登録される
- 1チャンネル1リポジトリとしてSlackチャンネルとGitHubリポジトリとの紐付けができる
手順
hubotの下準備
スクリプトの作成
hubotディレクトリのscripts/ 以下に以下のようなスクリプトをおきます。
octonode = require('octonode')
Slack = require('slack-node')
truncate = require('truncate')
_ = require('lodash')
slack = new Slack(process.env.HUBOT_SLACK_TOKEN)
github = octonode.client(process.env.HUBOT_GITHUB_TOKEN)
module.exports = (robot) ->
robot.brain.data.repos = {} unless robot.brain.data.repos
getMsgFromTs = (channel_id, ts) ->
new Promise (resolve) ->
options = {
channel: channel_id,
latest: ts,
oldest: ts,
inclusive: true,
count: 1
}
slack.api 'channels.history', options, (err, res) ->
resolve res
getTeamInfo = ->
new Promise (resolve) ->
slack.api 'team.info', {}, (err, res) ->
resolve res
getChannels = (channel_id) ->
new Promise (resolve) ->
slack.api 'channels.list', {channel: channel_id}, (err, res) ->
resolve res
registerGitHubIssue = (ghrepo, title, body) ->
new Promise (resolve) ->
ghrepo.issue
"title": title,
"body": body,
, (err, issue, h) ->
resolve issue
slackMsgToPlainText = (msg, channels) ->
while result = (/<(.*?)>/g).exec(msg)
action = result[1].substr(0,1)
replaced = result[0]
switch action
when "#"
channel_id = /#(.*)/.exec(result[1].split("|")[0])[1]
channel_name = channels[channel_id]?.name
replaced = "##{channel_name}"
when "!"
replaced = ""
when "@"
user_id = /@(.*)/.exec(result[1].split("|")[0])[1]
user_name = robot.adapter.client.rtm.dataStore.getUserById(user_id)?.name
replaced = "@#{user_name}"
else
replaced = result[1]
msg = msg.replace(result[0], replaced)
return msg
registerIssue = (msg) ->
channel_id = msg.item.channel
ts = msg.item.ts
emoji = msg.reaction
if emoji == process.env.GITHUB_ISSUE_EMOJI
repo = robot.brain.data.repos[channel_id]
unless repo
robot.send {room: channel_id}, "リポジトリが設定されていません。@gh-bot set sikmi/xxx のような形式で設定してください"
return
msg = null
channels = null
getChannels().then( (d) ->
channels = _.keyBy(d.channels, (x) -> x.id)
return getMsgFromTs(channel_id, ts)
).then( (d) ->
msg = d.messages[0]
return getTeamInfo()
).then( (d) ->
text = slackMsgToPlainText(msg.text, channels)
url = "https://" + d.team.domain + ".slack.com/archives/" + channel_id + "/p" + ts.replace(/\./, "")
ghrepo = github.repo(repo);
return registerGitHubIssue(ghrepo, truncate(text, 50), url + "\n" + text)
).then( (issue) ->
robot.send {room: channel_id}, "Issue作成完了!\n" + issue.html_url
).catch( (e) ->
robot.logger.error e
robot.send {room: channel_id}, e
)
robot.respond /set (.+)$/i, (res) ->
r = res.match[1]
github.repo(r).info (err, s) ->
if err
res.send "リポジトリ設定に問題があります: #{err.message}"
else
robot.brain.data.repos[res.message.room] = r
res.send "リポジトリを設定しました: #{r}"
robot.respond /get/i, (res) ->
res.send "次のリポジトリが設定されています: " + robot.brain.data.repos[res.message.room]
robot.adapter.client?.rtm?.on? 'reaction_added', registerIssue
今回は、GitHub APIの操作に
、hubot外のSlack APIの操作に
を使いました。
hubotデプロイ
あとはherokuなどにhubotをデプロイして動くようにすれば完了です。
環境変数として、HUBOT_SLACK_TOKEN にSlackのアクセストークン、HUBOT_GITHUB_TOKENにGitHubのアクセストークン、GITHUB_ISSUE_EMOJIにIssue化するときに使うSlack Emoji名の設定が必要ですので、それだけ注意してください。
結果
set (リポジトリ名) で対象のリポジトリ名を設定します。
get で今設定されているリポジトリ名を確認できます
GITHUB_ISSUE_EMOJIのEmoji名で設定したEmoji reactionをつけることでIssueを作成できます。
さいごに
今回はSlackの発言をGitHub Issue化できるhubotの拡張スクリプトを紹介しました。
弊社でも議事録、バグ報告などいくつかの利用例で活用されています。
何かの参考になれば幸いです。
自分に合ったツールを見つけよう「コード生成AIサービスの特徴・違い・おすすめポイントを整理」

自分に合ったツールを見つけよう「コード生成AIサービスの特徴・違い・おすすめポイントを整理」
2025/04/15
AI時代におけるプロトタイピングの進化と影響について「研究発表会vol.13〜nozomu編〜」

AI時代におけるプロトタイピングの進化と影響について「研究発表会vol.13〜nozomu編〜」
2025/02/15
育休は取得してほしい!リモートワークで今しかない子供の成長を見守る「育児パパ座談会 vol.02」
育休は取得してほしい!リモートワークで今しかない子供の成長を見守る「育児パパ座談会 vol.02」
2024/12/15
好きなことを原動力にフルリモートでの働き方を楽しむ「メンバーインタビュー〜harada編〜」
好きなことを原動力にフルリモートでの働き方を楽しむ「メンバーインタビュー〜harada編〜」
2024/11/15
意識高く行動する文化の中で新しいことにチャレンジしていきたい「メンバーインタビュー〜hanamura編〜」
意識高く行動する文化の中で新しいことにチャレンジしていきたい「メンバーインタビュー〜hanamura編〜」
2024/09/15
フルリモートでも距離を感じない・働き方も考え方も柔軟なしくみ製作所で「メンバーインタビュー〜こっし編〜」
フルリモートでも距離を感じない・働き方も考え方も柔軟なしくみ製作所で「メンバーインタビュー〜こっし編〜」
2024/08/30
他社文化に馴染みながらアジャイルチームをビルドアップした話「研究発表会vol.10〜sadatoshi編〜」
他社文化に馴染みながらアジャイルチームをビルドアップした話「研究発表会vol.10〜sadatoshi編〜」
2024/06/30
新しい福利厚生「勉強会補助費・社内コミュニケーション補助費」を導入・必要な支援で業務を後押し
新しい福利厚生「勉強会補助費・社内コミュニケーション補助費」を導入・必要な支援で業務を後押し
2024/06/15
デザインフォーマットとワークフローを再整備した話「研究発表会vol.09〜デザインハブ編〜」
デザインフォーマットとワークフローを再整備した話「研究発表会vol.09〜デザインハブ編〜」
2024/04/30
GA を使わずに滞在時間計測できる環境を作った話「研究発表会vol.08〜kitazumi編〜」
GA を使わずに滞在時間計測できる環境を作った話「研究発表会vol.08〜kitazumi編〜」
2024/03/15
育休は取得してほしい!リモートワークで今しかない子供の成長を見守る「育児パパ座談会 vol.01」
育休は取得してほしい!リモートワークで今しかない子供の成長を見守る「育児パパ座談会 vol.01」
2024/02/15
チームで成果を出すモブプログラミングのすすめ「研究発表会vol.07〜tanukiti編〜」
チームで成果を出すモブプログラミングのすすめ「研究発表会vol.07〜tanukiti編〜」
2024/02/01
怖くないISMS ・ ISMS規格アップデートの話「研究発表会vol.06〜ISMS編〜」
怖くないISMS ・ ISMS規格アップデートの話「研究発表会vol.06〜ISMS編〜」
2023/12/30
行動も後押ししてくれる福利厚生・用途を考えるのも嬉しい時間に「リモートワーク補助金(年間15万円制度)を使ってみた」vol.10
行動も後押ししてくれる福利厚生・用途を考えるのも嬉しい時間に「リモートワーク補助金(年間15万円制度)を使ってみた」vol.10
2023/12/15
参加できないメンバーにも届けたい!撮影舞台を整え配信も「しくみオフ会'23.09〜裏方編〜」
参加できないメンバーにも届けたい!撮影舞台を整え配信も「しくみオフ会'23.09〜裏方編〜」
2023/10/30
自分自身の意識改革にて成果を上げたPMの話「研究発表会vol.04〜toyokawa編〜」
自分自身の意識改革にて成果を上げたPMの話「研究発表会vol.04〜toyokawa編〜」
2023/09/30
RubyとRailsを古いバージョンからアップデートした話「研究発表会vol.03〜kitazumi編〜」
RubyとRailsを古いバージョンからアップデートした話「研究発表会vol.03〜kitazumi編〜」
2023/08/30
go_routerとriverpodを組合わせる「Flutterやってみたシリーズvol.01」
go_routerとriverpodを組合わせる「Flutterやってみたシリーズvol.01」
2023/08/15
リーンサイクルを強化する KPI 計測基盤を作った話「研究発表会vol.02〜hozum編〜」
リーンサイクルを強化する KPI 計測基盤を作った話「研究発表会vol.02〜hozum編〜」
2023/07/15
「ゲームをより楽しむためのコントローラー自作」あなたのゲームライフをもっと充実させてみませんか
「ゲームをより楽しむためのコントローラー自作」あなたのゲームライフをもっと充実させてみませんか
2023/06/30
かくれんぼの立上げから3年・まだまだ挑戦は続く「地方での暮らしと活動〜toyokawa編〜」
かくれんぼの立上げから3年・まだまだ挑戦は続く「地方での暮らしと活動〜toyokawa編〜」
2023/06/15
Elasticsearch で高速な検索システムを構築した話「研究発表会vo.01〜ynishi編〜」
Elasticsearch で高速な検索システムを構築した話「研究発表会vo.01〜ynishi編〜」
2023/05/30
ChatGPT や GitHub Copilot を導入・情報流出リスクを考慮した AI サービスの活用をご紹介
ChatGPT や GitHub Copilot を導入・情報流出リスクを考慮した AI サービスの活用をご紹介
2023/05/15
適度にカジュアルでリラックスした社内・それを維持できるだけの責任感やスキルのあるメンバーに囲まれて「メンバーインタビュー〜matsubayashi編〜」
適度にカジュアルでリラックスした社内・それを維持できるだけの責任感やスキルのあるメンバーに囲まれて「メンバーインタビュー〜matsubayashi編〜」
2023/04/30
リモートワーク生活を充実させるための福利厚生である「リモートワーク補助金」が5万円パワーアップ・使用用途もご紹介
リモートワーク生活を充実させるための福利厚生である「リモートワーク補助金」が5万円パワーアップ・使用用途もご紹介
2023/04/15
Cocodaに新規事業の構想から伴走し支援する「つくらないプロダクト開発」の解説記事が掲載
Cocodaに新規事業の構想から伴走し支援する「つくらないプロダクト開発」の解説記事が掲載
2023/02/05
多様な技術やサービスに触れられる環境が魅力・今後も様々なことを自分で設計しながら楽しみたい「メンバーインタビュー〜timai編〜」
多様な技術やサービスに触れられる環境が魅力・今後も様々なことを自分で設計しながら楽しみたい「メンバーインタビュー〜timai編〜」
2023/01/25
学習や情報交換の場であるモバイルハブで「アプリコンテスト開催」・日頃の取組みやメンバーも紹介
学習や情報交換の場であるモバイルハブで「アプリコンテスト開催」・日頃の取組みやメンバーも紹介
2023/01/15
SIerからの転職・目標実現のためにサポートや挑戦できる環境を活かしたい「ポテンシャル枠奮闘記〜ichikawa編〜」vol.01

SIerからの転職・目標実現のためにサポートや挑戦できる環境を活かしたい「ポテンシャル枠奮闘記〜ichikawa編〜」vol.01
2023/01/05
成長に繋がる経験を活かして頼られる存在になりたい「ポテンシャル枠奮闘記〜kazuki編〜」vol.01

成長に繋がる経験を活かして頼られる存在になりたい「ポテンシャル枠奮闘記〜kazuki編〜」vol.01
2022/12/05
「快適な仕事環境のための自作キーボード入門」今より少しだけキーボードを気にかけてみませんか
「快適な仕事環境のための自作キーボード入門」今より少しだけキーボードを気にかけてみませんか
2022/11/15
改善を止めない姿勢が浸透していることに感動・価値ある活躍を目指して「ポテンシャル枠奮闘記〜kitazumi編〜」vol.01

改善を止めない姿勢が浸透していることに感動・価値ある活躍を目指して「ポテンシャル枠奮闘記〜kitazumi編〜」vol.01
2022/09/29
インターナルコミュニケーションの土台が完成・今後もメンバーが盛り上がることのできる環境を「Slackワイワイプロジェクト」vol.02
インターナルコミュニケーションの土台が完成・今後もメンバーが盛り上がることのできる環境を「Slackワイワイプロジェクト」vol.02
2022/09/22
しくみ製作所らしさ満点のスタンプが誕生・行動指針の浸透や積極的なリアクションを目指して「Slackワイワイプロジェクト」vol.01
しくみ製作所らしさ満点のスタンプが誕生・行動指針の浸透や積極的なリアクションを目指して「Slackワイワイプロジェクト」vol.01
2022/09/15
充実したドキュメントでフルリモートの不安も払拭・相談しやすい環境に感謝「ポテンシャル枠奮闘記〜ikkyu編〜」vol.01

充実したドキュメントでフルリモートの不安も払拭・相談しやすい環境に感謝「ポテンシャル枠奮闘記〜ikkyu編〜」vol.01
2022/09/01
ゼロから立ち上げたかくれんぼinぐんま・今ではライフワークに「地方での暮らしと活動〜toyokawa編〜」
ゼロから立ち上げたかくれんぼinぐんま・今ではライフワークに「地方での暮らしと活動〜toyokawa編〜」
2022/08/25
子供の成長を最前線で見守ることができた育児休業・ポジティブなサポートに感謝「tanukiti編」
子供の成長を最前線で見守ることができた育児休業・ポジティブなサポートに感謝「tanukiti編」
2022/07/21
心身共にリフレッシュ・福利厚生で自分だけのホームジムを開設「リモートワーク補助金(年間10万円制度)を使ってみた」vol.08
心身共にリフレッシュ・福利厚生で自分だけのホームジムを開設「リモートワーク補助金(年間10万円制度)を使ってみた」vol.08
2022/07/14
一緒に働いてみたい・本音で語ってくれた面談を通して働きやすさを感じた「しくみ製作所に入社した理由〜eigoro編〜」
一緒に働いてみたい・本音で語ってくれた面談を通して働きやすさを感じた「しくみ製作所に入社した理由〜eigoro編〜」
2022/07/07
3社5職種を経てエンジニアに・学びを加速させる仕組みに感謝「ポテンシャル枠奮闘記〜kawaguchi編〜」vol.01

3社5職種を経てエンジニアに・学びを加速させる仕組みに感謝「ポテンシャル枠奮闘記〜kawaguchi編〜」vol.01
2022/06/23
海外リモートワーカーの仕事環境を紹介・普段の生活にはない気持ちの変化や発想、課題の発見が「norikt編」
海外リモートワーカーの仕事環境を紹介・普段の生活にはない気持ちの変化や発想、課題の発見が「norikt編」
2022/06/16
整備された評価制度と環境が魅力・文系大学からWebエンジニアになって「ポテンシャル枠奮闘記〜seiji編〜」vol.01

整備された評価制度と環境が魅力・文系大学からWebエンジニアになって「ポテンシャル枠奮闘記〜seiji編〜」vol.01
2022/06/09
しくみ製作所の緩急のバランスが好き・家族がいつも側にいる最高の環境で「メンバーインタビュー〜Sparrow編〜」
しくみ製作所の緩急のバランスが好き・家族がいつも側にいる最高の環境で「メンバーインタビュー〜Sparrow編〜」
2022/06/02
ポテンシャル枠を支援する寺子屋やグループコーチングの取組みにより成長が加速「ポテンシャル枠奮闘記〜kinoko編〜」vol.02

ポテンシャル枠を支援する寺子屋やグループコーチングの取組みにより成長が加速「ポテンシャル枠奮闘記〜kinoko編〜」vol.02
2022/05/26
保険業界からの転職・共に働くメンバーに魅力を感じて「しくみ製作所に入社した理由〜watanabe編〜」
保険業界からの転職・共に働くメンバーに魅力を感じて「しくみ製作所に入社した理由〜watanabe編〜」
2022/05/19
エンジニアとして大きく成長できる環境がここに「ポテンシャル枠奮闘記〜sakita編〜」vol.01

エンジニアとして大きく成長できる環境がここに「ポテンシャル枠奮闘記〜sakita編〜」vol.01
2022/04/21