sighで取得したProvisioning Profileをgymで使う

# 環境

* fastlane 1.17.1
* Xcode 8.2.1
* mac OS 10.12.3
* 組織の署名ID管理の仕方の都合で [match](https://github.com/fastlane/fastlane/tree/master/match) は使っていない

# 前提

署名などは変更せず、Provisioning Profileのみ、新しいものを自動的に取得して使いたいものとします。
また、Provisioning Profile更新前はすでにビルドが通っているものとします。

# 問題

[sigh](https://github.com/fastlane/fastlane/tree/master/sigh) を使ったりしているとカジュアルに Provisioning Profile が更新されたりします。


いちいちXcodeの設定画面を開いてダウンロードしなくても済むのは助かるのですが、
Provisioning Profileの名前にタイムスタンプが入ってしまうので、CIで sigh を使うと予期しないタイミングでProvisioning Profileの名前が変更されてビルドがコケてしまいます。

```
// こんな名前のPPができあがる
net.kikuchy.hogeapp AdHock 14578645
```


# sighで取得したProvisioning Profileを使う

レーンは以下のように作ってあります。

```ruby
lane :beta do
    cert
    sigh(force: false, adhoc: true)
    gym(scheme: "HogeApp", export_method: "ad-hoc")
    deploygate(user: "kikuchy")
end
```

[sigh](https://github.com/fastlane/fastlane/tree/master/sigh) をfastlaneのActionとして実行すると、有効なProvisioning Profileをダウンロード & インストールしてくれます。
そして [gym](https://github.com/fastlane/fastlane/tree/master/gym) を使うといい感じにビルドをしてくれます。
が、sigh が取得してきたProvisioning Profileを使ってくれるわけではありません。

## sigh実行後にcontextに残るもの

fastlaneのActionの中には、 `lane_context` としていくつかの情報を以降のActionに渡してくれるものがあります。

sighもいくつかのcontextを残してくれるので、それを使うことにします。

今回使うのは以下の２つです。

| 変数名 | 内容 |
|:------|:-----|
| `SIGH_PROFILE_PATH` | sighがダウンロードしたProvisioning Profileのファイルパス |
| `SIGH_UUID`, `SIGH_UDID` | sighがダウンロードしたProvisioning ProfileのUUID |


## project.pbxの設定項目を引数から指定する

[`xcodebuild` の説明](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html) によると、引数から設定項目の上書きができるようです。

```
xcodebuild ...(中略)... [buildsetting=value] ...
```

gym は [`xcargs` というオプションに `xcodebuild` で使う追加の引数を渡せる](https://github.com/fastlane/fastlane/blob/master/gym/lib/gym/options.rb#L196) ようなので、 sigh がcontextに残した情報を使って必要な引数を組み立てます。

上書きする必要がある項目は以下のとおりです。

| 設定項目 | 内容 |
|:--------|:-----|
| `PROVISIONING_PROFILE` | 使用したいProvisioning ProfileのUUID |
| `PROVISIONING_PROFILE_SPECIFIER` | 使用したいProvisioning Profileの名前 |


## 引数を作る

[`lane_context` はFastfile内でも引ける](https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Advanced.md#lane-context) ので早速使います。

またFastfile内では [FastlaneCore](https://github.com/fastlane/fastlane/tree/master/fastlane_core) も使用可能なので、 [`FastlaneCore::ProvisioningProfile`](https://github.com/fastlane/fastlane/blob/master/fastlane_core/lib/fastlane_core/provisioning_profile.rb) を使ってProvisioning Profileの名前を取り出せば良さそうです。

```ruby
    sigh(force: false, adhoc: true)

    # 取得したProvisioningProfileを使用する
    xcodebuild_args = {
      PROVISIONING_PROFILE: lane_context[SharedValues::SIGH_UDID],
      PROVISIONING_PROFILE_SPECIFIER: FastlaneCore::ProvisioningProfile.parse(lane_context[SharedValues::SIGH_PROFILE_PATH])["Name"],
    }
    xcodebuild_args = xcodebuild_args.map do |k,v|
      "#{k.to_s.shellescape}=#{v.shellescape}"
    end.join ' '

    gym(scheme: "HogeApp", export_method: "ad-hoc", xcargs: xcodebuild_args)
```


無事に sigh がダウンロードしたProvisioning Profileを使ってビルドできるようになりました！ ＼\ ٩( 'ω' )و /／


# 参考

* [fastlane、Crashlyticsを使ったiOSアプリのリリースプロセス自動化に挑む - OTOBANK Engineering Blog](http://engineering.otobank.co.jp/entry/ios-deploy-use-fastlane-crashlytics)
* [Specify provisioning profile in Xcode 8 with gym](https://github.com/fastlane/fastlane/issues/6118#issuecomment-255638852)