shenzhenのipaよりビルド時間が3割速いというfastlane/gymがリリースされたので導入したら、ビルド時間が4分も短縮した


イケメンで有名な[fastlane](https://github.com/KrauseFx/fastlane)作者の[KrauseFx](https://twitter.com/krausefx)さんが、最近[gym](https://github.com/fastlane/gym)というfastlaneツール群の新作ビルドツールを作っている模様で注目していましたが、昨夜ファーストリリースされました。

- [Release 0.1.0 Initial Release · fastlane/gym](https://github.com/fastlane/gym/releases/tag/0.1.0)
- [Release 1.16.0 Added gym · KrauseFx/fastlane](https://github.com/KrauseFx/fastlane/releases/tag/1.16.0)

<blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">Announcing ‘gym’: Building your iOS apps has never been easier 💪 <a href="https://t.co/9uCnusbUX0">https://t.co/9uCnusbUX0</a> <a href="http://t.co/M9xIsjd3yg">pic.twitter.com/M9xIsjd3yg</a></p>&mdash; Felix Krause (@KrauseFx) <a href="https://twitter.com/KrauseFx/status/631179113814999040">August 11, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


同時に更新された、gym含むビルドツールのあり方についても言及したブログ記事もとても良い内容でした:
[Thoughts on iOS build tools — Felix Krause](https://krausefx.com/blog/ios-tools)

# gymの良いところ

https://github.com/fastlane/gym#why-gym に列挙されていますが、一部抜粋します。

## ビルドが速い

> gym builds 30% faster than other build tools like shenzhen

この恩恵が大きいと思って、早々と導入しました。


というより、[nomad/shenzhen](https://github.com/nomad/shenzhen)が遅いと言った方がよいかもしれません。
多分、gymはXcodeのArchive機能と同じ速さです。
shenzhenのipaコマンドは、XcodeのArchiveコマンドや`xcodebuild`とちょっと違うことをやってそうで(ソース未確認)で、プラスαの時間がかかっていることにこれまで気付いていました。

また、[今開発中のPlayer!](https://itunes.apple.com/jp/app/player!-minnadetsukurusupotsunyusu/id897872395)では、テストターゲットもリリースビルドが走ってしまい、かつそれがSwiftのコンパイラーと相性が良くないのかビルドエラーになってしまっていて少し困っていました。
テストターゲットをRunのターゲットから外したスキームを、fastlaneビルド用に別途用意することで凌いでいました。

![Screen Shot 2015-08-12 at 13.15.39.png](https://qiita-image-store.s3.amazonaws.com/0/19398/74b0907c-e94a-7db7-f5c0-f79fdd759108.png "Screen Shot 2015-08-12 at 13.15.39.png")


Archiveのテストターゲットは未チェック・Runのテストターゲットはチェック状態が通常です。
ipaコマンドはArchive機能なので、Archiveの設定に従うべきだと思うのですが…。
(見つかられていないですが、[Issue](https://github.com/nomad/shenzhen/issues)に上がっているかもしれません)

## ログの出力がキレイでコンパクト

> Beautiful inline build output

[Thoughts on iOS build tools — Felix Krause](https://krausefx.com/blog/ios-tools)でも言及されていて、拘りを感じますし、実際にキレイで分かりやすくて関心しました(　´･‿･｀)さすがイケメン。

[supermarin/xcpretty](https://github.com/supermarin/xcpretty)など別途使わなくても、こんなにコンパクトにキレイに出力してくれます(fastlaneのレポートも混ざっています)。


![Screen Shot 2015-08-12 at 13.21.49.png](https://qiita-image-store.s3.amazonaws.com/0/19398/8b54972c-58b8-2f81-c663-ebdb6e4f3c10.png "Screen Shot 2015-08-12 at 13.21.49.png")

最後、6分かかったと書いてありますが、これまでは10分かかっていました。

1つ残念なのは、Configurationを指定しても、`Building Application`の表に出ないことです。
その下の`xcodebuild`コマンドの指定には入っているので効いてはいますので成果物としては問題ないはずです。
Pull Request頑張ろうか迷いつつ、とりあえずIssueだけ立てておきました。
https://github.com/fastlane/gym/issues/5
**→ 次の版(0.2.0)で表にも出るようになりました。**

ここに書いた以外もメリット・機能などあるので、是非深掘りしてみて下さい。


# 導入方法

https://github.com/fastlane/gym#usage に書いてある通り、`gym`コマンドと必要に応じていくつかオプションを指定するだけです。
インターフェースがshenzhenのipaとほぼ一緒なので、移行も楽です。

僕は、以下のように`Fastfile`に記述していた`ipa`を`gym`に変えただけで一発で動きました。


```ruby
ipa(
  workspace: WORKSPACE,
  scheme: SCHEME,
  configuration: "AdHoc"
)
```

↓

```ruby
gym(
  workspace: WORKSPACE,
  scheme: SCHEME,
  configuration: "AdHoc"
)
```

というわけで、特にこれまでshenzhenのipaコマンドを使っていた人は対応一瞬なので、 **`gym`かなりオススメです！**


# 後で気付いた問題点(追記)

**全て解決済みです**

- https://github.com/KrauseFx/fastlane/releases/tag/1.17.0
- https://github.com/fastlane/gym/releases/tag/0.2.0

## `gym`の後に`deliver`コマンドを実行すると、エラーが発生

`deliver`は、iTuensConnectにipaファイルをアップロードするのに使っていて、通常のPull Requestの自動ビルドの時には走らせていないものなので、発見が遅れました。
Issue上げたので、詳しくはこちらです。(解決はしたが、これが良い方法なのか質問中)
https://github.com/fastlane/gym/issues/6

## `gym`でビルド後に`deliver`でiTunesConnectへアップロードしたら怒られた

つらいです。
[Issueは立てた](https://github.com/fastlane/gym/issues/13)ので、iTunesConnect用のlaneはとりあえず`ipa`に戻して様子見しようかな（´・ω・｀）
ただ、ビルド速いことなどは嬉しいので解決したら、めげずにまた復活させたいです。


```
Dear developer,

We have discovered one or more issues with your recent delivery for "Player! - Your Best Sport Feed, Your New Sport Life". To process your delivery, the following issues must be corrected:

Invalid Swift Support - The bundle contains an invalid implementation of Swift. The app may have been built or signed with non-compliant or pre-release tools. Visit developer.apple.com for more information.

Once these issues have been corrected, you can then redeliver the corrected binary.

Regards,

The App Store team
```



他にもIssue一覧は、 https://github.com/fastlane/gym/issues に上がっていますので、ざっと見OKと感じたら導入が良いと思いますヽ(・ω・｀）