これでできる!iOSアプリ DeployGate配信自動化までの13ステップ

どうも、ギルドワークス 前川です。

さて、みなさーん、継続的インテグレーション(以下CI)してますかー!

さて、以前お伝えしたように、ギルドワークスでは、iOSの開発においても積極的なCIを行っています。

これは、特にリモート開発が多い環境では、正しいものを正しくつくる ために常に安定したベースラインで確認できる環境を作ることが、非常に重要だからです。

とはいえ、なかなかiOSの自動ビルドには越えなければ行けないハードルが多かったりします。 今回は、ある一つのiOSプロジェクトを作成してから、誰でも実機上で確認できるようになるまで(技術ベースで言うと、DeployGateを用いてAdhoc配信するまで)を、ざっと紹介したいと思います。

1. iOSアプリケーションを作成し、iOSアプリケーションをGithubにPushする

まずは、大前提ですね。作成しているアプリケーションを、GithubにPushします。

2. CircleCIにて、ビルドの設定を行う

続いて、CircleCIにて、該当プロジェクトをビルドするように設定します。 この辺りは、公式ドキュメントを参照してくださいませ。

CircleCIはGithub認証が必須ですが、Githubを利用している限りは、特に迷うことはないかと思います。

こんな感じで、選べるはずです。

ead596c5-51ef-49df-a973-edaeae6229b0

3. CircleCIにて、Experimental OptionのiOS Buildを有効にし、チャットにて、制限回避をお願いする

さて、そうするとCircleCIでは勝手にビルドが始まるのですが、このようになります。

da7b9d58-10a9-44df-8dd2-14c564569010

残念ながら、警告が出て、失敗・・・というかビルドが行われません。 これは、CircleCIはiOSに関してはまだExperimental(実験的)な機能という扱いであり、設定をしてやらないといけないからです。

というわけで、Project Settingから、iOSビルドをONにします。

a5ed097f-6dbf-48a4-bebb-89936799c883

さて、なんとそれだけではうまく行きません。何かというと、、、

CircleCI is currently offering beta access to our iOS build system. Please contact support if you would like access.

なんとサポートに連絡する必要があります。 とはいえ、ご心配なく。サポートは、実はとても簡単にアクセスできます。

a0596661-19f2-4f87-be11-1e76bbab850a

ここから、チャットでお願いしましょう!

スクリーンショット 2015-11-20 08.47.40

こんな感じの、シンプルな英語で大丈夫です。

4. Schemeを共有設定にする

さて、これでようやく、iOSビルドの準備が整いました、、とおもいきや、まだ成功しません。Build Schemeを共有しなければなりません。

XCodeで、[Product] -> [Edit Scheme…] と選択し、Schemeの編集画面に行きます。

ここでSchemeを共有しておきます。

06c01938-899f-41c0-9e06-1c19369ebf40

これで、CircleCI上でのビルドが回り始めたはずです!

6. circle.yml を導入

とはいえ、実はCircleCIのデフォルトはXCodeのバージョンがかなり低いため、設定を行わないとビルドは成功しません。 画面からでも設定はある程度行えるのですが、設定ファイルとしてレポジトリに入れるほうが、バージョン管理もできますし、好ましいです。

ということで、circle.yml といわれる設定ファイルを追加します。

レポジトリのrootに circle.ymlを置いておくことで、CircleCIが勝手にその内容を読み取り、ビルドしてくれます。

詳しい書き方は、以下を参考にするとよいでしょう。

ここでは、ひとまずXCodeのバージョンを指定すれば良いので、以下のように書いておきます。

machine:
  xcode:
    version: "7.1"

これで、ビルドが通ったのではないでしょうか。


少し休憩

ここまでで、自動テストと、XCodeで設定してあれば、テストも通るようになります。現状、ベータアクセスのため一手間必要ではありますが、非常に簡単にビルドが行えることが、分かっていただけたでしょうか?

ただし、ここまではSimulator上での実行。ここからは、実機ビルドです。 そのためには、おなじみのApple Mamber Centerでの設定が必要となります。

6. Apple Member Center で Certificate を作成する

今回の実機配布は、DeployGateを利用する想定です。DeployGateはAdhocビルドの配布を行いますので、Certificateを作成する必要があります。

とはいえ、Certificate作成については、多くの先例があるため、紹介に留めます。

7. Apple Member Center で AppID を作成する

AppIDも同様に、先例の紹介に留めます。

8. Apple Member Center で Deviceを登録する

次に、テストを行う端末のDeviceIDを登録します。 DeviceIDを確認する手段は色々ありますが、まずは以下のように直接確認しましょう。

UDID自体は、iPhone をUSBにつなぎXcodeを起動 「Window」->「Devices」にIDが確認できます

from [iPhone] Provisioning Profile の作成

確認したUDIDと、それを識別する名前をセットにし、Member CenterのDevicesの中に追加します。

9. Apple Member Center で Provisioning Profile を作成する

こちらも定型です。

ただし、このProvisioning Profileは、Deviceが追加されるごとに書きなおす必要が有ることに注意しましょう。


もう一度休憩

ここまで設定すれば、手元でAdhoc配布用のビルドが作成できるようになっているはずです。

次にやることは、これをCircleCI上でやること。もう一息ですが、ここからが大変でもあります。頑張りましょう。


10. DeployGateでAPI Keyを取得する

まずは、DeployGateに登録し、API Keyを取得しておきます。 プロフィールページからいけますね。

ffe8196b-e3c0-431a-b371-30525c258689

11. 証明書キーファイル(p12ファイル)をレポジトリに入れる

次に、CircleCI上のMacでビルドするために、証明書をインストールする必要があります。いろいろ手段はあるかと思いますが、今回はp12ファイルをレポジトリに入れてしまいます。

p12ファイルはキーチェーンアクセスから暗号化することができますので、それを入れておけば最低限のセキュリティは担保できるでしょう。

上記はプッシュ通知用の作業ですが、手順としては同じです。これをレポジトリに入れましょう。

12. circle.yml を編集し、ビルド環境を整える

続いて、circle.yml を用いてビルド環境を整えます。 大きくやることは、

  1. cupertino の導入
  2. 証明書のインストール
  3. Certificateのインストール
  4. Provisioning Profileのインストール

の4つになります。

① cupertino の導入

cupertino とは、Member Centerにアクセスして CertificateやProvisioning Profileを取得してくれるコマンドラインツールです。

これを用いて、Apple Member Centerからビルド時にダウンロードします。 これは、Provisioning Profileがデバイスの追加ごとに再作成となるため、開発中は結構変わってしまうからです。リポジトリに入れてしまうと、管理が大変になります。

インストールは簡単です。circle.yml の依存関係解決後に、gemでインストールします

dependencies:
  post:
    - gem install cupertino

② 証明書のインストール

次に証明書のインストールです。ディレクトリ内に p12 ファイルは配置しているはずですので、それを展開します。

dependencies:
  post:
    - gem install cupertino
    - security import ./certificates/xxx.p12 -k "login.keychain" -P "${PRIVATE_KEY_PASSPHRASE}" -T /usr/bin/codesign

ここで、 ${PRIVATE_KEY_PASSPHRASE} で指定した環境変数だけは、誰にも知られたくありません。そんな環境変数は、CircleCIのSetting -> Environment Value から追加できます。パスワードなど外に漏れるとマズい情報はここに書きますね。

85630427-78c0-4865-bcfd-944958da4bca

③ Certificateのインストール

次に、Certificateです。Certificateについては、cupertinoを用いてダウンロードし、インストールします。

dependencies:
  post:
    - gem install cupertino
    - security import ./certificates/xxx.p12 -k "login.keychain" -P "${PRIVATE_KEY_PASSPHRASE}" -T /usr/bin/codesign
    - ios ios profiles:download "provision_name" -u "${user_id}" -p "${password}" --type distribution  --team "A_team"
    - security import "cert_name.cer" -k "login.keychain" -T /usr/bin/codesign

④ Provisioning Profile のインストール

最後に、Profile です。こちらもCertificateとほぼ同様ですね。

dependencies:
  post:
    - gem install cupertino
    - security import ./certificates/xxx.p12 -k "login.keychain" -P "${PRIVATE_KEY_PASSPHRASE}" -T /usr/bin/codesign
    - ios ios profiles:download "provision_name" -u "${user_id}" -p "${password}" --type distribution  --team "A_team"
    - security import "cert_name.cer" -k "login.keychain" -T /usr/bin/codesign
    - ios profiles:download "profile_name" -u "${user_id}" -p "${password}" --type distribution  --team "A_team"
    - cp "profile_name.mobileprovision" "$HOME/Library/MobileDevice/Provisioning Profiles"

これで、ビルドするための環境が整いました。

13. circle.yml を編集し、schenzenを用いてipa build を行い、DeployGateに配信する

最後に、テスト成功時にはパッケージビルドをして、DeployGateに送信しましょう。

これには、 schenzen というコマンドラインツールを使います。

schenzenは

  • ipaファイル(iOSにデプロイされる元ファイル)の作成
  • ipaファイルの各種サービスへの転送

を主に行うツールです。

テスト後、Deployにこれらのコマンドを用いたビルドをcircle.ymlに追記していきます。

deployment:
  staging:
    branch: master
    commands:
      - ipa build -w test.xcworkspace -s scheme_name -c Release -m "${profile_name.mobileprovision}" --sdk "iphoneos" --xcargs "CODE_SIGN_IDENTITY=\"CODE_SIGN_ID\"" --verbose
      - ipa distribute:deploygate -a $DEPLOYGATE_API_TOKEN -u $DEPLOYGATE_USER_NAME 

これがDeployの基本形で、上記はmaster branchにマージされたものを、自動的にビルドし、deploygateで送信しています。

デプロイの詳細な書き方は以下を参照ください。

ipaコマンドがschenzenです。 “CODE_SIGN_ID” というのは、キーチェーンアクセスで「情報を見る」などした時に表示される、”iPhone Distrobution: Guildworks.inc (XXXXXX)” のように、”サイン区分 + 会社名 + カッコつき数字”で記述されているものです。

さぁ、これでDeployGate配信までたどり着けるはずです。

最終的なcircle.ymlはこれくらいのボリュームになります。

machine:
  xcode:
    version: "7.1"
dependencies:
  post:
    - gem install cupertino
    - security import ./certificates/xxx.p12 -k "login.keychain" -P "${PRIVATE_KEY_PASSPHRASE}" -T /usr/bin/codesign
    - ios ios profiles:download "provision_name" -u "${user_id}" -p "${password}" --type distribution  --team "A_team"
    - security import "cert_name.cer" -k "login.keychain" -T /usr/bin/codesign
    - ios profiles:download "profile_name" -u "${user_id}" -p "${password}" --type distribution  --team "A_team"
    - cp "profile_name.mobileprovision" "$HOME/Library/MobileDevice/Provisioning Profiles"

deployment:
  staging:
    branch: master
    commands:
      - ipa build -w test.xcworkspace -s scheme_name -c Release -m "${profile_name.mobileprovision}" --sdk "iphoneos" --xcargs "CODE_SIGN_IDENTITY=\"CODE_SIGN_ID\"" --verbose
      - ipa distribute:deploygate -a $DEPLOYGATE_API_TOKEN -u $DEPLOYGATE_USER_NAME 

さて、長い記事にお付き合いいただきありがとうございました。 このように、けっこう大変ですが(順調に行けば1時間ちょっと、ハマると半日位かかってしまいますが)、1プロジェクトでやってしまえばあとは同じ作業で展開できますので、チャレンジしてもらえればなぁ、と思います。

このように、ギルドワークスではデプロイの徹底的な見直しを通じて、「正しいものを正しくつくる」を実現しようとしています。コーチや開発など、お手伝いできることがあればぜひ、お問い合わせください

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中