bekkou68 の日記

Gogengo! や IT 技術など。

shenzhen で TestFlight へのアップロードを自動化する

はじめに

TestFlight はアプリを配布するのにとても便利な Webサービスです。ただ、その配布するまでのプロセスを愚直にやろうとすると少し面倒な手順を踏みます。
具体的には XCode で Archive して、Organizer で Provisioning Profile を指定して IPA を書き出して、その IPAドラッグアンドドロップで Webページからアップロードして、アップロード後にだれに配るかをチェックして Notify で完了です。
この手順を自動化して、もっと気軽にアップロードできるようにしよう。というのがこのエントリの趣旨です。

さあはじめよう

それにあたって shenzhen という gem を使います。

$ gem install multipart-post -v 1.2.0 # see: https://github.com/nomad/shenzhen/issues/93
$ gem install shenzhen
$ rbenv rehash

すると ipa コマンドが追加されます。これで準備完了です。

セキュアにスクリプト化しよう

以下のようにコマンドを直に書くのは、毎回指定するのも面倒ですし、アクセストークンが shell の history に残ってしまう恐れがあります。

$ ipa distribute:testflight -a 8329... -T 3821... --notify -l myteam

そこでシェルスクリプトを書きます。トークンなどの管理には pit を使います。

$ gem install pit
$ rbenv rehash
$ pit set projects # 前提: $EDITOR に vim など指定されていること

$EDITOR で以下のように編集します。複数のプロジェクトを扱う前提で、今回のプロジェクト名は myproject とします。

---
myproject:
  api_token: 8329...
  team_token: 3821...
  distribution_lists: myteam

API Token は Account Settings、Team Token は Team Info、Distribution Lists は People > Add Distribution LIst でつくった Distribution List の名前(複数指定できるらしいですが試していません)をそれぞれ指定してください。

$EDITOR を閉じると ~/.pit に yaml で保存されます。

スクリプト testflight_uploader.rb を以下のように書きます。各 iOS プロジェクトのトップに配置します。

require 'pit'

project_name = 'myproject'
settings = Pit.get('projects')[project_name]

build_command = 'ipa build -c Debug'
distribute_command = "ipa distribute:testflight -a #{settings['app_token']} -T #{settings['team_token']} --notify -l #{settings['distribution_lists']}"
clean_command = "rm #{project_name}.ipa #{project_name}.app.dSYM.zip"

system [build_command, distribute_command, clean_command].join(' && ')

実行!

$ ruby testflight_uploader.rb
     xcodebuild  myproject.xcworkspace
          xcrun  PackageApplication
            zip  /Users/bekkou/projects/myproject/myproject.app.dSYM
/Users/bekkou/projects/myproject/myproject.ipa successfully built
... (editor will be shown) ...
Build successfully uploaded to TestFlight

途中でエディタが立ち上がるので release note を書いてください。Vim で開いた場合は、release note を書いたら :wq することで distribution の続きが行われます。複数行を書いても反映されます。

コマンドの実行が終わったら Manage Your Apps を見に行きましょう。期待するユーザに配布され、メールも届いていれば成功です!

おまけ

help を見ると沢山のオプションがあるのでシェルスクリプトを色々とカスタマイズして楽しめそうです。

$ ipa distribute --help

  distribute:testflight

  Usage: ipa distribute:testflight [options]

  

  Options:
    -f, --file FILE      .ipa file for the build 
    -d, --dsym FILE      zipped .dsym package for the build 
    -a, --api_token TOKEN API Token. Available at https://testflightapp.com/account/#api-token 
    -T, --team_token TOKEN Team Token. Available at https://testflightapp.com/dashboard/team/edit/ 
    -m, --notes NOTES    Release notes for the build 
    -l, --lists LISTS    Comma separated distribution list names which will receive access to the build 
    --notify             Notify permitted teammates to install the build 
    --replace            Replace binary for an existing build if one is found with the same name/bundle version

謝辞

自動化にあたって @kei_q さんにお力添えをいただきました。ありがとうございます。

おわりに

快適な TestFlight 生活をお送りください!

後日談(2014年02月15日 追記)

このエントリを書く前に TestFlight のデスクトップアプリを試しました。その時はアプリをアーカイブした時にくるはずの通知がきませんでした。そこでひとまず shenzhen で自動化してこのエントリを書きました。
書いたあとに、通知がこない原因がわかりました。XCode のファイル名を XCode5.app のように変更していたためのようです。XCode.app という通常のファイル名にしたら動きました。いまはそちらのデスクトップアプリをつかっています。とても便利です!