TL;DR
GitHub issueとpull requestのやるやらないを、すばやく振り分けていくためのデス
クトップアプリ “Triage for GitHub“を作りました。
GitHubのIssue, Pull Requestを迅速にさばいていくことが出来ます。
Motivation
Dependency Update as a Service – Tachikoma.io, greenkeeper, deppbot – Automated Dependency Updates を使うことで、ガンガンpull requestを飛ばし、CIやカバレッジなど、GitHubのエコシステムに乗ることが出来るようになりました。
(tachikoma.io 使ってね!)
ただし、数が増えるとpull requestを持て余します。見逃すこともしょっちゅう。
特に定期ping的に空pull requestでciを起動するような場合、ciが通っていることを
確認したらガンガンpull requestを閉じたい。
Plan A: /pulls
GitHubには自分のpull request一覧を見るページがあり、これは求めるものに近いものがある。他にも、検索を使ってorganizationのpull request一覧を見る方法もある。しかし、現状どうしてもポチポチクリックしていく必要があり、閉じていくのも面倒くさい。
Plan B: Triage for GitHub
そこで、ガシガシ閉じていく専用のデスクトップアプリを作りました。
ランチャーみたいなイメージで、気になるのあったら’Jump’してGitHubのUIを開いて確認していく、GitHub Issueのトリアージを実現します。
使い方
セットアップ
Latest releaseから自分の環境のzipをダウンロードします。
settingsに、GitHubのpersonal tokenを入れてください。scopeは repo
or public_repo
で、つまり、private+public repos or public reposのどちらかのトークンを入れます。
トークン未入力の場合、lyrictenor/example-issues
のissues/pull requestsを表示します。issue立てたり、pull requestを送ったり、自由にどうぞ。雰囲気はつかめると思います。
トークン未入力の場合、GitHubのAPIリクエスト回数制限が極端に少ないです。
https://developer.github.com/v3/#rate-limiting
60 requests per hour.
一定時間IP制限かかるので注意です。
トークンを使っていても、人によっては結構な回数APIリクエストをするアプリなので、過剰な巡回・起動には注意してください。
表示
updated atの新しい順に、5日ぶんのissue/pull requestが並びます。日数はひとまず固定です。
実験的機能 自動巡回
autopilotをonにすると、定期的に自動巡回します。
が、コレはまだ動いたり動かなかったりです。
autopiloting flagがonになったままになってしまうバグが有るため、そうなった場合
はdebug paneから force unlockしてください。
issueの詳細
issue, pull requestの詳細は v っぽいアイコンをクリックしてください。
まとめ
GitHub issues, pull requestsをガンガン振り分けできる “Triage for GitHub”を作ったのでガンガン整理できる。
使ったnpm modules
力作。package.json
"dependencies": { "classnames": "^2.1.3", "crossing": "^1.0.1", "crypto-js": "^3.1.5", "electron-debug": "0.3.0", "electron-open-link-in-browser": "^1.0.1", "electron-template-menu": "1.0.3", "es6-error": "^2.0.0", "is-empty-object": "^1.1.0", "level-js": "^2.2.2", "level-sublevel": "^6.5.2", "levelup": "^1.2.1", "lodash": "^3.10.1", "material-ui": "0.13.1", "moment": "^2.10.6", "octokat": "^0.4.11", "react": "^0.14.2", "react-addons-create-fragment": "^0.14.2", "react-addons-pure-render-mixin": "^0.14.2", "react-addons-transition-group": "^0.14.2", "react-addons-update": "^0.14.2", "react-dom": "^0.14.2", "react-redux": "^4.0.0", "react-router": "1.0.0-rc4", "react-tap-event-plugin": "0.2.1", "redux": "^3.0.0", "redux-batched-updates": "^0.1.0", "redux-devtools-dock-monitor": "^1.0.0-beta-3", "redux-devtools-log-monitor": "^1.0.0-beta-3", "redux-form": "^3.0.0-beta-4", "redux-thunk": "^1.0.0", "reset-storage": "^1.0.1", "rndm": "^1.1.0" }, "devDependencies": { "archiver": "^0.16.0", "babel": "^5.8.23", "babel-core": "^5.8.23", "babel-eslint": "^4.1.1", "babel-loader": "^5.3.2", "babel-plugin-react-transform": "^1.0.3", "babel-runtime": "^5.8.20", "buffered-spawn": "^1.1.2", "conventional-changelog": "^0.5.0", "cpy": "^3.4.0", "css-loader": "^0.21.0", "eclint": "^1.1.1", "electron-packager": "^5.0.2", "electron-prebuilt": "0.34.2", "eslint": "^1.3.1", "eslint-config-airbnb": "0.1.0", "eslint-loader": "^1.0.0", "eslint-plugin-babel": "^2.1.1", "eslint-plugin-react": "~3.6.3", "espower-babel": "^3.3.0", "express": "^4.13.3", "extract-text-webpack-plugin": "^0.9.0", "fixpack": "^2.2.0", "globstar": "^1.0.0", "html-webpack-plugin": "^1.6.1", "is-travis-ci-build-for-tag": "^1.1.1", "json-loader": "^0.5.2", "mocha": "^2.3.0", "npm-check-updates": "^2.2.0", "power-assert": "^1.0.0", "react-transform-catch-errors": "^1.0.0", "react-transform-hmr": "^1.0.1", "redbox-react": "^1.0.5", "redux-devtools": "^v3.0.0-beta-3", "rimraf": "^2.4.3", "silence-chromium": "^2.0.0", "style-loader": "^0.13.0", "touch": "^1.0.0", "webfont-dl": "^0.1.2", "webpack": "^1.12.0", "webpack-dev-middleware": "^1.2.0", "webpack-hot-middleware": "^2.1.0", "yargs": "^3.23.0" },