CarthageやCocoaPodsの最新バージョン情報をSlackへ通知するfastlaneプラグインを作成しました

　二番煎じ、もしくは車輪の再発明かも知れないですが、自分の（狭い）観測範囲で見当たらなかったのと、ちょっとしたツール作成にちょうど良さそうな規模感だったので作ってみました。

* [RubyGems](https://rubygems.org/gems/fastlane-plugin-dependency_manager_outdated)
* [GitHub](https://github.com/matsuda/fastlane-plugin-dependency_manager_outdated)

　機能としては`CocoaPods`や`Carthage`でインストールしているライブラリの最新バージョンのリリース状況を取得して、必要なら結果を`Slack`へ通知するものです。

　プロジェクトで利用しているライブラリのアップデートはリグレッションテスト（回帰テスト）が必要となったりとなかなか腰が重い作業ですが、とりあえず新しいバージョンがリリースされていることだけでも気付けるようにして、多少プレッシャーを与えられるような状況を作れればいいかなと思いました。
　`Jenkins`などのCIツールに設定して定期的に`Slack`へ通知するだけでもいいかなと、そんなゆるふわな使い方を想定しています。

　また、実行した最新バージョンの結果を出力変数にセットしているので、他のアクションで利用することも可能です。
　例えば[こちらの記事](https://tech.speee.jp/entry/2016/12/01/100253)のように、`GitHub`のissueやPRを作るCIフローでも利用できるかなと思います。

　`cocoapods_outdated`アクションの方は`lane_context[SharedValues::COCOAPODS_OUTDATED_LIST]`に

```
[{:name=>"SDWebImage", :current=>"4.4.5", :available=>"4.4.6", :latest=>"5.0.0-beta6"}, {:name=>"SVProgressHUD", :current=>"2.2.4", :available=>"2.2.4", :latest=>"2.2.5"}]
```

この様な感じで値がセットされており、`carthage_outdated`アクションの方にも`lane_context[SharedValues::CARTHAGE_OUTDATED_LIST]`にこれと同じ構造で値がセットされています。

### 注意点

　現状はまだ作成したばかりであるのと、他のソースコードを調べながら実装していて、利用できそうなロジックを~~パクって~~**参考にした**部分も多く、実際に挙動を確認できていない箇所が多いです。特に`Slack`のオプション周り。
　
### Actions

* `cocoapods_outdated`

    `CocoaPods`の最新バージョンのリリース状況を取得して、必要なら`Slack`へ通知する。
    内部的には`pod outdated`を実行しているだけ。

* `carthage_outdated`

    `Carthage`の最新バージョンのリリース状況を取得して、必要なら`Slack`へ通知
    内部的には`carthage outdated`を実行しているだけ。

* `dependency_manager_outdated`

    上記2つを実行

### Slackへの通知

![fastlane-plugin-dependency_manager_outdated.png](https://qiita-image-store.s3.amazonaws.com/0/1057/42e6beee-c5fa-a5a6-70e0-5ad72203a89f.png)

### インストール

```
$ fastlane add_plugin dependency_manager_outdated
```

### アクションの実行

```
$ bundle exec fastlane run cocoapods_outdated
$ bundle exec fastlane run carthage_outdated
```

### Fastlaneへの組み込み

```
lane :test_cocoapods do |options|
  cocoapods_outdated(
    no_repo_update: true,
    slack_url: "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX",
  )
end
```

```
lane :test_carthage do |options|
  carthage_outdated(
    project_directory: "path/to/xcode/project",
  )
end
```

### プラグインのヘルプ

```
+-----------------------------------------+---------+------------------------------+
|                                   Used plugins                                   |
+-----------------------------------------+---------+------------------------------+
| Plugin                                  | Version | Action                       |
+-----------------------------------------+---------+------------------------------+
| fastlane-plugin-dependency_manager_out  | 0.2.1   | cocoapods_outdated           |
| dated                                   |         | dependency_manager_outdated  |
|                                         |         | carthage_outdated            |
+-----------------------------------------+---------+------------------------------+

+-----------------------------------------+-----------------------------------------+------------------+
|                                      Available fastlane actions                                      |
+-----------------------------------------+-----------------------------------------+------------------+
| Action                                  | Description                             | Author           |
+-----------------------------------------+-----------------------------------------+------------------+
|                                            ...                                                       |
| carthage_outdated                       | Check outdated Carthage dependencies    | matsuda          |
|                                            ...                                                       |
| cocoapods_outdated                      | Check outdated CocoaPods dependencies   | matsuda          |
|                                            ...                                                       |
+-----------------------------------------+-----------------------------------------+------------------+

```

### `cocoapods_outdated`アクション

```
$ bundle exec fastlane action cocoapods_outdated

############################ 省略 ##############################

+-------------------+------------------------------+------------------------------+------------------------------+
|                                           cocoapods_outdated Options                                           |
+-------------------+------------------------------+------------------------------+------------------------------+
| Key               | Description                  | Env Var                      | Default                      |
+-------------------+------------------------------+------------------------------+------------------------------+
| project_directory | The path to the root of the  | DEPENDENCY_MANAGER_PROJECT_  |                              |
|                   | project directory            | DIRECTORY                    |                              |
| use_bundle_exec   | Use bundle exec when there   | DEPENDENCY_MANAGER_COCOAPOD  | true                         |
|                   | is a Gemfile presented       | S_USE_BUNDLE_EXEC            |                              |
| no_repo_update    | Skip running `pod repo       | COCOAPODS_OUTDATED_REPO_UPD  |                              |
|                   | update` before install       | ATE                          |                              |
| slack_url         | Create an Incoming WebHook   | DEPENDENCY_MANAGER_SLACK_UR  |                              |
|                   | for your Slack group to      | L                            |                              |
|                   | post results there           |                              |                              |
| slack_channel     | #channel or @username        | DEPENDENCY_MANAGER_SLACK_CH  |                              |
|                   |                              | ANNEL                        |                              |
| slack_username    | Overrides the webhook's      | DEPENDENCY_MANAGER_SLACK_US  | fastlane                     |
|                   | username property if         | ERNAME                       |                              |
|                   | slack_use_webhook_configure  |                              |                              |
|                   | d_username_and_icon is       |                              |                              |
|                   | false                        |                              |                              |
| slack_icon_url    | Overrides the webhook's      | DEPENDENCY_MANAGER_SLACK_IC  | https://s3-eu-west-1.amazon  |
|                   | image property if            | ON_URL                       | aws.com/fastlane.tools/fast  |
|                   | slack_use_webhook_configure  |                              | lane.png                     |
|                   | d_username_and_icon is       |                              |                              |
|                   | false                        |                              |                              |
| skip_slack        | Don't publish to slack,      | DEPENDENCY_MANAGER_SKIP_SLA  | false                        |
|                   | even when an URL is given    | CK                           |                              |
+-------------------+------------------------------+------------------------------+------------------------------+
* = default value is dependent on the user's system

+-------------------------+-------------------------------------------------------+
|                       cocoapods_outdated Output Variables                       |
+-------------------------+-------------------------------------------------------+
| Key                     | Description                                           |
+-------------------------+-------------------------------------------------------+
| COCOAPODS_OUTDATED_LIST | List of the outdated pods in the current Podfile.lock |
+-------------------------+-------------------------------------------------------+

############################ 省略 ##############################

```

### `carthage_outdated`アクション

```
$ bundle exec fastlane action carthage_outdated

############################ 省略 ##############################

+-------------------+------------------------------+------------------------------+------------------------------+
|                                           carthage_outdated Options                                            |
+-------------------+------------------------------+------------------------------+------------------------------+
| Key               | Description                  | Env Var                      | Default                      |
+-------------------+------------------------------+------------------------------+------------------------------+
| project_directory | The path to the root of the  | DEPENDENCY_MANAGER_PROJECT_  |                              |
|                   | project directory            | DIRECTORY                    |                              |
| use_ssh           | Use SSH for downloading      | DEPENDENCY_MANAGER_CARTHAGE  |                              |
|                   | GitHub repositories          | _USE_SSH                     |                              |
| slack_url         | Create an Incoming WebHook   | DEPENDENCY_MANAGER_SLACK_UR  |                              |
|                   | for your Slack group to      | L                            |                              |
|                   | post results there           |                              |                              |
| slack_channel     | #channel or @username        | DEPENDENCY_MANAGER_SLACK_CH  |                              |
|                   |                              | ANNEL                        |                              |
| slack_username    | Overrides the webhook's      | DEPENDENCY_MANAGER_SLACK_US  | fastlane                     |
|                   | username property if         | ERNAME                       |                              |
|                   | slack_use_webhook_configure  |                              |                              |
|                   | d_username_and_icon is       |                              |                              |
|                   | false                        |                              |                              |
| slack_icon_url    | Overrides the webhook's      | DEPENDENCY_MANAGER_SLACK_IC  | https://s3-eu-west-1.amazon  |
|                   | image property if            | ON_URL                       | aws.com/fastlane.tools/fast  |
|                   | slack_use_webhook_configure  |                              | lane.png                     |
|                   | d_username_and_icon is       |                              |                              |
|                   | false                        |                              |                              |
| skip_slack        | Don't publish to slack,      | DEPENDENCY_MANAGER_SKIP_SLA  | false                        |
|                   | even when an URL is given    | CK                           |                              |
+-------------------+------------------------------+------------------------------+------------------------------+
* = default value is dependent on the user's system

+--------------------------+-------------------------------------------------------+
|                        carthage_outdated Output Variables                        |
+--------------------------+-------------------------------------------------------+
| Key                      | Description                                           |
+--------------------------+-------------------------------------------------------+
| CARTHAGE_OUTDATED_LIST   | List of the outdated dependencies in the current      |
|                          | Cartfile.resolved                                     |
| CARTHAGE_REPOSITORY_LIST | List of dependencies in the current Cartfile.resolved |
+--------------------------+-------------------------------------------------------+

############################ 省略 ##############################

```

### `dependency_manager_outdated`

省略