BitriseのWorkflowをSlackから起動してiOSのデバイス登録をしよう!

# TL;DR
- Slackのslash commandの使い方が(なんとなく)わかるよ
- BitriseのWorkflowをSlackから起動する方法が(なんとなく)わかるよ
- fastlaneでデバイス登録する方法が(なんとなく)わかるよ
- fastlaneで証明書更新する方法が(なんとなく)わかるよ

# 前提
- Bitriseの使い方がある程度わかる
- fastlaneの使い方がある程度わかって, matchで証明書を管理している
    - matchでの証明書管理をしてない場合はこれを機会に[こちら](https://medium.com/voicy-engineering/%E5%A4%9C%E3%81%AF%E7%9F%AD%E3%81%97%E8%B5%B0%E3%82%8C%E3%82%88ci-ios%E3%82%A2%E3%83%97%E3%83%AA%E8%87%AA%E5%8B%95%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9-%E8%A8%BC%E6%98%8E%E6%9B%B8%E7%B7%A8-8c37192a7cf8)を参考に構築してみるのも良いかもしれません.

# 手順
1. fastlaneにデバイス登録, 証明書更新をするlaneを作る
2. Bitriseにデバイス登録, 証明書更新するWorkflowを作る
3. BitriseからWebhook URLを取得する
4. Slackのslash commandを登録する

# まずはlaneを作ろう

Fastfileに下記の様な内容を登録

```ruby:Fastfile

# このlaneをBitriseから起動
lane :add_device_and_update_certificates do
  add_device(
    name: ENV["DEVICE_NAME"], # Slackから環境変数で指定
    udid: ENV["UDID"] # Slackから環境変数で指定
  )
  update_certificates
end

# デバイス登録をする
lane :add_device do |options|
  if options[:name] && options[:udid]
    # こちら参照->https://docs.fastlane.tools/actions/register_devices/
    register_devices(
      devices: {
        options[:name] => options[:udid]
      }
    )
  else
    UI.error "Usage: fastlane add_device name:'New device name' udid:'UDID'"
  end
end

# 証明証を更新する
lane :update_certificates do
  # こちら参照->https://docs.fastlane.tools/actions/match/
  match(
    type: "development",
    app_identifier: "tihimsm.app",
    force_for_new_devices: true, # デバイスが追加されていた場合証明書を更新する
    readonly: false
  )
end
```
一つのlaneにregister_devicesとかmatchとか直接書いてもいいんだけど, 一応単品で使える様にlane分けてます.

# BitriseにWorkflowを設定しよう
↓みたいな感じでfastlane使えるWorkflowを作ります
<img width="350" alt="スクリーンショット 2019-07-11 15.18.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142392/517c4858-c8b7-42b6-a956-42f9886414f5.png">
そして↓のようにlane名(add_device_and_update_certificates)を指定します
![スクリーンショット 2019-07-11 15.20.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142392/2544bd88-9d45-7f25-4031-d3844d132c5b.png)

fastlaneもBitriseも適宜公式ドキュメント見て確認してくださいね.

# BitriseからWebhook URLを取得しよう
codeタブのINCOMING WEBHOOKSのブロックからURLを取得します.
SETUP MANUALYを選択し, プルダウンからSlackを選択して, 表示されたURLをコピーしときます.
<img width="693" alt="スクリーンショット 2019-07-11 15.23.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142392/132c94b2-1828-9541-722b-a5fa27912114.png">

# Slack commandを作ろう
SlackのサイドバーのAppsにある「＋ボタン」をクリックします.
Appsの中から「Slash Commands」を選択しましょう.
<img width="457" alt="スクリーンショット 2019-07-11 15.28.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142392/05fc8b48-33d7-0de2-1b2d-ba9f8b7a78fb.png">
「Add Configuration」から進み, 適当なコマンド名をつけちゃいます.
<img width="677" alt="スクリーンショット 2019-07-11 15.30.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142392/2a5ba61e-6026-6c41-7b09-e63a2986a2a9.png">
Slash Commandを作成すると↓のような画面が表示されるので, URL覧に先ほどBitriseから取得したURLを入力しましょう.
<img width="695" alt="スクリーンショット 2019-07-11 15.31.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142392/a0a3c8ac-6e02-5449-eca1-03cd134d2e9d.png">
あとはアイコンの設定や, コマンドのヒントなどは任意で設定してください.

# あとはSlackでコマンドを叩きましょう
こんな感じの長ったらしいコマンドをSlackで入力します.
`/test_command workflow: add_device_and_update_certificates|b: develop|ENV[DEVICE_NAME]: デバイス名|ENV[UDID]: UDID`

- workflow: BitriseのWorkflow名
- b: githubのブランチ名
- ENV[DEVICE_NAME]: デバイス名が入ってfastlaneに渡されます
- ENV[UDID]: UDIDが入ってfastlaneに渡されます

詳しくは[公式ドキュメント](https://devcenter.bitrise.io/jp/webhooks/adding-a-slack-webhook/)をご覧ください.

# まとめ
いかがでしたでしょうか?
デバイス登録&証明書更新はiOS開発の面倒な作業の一つですが, コマンド一つで簡単にできるようになります.

複数証明書を更新したい場合などは`update_certificates`の中でループさせるなどすれば, 一気に複数証明書を更新も可能です.

もっと良い方法知ってる方たくさんいると思うので, CI周りの特殊な訓練を受けている方々のご意見お待ちしております.