GitHub Issues/Pull requests を高速に整理する “Triage for GitHub”

TL;DR

GitHub issueとpull requestのやるやらないを、すばやく振り分けていくためのデス
クトップアプリ “Triage for GitHub“を作りました。

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を持て余します。見逃すこともしょっちゅう。

too-many-pull-requests

特に定期ping的に空pull requestでciを起動するような場合、ciが通っていることを
確認したらガンガンpull requestを閉じたい。

Plan A: /pulls

https://github.com/pulls

github-pulls

GitHubには自分のpull request一覧を見るページがあり、これは求めるものに近いものがある。他にも、検索を使ってorganizationのpull request一覧を見る方法もある。しかし、現状どうしてもポチポチクリックしていく必要があり、閉じていくのも面倒くさい。

Plan B: Triage for GitHub

triage-for-github

そこで、ガシガシ閉じていく専用のデスクトップアプリを作りました。
ランチャーみたいなイメージで、気になるのあったら’Jump’してGitHubのUIを開いて確認していく、GitHub Issueのトリアージを実現します。

使い方

セットアップ

Latest releaseから自分の環境のzipをダウンロードします。

settings

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 っぽいアイコンをクリックしてください。

show-details

まとめ

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"
  },

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください