目次


モバイル DevOps: 第 2 回 UrbanCode Deploy を使用してエンタープライズ規模の iOS 継続的デプロイメントを実装する

アプリの複雑なライフサイクルに対応した、汎用の継続的インテグレーション・システムを作成する

Comments

第 1 回で説明したように、社内でモバイル DevOps を実装するには、継続的ビルドと継続的テストが含まれていて、品質と効率性に主眼が置かれた、完全な継続的インテグレーション (CI) プロセスが必要になります。

例えば、私たちのチームが作成しているエンタープライズ iOS アプリの数は、100 を超えています。それぞれのアプリは、複数の言語にローカライズされて、数百の顧客のバックエンド・システムに統合されることになります。アプリ (およびクラウド統合用 API の各バージョンやソース・コード) を作成、機能強化、カスタマイズする複雑さを管理するには、CI システムを実装するためのサポート・ツールが必要でした。このチュートリアルでは、そのようなシステムを構築する方法を紹介します。

私たちは開発の CI パイプラインに従って継続的にビルドとユニット・テストを行っているため、開発チームとテスト・チームがコードの品質に関するフィードバックを受け取って、それぞれのチームがアプリの品質をタイムリーにセキュアな方法で評価できるようにしています。このようにパイプラインを拡張することは、開発チームをサポートするサイクルに欠かせない部分です。

かつては、リリース管理者からなるチームが、アプリのどのバージョンをデプロイするかを調整するのが一般的でした。最近のチームでは、専任のリリース管理者を置くことさえ珍しくなっています。そうは言っても、ビルドをリリースするスピードが速くなっていることから、ビルドを正確に追跡すること、そしてビルド間の依存関係とその他の追跡システム (欠陥管理システムなど) を調整することが、これまで以上に重要になってきています。

私たちのチームは、顧客の期待に応えるために、短期間のスプリントを提供しなければなりません。この場合、各ビルドを致命的な欠陥がない状態でテスト・チームに提供することが重要です (致命的な欠陥があると、テスト・チーム全体の作業が中断される可能性があります)。

iOS アプリのビルドを調整して DevOps パイプラインに通すために、以下のものを実装しました。

要件

私たち開発者チームの要件は、次のとおりです。

  • リリースできる状態のビルドを、開発者が指定できるようにする。
  • 問題のあるビルドや、機能提供の遅れによって作業が中断されることなく、テスターがテストにより多くの時間を費やせるようにする。

ビジネス要件は次のとおりです。

  • 品質保証のプロセスを経たビルドであることを確実にする。
  • 継続的インテグレーションが実証されるときに拡張できるプロセスを実装する。

DevOps に関しては、次の要件もあります。

  • 選択したチームにアプリを配布する際には、必ずセキュアなメカニズムを使用する。
  • アプリをリリースするところまでフローを適用するように設計された品質ゲートを実装する。

パイプラインの設計

第 1 回でおわかりのように、CI パイプラインを可視化すると、実現しようとしていることが明らかになり、ソリューションに欠落している部分をすぐに特定することができます。

パイプラインの設計を示す図
パイプラインの設計を示す図

このパイプラインのフローでは、次のことが行われます。

  1. 開発者がソース管理メカニズム (この例では Git) を使用して、テストの段階に進められるアプリのリリースにタグを付けます。これらのタグは、有用なフォーマットでなければなりません。私たちが使っているのは、RELEASE-#.#.#.#というフォーマットです。このフォーマットでは、リリースに続けて、そのリリースのメジャー番号、マイナー番号、反復回数、ホットフィックス番号を表しています。
  2. UrbanCode Deploy が Git タグをモニターし、タグが付いているアプリを Xcode によって自動的にビルドして、配布プロファイルで署名を付けます。
  3. IPA ファイルをビルド・アーカイブから抽出します。
  4. Xcode によって IPA ファイルをシミュレーターまたは端末にインストールし、UI のリグレッション・テストを実行します。
  5. テストに合格したら、IPA ファイルを MaaS360 にデプロイして、テスト・チームに配布できる状態にします。

このソリューションを利用するメリット

この単純な実装では、パイプラインの前回の反復に基づいて事を進め、以下のことを可能にする方法へ確実に進むようにします。

  • 開発者は、リリースの準備ができたことを示すことができます。
  • 自動化されたテストによって品質を保証することができます。自動化するテストの種類は変えることができますが、一般にはユニット・テスト、UI リグレッション・テスト、アクセシビリティー・テスト、再テストによるパフォーマンス・テストが自動化されます。
  • アプリは MaaS360 にプッシュされて、配布の準備が行われます。

“プロセス全体を通して、開発者がビルドを配布できる状態にするために追加の時間を割くことはありません。また、テスターが特定の品質レベルを満たすビルドを確実に受け取れるようにします。”

詳細

このパイプラインを実装するために私たちがフォーカスしたのは、自動化されたテスト、そして配布ツールの統合です。

自動化されたテスト

私たちには、ゲートとして実行するための (ユニット・テストよりも) 強力なテストが必要でした。そこで、UI リグレッション・テストを実装しました (アクセシビリティーのテストや、パフォーマンス・ベンチマーク用のテストを追加することもできました)。

リグレッション・テストを実装するために、IBM UrbanCode Deploy 用の Apple Xcode プラグインを使い、UI テスト・ステップを利用しました。UI テスト・ステップは、ユーザーからコマンドを抽象化するので、私たちに必要となったのは以下の操作だけです。

  • IPA ファイル (ビルド・プロセスで抽出したもの) へのリンクを指定する。
  • テストを実行する端末と OS を指定する。
  • 選択した端末またはシミュレーターに IPA ファイルをインストールする。
  • リグレッション・スクリプトへのリンクを指定する。

上記内容は、すべて xcrun コマンドに変換されます。以下の図に、UI リグレッション・テストを実装するためのフローを示します。図中のボックスが、UrbanCode コンポーネントの各ステップを表します。これらのステップのほとんどは、IBM UrbanCode Deploy 用の Apple Xcode プラグインを使用して実装することができます。

UI リグレッション・テストを実装するためのフロー図
UI リグレッション・テストを実装するためのフロー図

配布メカニズム

配布メカニズムとして、Tyson Lawrie 氏が作成した再利用可能な UrbanCode プラグインを使用して MaaS360 を統合しました。このプラグインは 2 つの主要な機能を実行します。それは、認証トークンの要求と、MaaS360 内の IPA ファイルのアップグレードです。

認証トークンの要求

このプラグインには、MaaS360 のアカウントとインスタンスに属するプロパティーがいくつか必要です。また、IPA ファイルをアプリのカタログに送信するには、その前に、認証トークンを取得して、ある程度のセキュリティーを確保しなければなりません。

以下の図に、認証トークンを取得するために実装した IBM UrbanCode Deploy コンポーネント・プロセスのステップを示します。これらのステップでは、MaaS360 アカウント情報の詳細を指定するパラメーターを渡した後、同ステップ (および図の下にあるテキストに詳細を記載した事後処理) によって返されたトークンを UrbanCode のプロパティーのなかに保管します。

トークンを取得するステップを示す図
トークンを取得するステップを示す図

トークンを取得するために使用するのは、認証トークンの要求に関連付けられたプラグイン・ステップです。第 1 回で、Xcode によるユニット・テストの結果の事後処理を実装したことを思い出してください。今回は同様のアクティビティーを実行することにより、返された XML から認証トークンを取得し、そのトークンをこのコンポーネント・プロセスに対するローカル変数として保管した上で、このローカル変数を取得し、アプリケーション・レベルのプロパティーまたは環境レベルのプロパティーとして設定する必要があります。

commandOut.print("==== Starting post processing ====\n");
properties.put("Status", "Success");

arrTestStatus = new java.util.ArrayList();

commandOut.print("\nEstablishing Regular Expression\n")

scanner.register("<authToken>", function(lineNumber, line){
    var temp = line.replace(/.*<authToken>/g,"");
    var auth_token = temp.replace(/<\/authToken><errorCode>[0-9]*<\/errorCode><\/authResponse>/g,"");
    commandOut.print(auth_token);
    properties.put("maas360.auth.token",auth_token)
});

scanner.scan();

var exit = properties.get('exitCode');

if (exit == 0) {
    properties.put('Status', 'Success');
}
else {
     properties.put('Status', 'Failure');
}
commandOut.print("\n==== End post processing ====\n");

MaaS360 内のアプリケーション (IPA ファイル) のアップグレード

このステップでは、前のステップからの認証コードに加え、アプリケーションに関する詳細情報を取得してから、これらの情報を使用して、IPA ファイルとバンドル ID を含む複数のパートからなるフォーム送信を生成します。

まとめ

このチュートリアルでは、私たちがどのようにパイプラインの最初の反復を拡張して、配布プロファイルなどの細かい調整を加えたかを説明しました。主な変更部分は、シミュレーターに対してデプロイするのではなく、MaaS360 に対してデプロイし、UrbanCode Deploy に保管された環境の設定に基づいて、アプリをグループに配布するようにしているところです。

また、特定のビルドをリリースできるかどうかを宣言するための品質ゲートも適用しました。この品質ゲートを実装するために使用したのは、UrbanCode Deploy のバージョン・ステータスです。このトピックについては、連載の今後のチュートリアルで継続的プロモーションを取り上げる際に詳しく説明します。

次のステップ

私たちが実装したモデルでは、機能強化を繰り返して確実に拡張できるようにすると同時に、新しい機能を実装することも目指しています。ここまでで、品質に関するフィードバック付きで開発ビルドを実装するとともに、テスターを対象として品質ゲートを適用したデプロイメントを実装したので、今度は環境とコンポーネントとの間の継続的プロモーションにフォーカスすることができます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Mobile development, DevOps
ArticleID=1017158
ArticleTitle=モバイル DevOps: 第 2 回 UrbanCode Deploy を使用してエンタープライズ規模の iOS 継続的デプロイメントを実装する
publish-date=10152015