LoginSignup
40
39

More than 5 years have passed since last update.

GASで作るSlack bot for github

Last updated at Posted at 2015-10-19

SlackからGithub Issue新規作成するよ。GASで!

シチュエーション

Slackでプロジェクトの相談とかしてる時に、アレやろうコレやろうとか
うぉ、Bug踏んだ!とか、日常茶飯事ですよね。

そんな会話してたくせに全然Issueを起こしてなくて、さっきなんか重要なタスク話してたよね?なんだっけ?凄い大切だった気がする!!みたいな感じ有りますよね。
そこから、ログをあさったりするわけですよ。んで見つけられないんですよ大抵の場合。

マメな人なら、その瞬間にIssue作るんだろうけど、マメな人なんて存在しないから
Issueが無いままドッカーンってナルわけですよ。ならないか?

Slack から投稿すればいいやん

Slack(slash cmd) > GAS > githubAPI ということですね。

作業は3ステップ

Step1

githubからパーソナルアクセストークンゲットする。
>本来であればちゃんとOAuthでやるべき

Step2

GASファイルを作成して、Webサービスを起動する。

Step3

SlackにSlash Commandを登録する。

Step1 パーソナルアクセストークン持ってくる

Personal access tokens ページ
ここから、げねれーとしてくだしい

Step2 GAS ファイルこさえる

新規スクリプトファイル作って下のコードコピペして
config書き換える。

コード.gs
// config
var ACC_TOKEN = "<Your Personal access tokens>";
var OWNER = "<ORGANIZATION>";
var REPO = "<REPOSITORY>";


function sendHttpPost(issue_data) {  
  var raw_payload = {
    "title": issue_data.title, 
    "body" : issue_data.body +"\n\nwritten by "+ issue_data.owner
  };

  var payload = JSON.stringify(raw_payload);

  var options =
      {
        "method" : "POST",
        "payload" : payload
      };

  var x = UrlFetchApp.fetch("https://api.github.com/repos/"+OWNER+"/"+REPO+"/issues?access_token="+ACC_TOKEN, options);
  return '{"thank you"}';
}


function makeResponse(e, type){
  var s  = JSON.stringify({type: type, params: e});
  Logger.log(s);

  var ret = e.parameter.text.split(" ")
  var ret_hash = {
    "title": ret[0],
    "body":  ret[1],
    "owner": e.parameter.user_name
  };

  return ret_hash;
}

function doGet(e) {
  return sendHttpPost( makeResponse(e, "GET") );
}
function doPost(e) {
  return sendHttpPost( makeResponse(e,"POST") );
}

Webアプリケーションとして導入する。

SlackBot_github_newIssue.png

リビジョン打って、Webアプリとして公開する。
自分で実行で、全員(匿名ユーザーを含む)の設定にする。

SlackBot_github_newIssue.png

投稿者が固定されてしまう問題

上記スクリプトは、自分のアクセストークン仕込んでるせいで、Issueのオーナーが全件自分になってしまう。だれが投稿できたかがわかればいいので、本文の末尾に、Slackから取得できるUserNameを追記するようにした。

Step3 SlackにSlashコマンドを仕込む

https://<YOUR_SLACK_TEAM>.slack.com/services/new/slash-commands

にアクセスし、新規コマンドを追加する。

Slashコマンドの設定項目は6箇所

  • Command
    • /.newissue
  • URL
    • 前ステップでコピーしたURL (*1)
  • Method
    • GET (POSTでもどっちでもいいはず)
  • Token
    • 今回使用していない。特にいじらず
  • Autocomplete help text
    • Description
      • githubに新規イシューを作成します
    • Usage hint
      • [title] [body]
  • Desciptice Label
    • (特に何も書いてない)

完成

以上で、Slackのどのチャンネルでも、/.と入力すれば
コマンドがサジェッションされ/.newissueにタイトルと本文を入れれば
イシューが作成されますよっと。

Slack.png

補完が出るのでそのまま入力しちゃう

Slack.png

さらに、Slackのgithubインテグレーションを繋いでおくと投稿されたIssueがそのままSlackのチームに通知されます。

Slack.png

いい感じ!

オプションパーサー募集 github

引数で、リポジトリやマイルストン、アサイニーを設定したい。
必須フィールドにするのは、気軽にIssue作成のポリシーに反するので実装してない。
(>パーサー書くのがめんどくさくてやってない)

例えばSlack上でつぶやくときの標準パターンとして

$ /.newissue [タイトル] [本文]

とするんだけども、明らかにオプションが指定できるときには、

-r リポジトリー名
-m マイルストン名
-l ラベル名(複数可能)
-a アサイニー

等オプション指定が出来るようになるとよりIssueカオスが和らぎそう。

こんな感じにできたらなぁ・・😳

$ /.newissue -r myrepo2 -m 高速化 -l ログイン -a a2chub ログイン画面の画像をSVG化する ログインページの表示が重いので可能な限り早くする、取り急ぎ画像ファイルをSVGに置き換える

ミタイナ感じにできるといいなぁと・・・
.gsファイルをgithubに上げてありますので、cmdパーサのprお待ちしておりますm(_ _)m

Happy Slacking!!

40
39
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
40
39