yarn.lockを自動更新してくれるPull Request Bot “Itomaki”

# 一般公開は 2018/5/15 で終了します。

[Yarn](https://yarnpkg.com/)って便利ですよね。インストールスピードは速いし、Lockファイルがあるのでどの環境でも同じパッケージをインストールできます。
私も毎日何かしらの `yarn` コマンドを叩いてます。

しかし、一つだけ困ったことがありました。
npmパッケージは毎日すごい勢いで更新されるので、`yarn.lock` の更新は結構メンドくさい作業です。
できるだけ毎日更新しないと、差分が大きくなって更新がさらにメンドくさくなります :pensive: 。
（長期間更新しないとさらに悲惨です :fearful: ）

そんなメンドくさい作業を少しでも和らげようと、会社のエンジニアチームで “Itomaki（いとまき）”というサービスを作りました。

https://itomaki.io/

![Itomaki Screenshot](https://qiita-image-store.s3.amazonaws.com/0/104952/789e5749-d3ca-4e7e-f387-d8a2d6a849e9.png)

# “Itomaki”とは

簡単に言うと、`yarn upgrade` コマンドで更新される `yarn.lock` ファイルをコミットして、Pull Request を投げてくれるサービスです。

[deppbot](https://www.deppbot.com/) という似たようなサービスから、アイデアを得ました（deppbot は `Gemfile.lock` を自動更新してくれるサービスです）。

また、Itomaki と似たようなサービスに [Greenkeeper](https://greenkeeper.io/)があります。元々は Greenkeeper を使っていたのですが、yarn に対応していなかったので自作しました。

Greenkeeper も[最近 yarn に対応した](https://github.com/greenkeeperio/greenkeeper/issues/314)ようですが、Itomaki は `package.json` は更新せず、`yarn.lock` のみを更新するという違いがあります。
これは「`package.json` にあるパッケージのバージョンは自分で管理する」という考え方に基づいています。

例えば、過去に `webpack@2.2.2` をインストールして使っているとします。`package.json` と `yarn.lock` ファイルは次のようになっているはずです。

```json:package.json
{
  "devDependencies": {
    "webpack": "^2.2.0"
  }
}
```

```yarn.lock
webpack@^2.2.0:
  version "2.2.0"
  resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.2.0.tgz#09246336b5581c9002353f75bcadb598a648f977"
```

この場合、Itomaki は `yarn.lock` のみを更新します。

```diff:yarn.lock
webpack@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.2.0.tgz#09246336b5581c9002353f75bcadb598a648f977"
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.6.1.tgz#2e0457f0abb1ac5df3ab106c69c672f236785f07"
```

`wepback@3` にアップグレードしたい場合は、自分で `package.json` を更新します。

```diff:package.json
{
  "devDependencies": {
-   "webpack": "^2.2.0"
+   "webpack": "^3.0.0"
  }
}
```

Itomaki は次のように更新してくれます。

```diff:yarn.lock
- webpack@^2.2.0:
-   version "2.2.0"
-   resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.2.0.tgz#09246336b5581c9002353f75bcadb598a648f977"
+ webpack@^3.0.0:
+   version "3.0.0"
+   resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.0.0.tgz#ee9bcebf21247f7153cb410168cab45e3a59d4d7"
```

## Tips

個人的には、次のような設定をよく使っています。Travis などのCIでテストを自動化していることが前提です。
こうすれば、本番で使うパッケージは自動でメジャーアップグレードせず、開発で使うパッケージは更新があれば随時更新されます。

```json:package.json
{
  "dependencies": {
    "react": "^15.5.4"
  },
  "devDependencies": {
    "mocha": "*"
  }
}
```

# 使い方

[Itomaki のトップページ](https://itomaki.io/)から GitHub アカウントでログインします。

ログイン後、ダッシュボードでサービスを受けたいリポジトリを選択します。
（`package.json`, `yarn.lock` ファイルが存在するリポジトリを選択してください）

数分後、Itomaki から選択したリポジトリに Pull Request が投げられます。

定期的には、2日に1回のペースで Pull Request が投げられます。
（すでに Itomaki の Pull Request がある場合は、投げられません）

# 実例

会社で使っている公開 npm パッケージ [eslint-config-interfirm](https://github.com/interfirm/eslint-config-interfirm) での使用例です。

https://github.com/interfirm/eslint-config-interfirm/pull/61

![Itomaki Pull Request](https://qiita-image-store.s3.amazonaws.com/0/104952/a5412d6f-616e-53a2-ecfa-2939ad22ff1c.png)

このパッケージの他にも、会社のリポジトリ（private もあり）や個人の趣味プロジェクトでガンガン使用しています。

興味があれば、ぜひ使ってみてください！ :smile: :pray: