1ヶ月ぐらい前だけどhubotからgithubにissueを建てるのを作った。

チャットからissueのリストを見たり作ったりできるので手軽。なんか雑用を思いついたらToDoというリポジトリにissue立てるみたいな運用されてる。




githubot


hubotからgithub apiを使う場合、githubotというnpmが便利だった。
githubotはbranchのリストを取る便利メソッドとかはあるけど、基本的にGitHubのAPIをgithubot.get(url,data,callback)とgithubot.post(url,data,callback)で直接扱う。

以下はgithubot 1.0.0-beta2を使っている。


セットアップ


HUBOT_GITHUB_TOKENという環境変数を使うので、

curl -i https://api.github.com/authorizations -d '{"scopes":["repo"]}' -u "自分のユーザー名"
を実行してAPI tokenをもらって、herokuに環境変数セットする。

heroku config:set HUBOT_GITHUB_TOKEN=a1b2cdef3456

なおissueはtokenを作ったユーザー名で建てられるようになる。


実装


Issues | GitHub APIをgithubotのpostに渡すだけでissueが作れた。

githubのAPIが綺麗に規則的にできているので、githubotもよくあるかっちりしたAPIラッパーである必要がなく、tokenとかパラメータの渡し方の部分だけよしなにやってくれる薄いライブラリになっている。
なんか下手にAPIリクエスト先のpathを規則的にメソッド名に変換しているとか、そういうのじゃなくてURLをそのまま書く方がわかりやすい感じがする。APIとライブラリ両方のドキュメントを突き合わせて読まずに済むのはよい。

https://github.com/masuilab/slack-hubot/blob/master/scripts/github_issue.coffee
debug = require('debug')('hubot-github-issue')
repo = process.env.HUBOT_GITHUB_ISSUE_REPO or "masuilab/todo"

module.exports = (robot) ->
github = require('githubot')(robot)

## list issue
robot.respond /issue$/i, (msg) ->
debug "get issues list (#{repo})"
github.get "https://api.github.com/repos/#{repo}/issues", {}, (issues) ->
issues = issues.sort (a,b) -> a.number > b.number
texts = ["https://github.com/#{repo}/issues"]
for i in issues
texts.push "[#{i.number}] #{i.title}"
debug texts
msg.send texts.join '\n'

## create issue
robot.respond /issue (.+)$/mi, (msg) ->
who = msg.message.user.name
body = msg.match[1]
debug "create issue #{body} (#{repo})"
query_param =
title: body
body: "#{body}\n\ncreated by #{who} & hubot"
labels: ["fromHubot"]
github.post "https://api.github.com/repos/#{repo}/issues", query_param, (issue) ->
text = "issue created\n#{issue.html_url}" or "issue create error"
debug text
msg.send text