Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

GASで作るSlack bot for github

More than 5 years have passed since last update.

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!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away