CircleCIから1コマンドでPull requestするgem: pr-daikou

# 背景

[SideCI](https://sideci.com)などPull requestのコード解析をしてチームのコード規約に違反したコードを自動で修正するサービスを利用している方は多いのではないでしょうか。
ほかにもbundle updateも定期的に実行してgemを最新に更新し続ける方針をチームで決めていたりすると思います。

ただ、SideCIは無料枠だとpublic repositoryだけ、bundle updateも当番制だったり、チームの中のある1人が善意でやっている状態になってしまったりということがあると思います。

例えば[CircleCI](https://circleci.com/)の`config.yml`を使いこなせばコード解析や、bundle updateを定期実行してPull requestを自動作成することもできますが、設定は思ったより複雑で最初の一歩がなかなか大変です。
ここで紹介する[pr-daikou](https://rubygems.org/gems/pr-daikou)は、その複雑なPull request作成部分を1コマンドでできるようになります。

# できるようになること

- ワンライナーでブランチ作成からターゲットブランチへのPull requestまでできる
- CircleCIのジョブに仕込めば、定期的にbundle updateや構文解析・補正の結果をPull requestにできる

# pr-daikouとは

新しく公開したpr-daikouは、Pull requestの作成を「代行」してくれます。
例えばbundle updateすると`Gemfile.lock`が更新されます。この差分を新しいブランチを作成してpushし、ターゲットに指定したブランチにPull requestします。

## 使い方

詳しくは[README.md](https://github.com/rvillage/pr-daikou/blob/master/README.md)に記載してありますが、ここでは日本語で説明したいと思います。

## 準備

### インストール

Railsのプロジェクトに組み込むなら`Gemfile`にpr-daikouを追加してください。

```
gem 'pr-daikou'
```

CI上でその場限りで使うなら、そのままgem installでもOKです。

```
gem install pr-daikou
```

### GitHub Personal access tokenの発行

CircleCIから、`git push`やPull requestを作成するにはaccessトークンが必要です。
GitHubの[Personal access token](https://github.com/settings/tokens)設定で、repoへのアクセス権限をチェックしてトークン発行します。

<a href="https://gyazo.com/20a65330f014f01ed9c926a1815f811b"><img src="https://i.gyazo.com/20a65330f014f01ed9c926a1815f811b.png" alt="https://gyazo.com/20a65330f014f01ed9c926a1815f811b" width="400"/></a>

### CircleCIに環境変数を登録

CircleCIでaccessトークンを読み込めるように環境変数に設定します。
[BUILD SETTINGS] -> [Environment Variables] -> [Add Variable]でGITHUB_ACCESS_TOKENをキーにして登録します。

<a href="https://gyazo.com/9a8cd90ac2173966cd583524b763b04b"><img src="https://i.gyazo.com/9a8cd90ac2173966cd583524b763b04b.png" alt="https://gyazo.com/9a8cd90ac2173966cd583524b763b04b" width="400"/></a>

### CircleCIのconfig.ymlを設定

あとは実際にCircleCIが実行されるように`config.yml`を設定するだけです。

#### CircleCI1.0

```yaml
deployment:
  code_correction:
    branch: develop
    commands:
      - bundle update
      - pr-daikou
```

#### CircleCI2.0

```yaml
version: 2

jobs:
  build:
    docker:
      - image: circleci/ruby:2.5
    steps:
      - checkout
      - run: bundle update
      - run: pr-daikou
```

## CI実行結果

ここまでの設定が完了したらCircleCIでの実行結果から、Pull requestが自動作成されるようになります。

CircleCIの実行画面
<a href="https://gyazo.com/bce1ece26eded264da6f4e44b75f2d93"><img src="https://i.gyazo.com/bce1ece26eded264da6f4e44b75f2d93.png" alt="https://gyazo.com/bce1ece26eded264da6f4e44b75f2d93" width="400"/></a>

作成されたPull request
<a href="https://gyazo.com/4a98ef7d16baf70dc31b45bf513f6967"><img src="https://i.gyazo.com/4a98ef7d16baf70dc31b45bf513f6967.png" alt="https://gyazo.com/4a98ef7d16baf70dc31b45bf513f6967" width="400"/></a>

## 応用例

Pull requestするときの項目を任意に設定できます。

- `git config`に設定するuser設定
- Pull requestのタイトル
- コミットメッセージ
- Pull requestのターゲットブランチ
- 作成するブランチ名
- Pull requestのdescriptionにターゲットブランチのPull request URLを追記

### コマンドリファレンス

```shell
$ pr-daikou --help
Usage: pr-daikou [options]
        --email EMAIL                git committed user email, default: pr_daikou@example.com
        --name NAME                  git committed user name, default: pr_daikou
    -T, --title TITLE                pull request title, default: PR daikou [at Mon Jan 1 12:34:56 UTC 2017]
    -m, --commit MESSAGE             add git commit message, default: :robot: PR daikou
    -b, --base BRANCH                pull request base branch, default: master
    -t, --topic BRANCH               create new branch, default: ci/pr-daikou_[20170101123456.000]
    -u, --pullrequest URL            add new pull request description, default: nil
```

## その他

姉妹gemに`rubocop --auto-correct`に特化した[rubocop-automata](https://rubygems.org/gems/rubocop-automata)を公開しています。