Amazon Web Services ブログ

AWS CodeBuild を利用して、継続的インテグレーションパイプラインに macOS を追加する

8月19日より、AWS CodeBuild を利用して macOS でアプリケーションを構築できます。macOS 14 Sonoma で実行されるマネージド Apple M2 マシンでアーティファクトを構築できるようになりました。AWS CodeBuild は、ソースコードをコンパイルし、テストを実行して、すぐにデプロイできるソフトウェアパッケージを作成する、フルマネージド継続的インテグレーションサービスです。

Apple のシステム (iOSiPadOSwatchOStvOS、および macOS) 向けのアプリケーションの構築、テスト、署名、および配布には、macOS でのみ実行される Xcode を使用する必要があります。AWS クラウドで Apple のシステム向けに構築するユーザーは、継続的インテグレーションおよび継続的デプロイ (CI/CD) パイプラインを Amazon Elastic Cloud Compute (Amazon EC2) Mac インスタンスで実行するように設定している可能性が高いです。

2020 年に Amazon EC2 Mac をリリースして以来、私はさまざまな業界や地域のお客様とかなりの時間を過ごし、macOS でのパイプラインの設定と最適化をサポートしてきました。最も単純な形式では、お客様のパイプラインは次の図のようになります。

EC2 Mac 上の iOS ビルドパイプライン

パイプラインは、ソースコードリポジトリに新しいコミットまたはプルリクエストがある場合に開始されます。マシンにインストールされたリポジトリエージェントは、さまざまなスクリプトをトリガーして環境を設定し、アプリケーションを構築およびテストして、最終的に App Store Connect にデプロイします。

Amazon EC2 Mac は、macOS マシンの管理とオートメーションを大幅に簡素化します。私はよく申し上げるのですが、EC2 Mac インスタンスには、Amazon EC2 で私が好んで使用している機能 (Amazon Elastic Block Store (Amazon EBS) ボリューム、スナップショット、仮想プライベートクラウド (VPC)、セキュリティグループなど) がすべて備わっており、クラウドで macOS を実行している Mac mini に適用されます。

ただし、お客様には 2 つの課題があります。1 つ目は、ビルドに必要なすべてのツールを備えた Amazon マシンイメージ (AMI) を準備することです。最小限のビルド環境には Xcode が必要ですが、Fastlane (および Ruby) や他のビルドまたは開発ツールとライブラリをインストールするのが一般的です。ほとんどの組織では、macOS と Xcode バージョンの複数の組み合わせに対応するために、複数のビルド環境が必要です。

2 つ目の課題は、ビルドの数と期間に応じて、ビルドフリートをスケールすることです。大規模な組織では通常、1 日あたり数百または数千のビルドがあり、数十台のビルドマシンが必要になります。そのフリートのスケールインとスケールアウトは、コスト削減に役立ちます。EC2 Mac インスタンスは、専用予約されています。1 つのインスタンスは 1 つの専有ホストに割り当てられます。専有ホストのフリートをスケールするには、特定の設定が必要です。

これらの課題に対処し、macOS ビルドマシンの設定と管理を簡素化するために、本日は CodeBuild for macOS をご紹介します。

CodeBuild for macOS は、最近リリースされたリザーブドキャパシティフリートをベースとしています。これには、CodeBuild によって管理される、Amazon EC2 を利用するインスタンスが含まれます。リザーブドキャパシティフリートでは、ビルド環境用に一連のハードウェア専有インスタンスを設定します。これらのマシンはアイドル状態のままとなり、ビルドまたはテストをすぐに処理できる状態であるため、ビルド時間が短縮されます。リザーブドキャパシティフリートでは、マシンは常に実行されており、プロビジョニングされている限りコストが発生し続けます。

CodeBuild は、ビルドを実行するための標準ディスクイメージ (AMI) を提供します。これには、開発およびビルド環境用の Xcode、Fastlane、Ruby、Python、Node.js、および他の一般的なツールのプリインストールバージョンが含まれています。インストールされているツールの詳細なリストは、ドキュメントでご覧いただけます。今後、これらのツールの更新バージョンを含む追加のディスクイメージを提供する予定です。必要に応じて、独自のカスタムディスクイメージを使用することもできます。

さらに、CodeBuild を利用すると、自動スケーリングを簡単に設定できます。必要なキャパシティをお知らせいただければ、当社がそこからすべてを管理します。

CodeBuild for macOS の動作を見てみましょう
どのように機能するかを示すために、iOS で AWS Amplify の利用を開始するという私のお気に入りのプロジェクト用に CI/CD パイプラインを作成します。このチュートリアルと、それに付随するソースコードは、クラウドベースのバックエンドを備えたシンプルな iOS アプリケーションを作成する方法について説明するためのものです。アプリケーションは、GraphQL API (AWS AppSync)、NoSQL データベース (Amazon DynamoDB)、ファイルベースのストレージ (Amazon Simple Storage Service (Amazon S3))、およびユーザー認証 (Amazon Cognito) を利用します。AWS Amplify for Swift は、これらすべてのサービスを結び付けます。

チュートリアルと、アプリケーションのソースコードは、Git リポジトリで入手できます。これには、アプリケーションのビルド、テスト、およびデプロイを自動化するスクリプトが含まれています。

CodeBuild for macOS を利用して新しい CI/CD パイプラインを設定するには、大まかには次のステップを実行します:

  1. ビルドプロジェクトを作成します。
  2. マシンの専有フリートを作成します。
  3. 1 個以上のビルドトリガーを設定します。
  4. パイプライン定義ファイル (buildspec.yaml) をプロジェクトに追加します。

開始するには、AWS マネジメントコンソールを開き、CodeBuild を選択して、[プロジェクトを作成] を選択します。

CodeBuild mac - 1

[プロジェクト名] を入力し、[ソース] コードリポジトリへの接続を設定します。この例では GitHub を使用します。CodeBuild は GitLab と BitBucket もサポートしています。ドキュメントでは、サポートされているソースコードリポジトリの最新リストをご覧いただけます。

CodeBuild mac - 2

[プロビジョニングモデル] で、[リザーブドキャパシティ] を選択します。これは、Amazon EC2 Mac インスタンスを使用できる唯一のモデルです。まだフリートを定義していないため、ビルドプロジェクトの作成中に作成することにしました。[フリートを作成] を選択します。

CodeBuild mac - 3

[コンピューティングフリートの設定] ページで、[コンピューティングフリート名] を入力し、オペレーティングシステムとして [macOS] を選択します。[コンピューティング] で、ビルドプロジェクトに必要なメモリの量と vCPU の数を選択し、[キャパシティ] で必要なインスタンスの数を選択します。

この例では、[マネージドイメージ] を使用します。これには、Xcode 15.4 と、iOS 17.5 のシミュレーターランタイムなどのパッケージが含まれています。ドキュメントで、このイメージにプリインストールされているパッケージのリストをご覧いただけます。

完了したら、[フリートを作成] を選択して、CodeBuild プロジェクトの作成ページに戻ります。

CodeBuild - フリートを作成

次のステップとして、新しいサービスロールを作成して、ビルド環境に必要な許可を定義するよう CodeBuild に指示します。このプロジェクトのコンテキストでは、Amplify の設定をプルして AWS Secrets Manager にアクセスするための許可を含める必要があります。これを実行するためのステップバイステップの指示はここには記載しませんが、サンプルプロジェクトコードには私が追加した許可のリストが含まれています

CodeBuild mac - 4

ビルドコマンドのセットをプロジェクト定義で提供するか、またはプロジェクトに含まれる buildspec.yaml ファイルで提供するかを選択できます。私は後者を選択します。

CodeBuild mac - 5

これはオプションですが、ビルドアーティファクトを S3 バケットにアップロードしたいと思います。S3 バケットでは、各ビルドをアーカイブできます。したがって、[アーティファクト 1 – プライマリ] セクションで、[タイプ] として [Amazon S3] を選択し、[バケット名] とアーティファクトの [名前] を入力します。アップロードするファイル名は、buildspec.yaml ファイルで指定されます。

CodeBuild mac - 6

ページの下部で、GitHub WebHook を追加するプロジェクトトリガーを設定します。これにより、GitHub 上のプロジェクトにコミットまたはプルリクエストが送信されるたびに CodeBuild がビルドを開始するように設定されます。

CodeBuild - ウェブフック

最後に、ページの下部にあるオレンジ色の [プロジェクトを作成] ボタンを選択して、このプロジェクトを作成します。

ビルドのテスト
プロジェクトには、ビルドの準備、プロジェクトの構築、テストの実行、Apple の TestFlight へのデプロイを行うためのビルドスクリプトが既に含まれています。

CodeBuild - プロジェクトスクリプト

プロジェクトのルートに buildspec.yaml ファイルを追加して、これらの既存のスクリプトをオーケストレートします。

version: 0.2

phases:

  install:
    commands:
      - code/ci_actions/00_install_rosetta.sh
  pre_build:
    commands:
      - code/ci_actions/01_keychain.sh
      - code/ci_actions/02_amplify.sh
  build:
    commands:
      - code/ci_actions/03_build.sh
      - code/ci_actions/04_local_tests.sh
  post_build:
    commands:
      - code/ci_actions/06_deploy_testflight.sh
      - code/ci_actions/07_cleanup.sh
artifacts:
   name: $(date +%Y-%m-%d)-getting-started.ipa
   files:
    - 'getting started.ipa'
  base-directory: 'code/build-release'

このファイルを Git リポジトリに追加し、次のコマンドで GitHub にプッシュします: git commit -am "add buildpsec" buildpec.yaml

コンソールで、ビルドが開始されたことを確認できます。

CodeBuild - ビルド履歴

ビルドを選択すると、ログファイルを表示したり、[フェーズの詳細] を選択してビルドの各フェーズの高レベルのステータスを確認したりできます。

CodeBuild - フェーズの詳細

ビルドが成功すると、iOS アプリケーションの IPA ファイルが S3 バケットにアップロードされているのを確認できます。

aws s3 ls

CodeBuild が実行する最後のビルドスクリプトは、バイナリを App Store Connect にアップロードします。App Store Connect の TestFlight セクションで新しいビルドを確認できます。

App Store Connect

知っておくべきこと
Amazon EC2 Mac インスタンスを準備して最初のビルドを受け入れるまでに、8~10 分かかります。これは CodeBuild に固有の事象ではありません。マシンの準備時間中に送信するビルドはキューに入れられ、マシンが使用可能になり次第、順番に実行されます。

CodeBuild for macOS はリザーブドフリートで動作します。ビルドの 1 分ごとに料金が発生するオンデマンドフリートとは異なり、リザーブドフリートは、ビルドが実行されていない場合でも、ビルドマシンがお客様専用に予約されている時間について課金されます。キャパシティ予約は、Software License Agreement for macOS (第 3.A.ii 条) が定めるとおり、Amazon EC2 Mac の 24 時間の最小割り当て期間に従います。

マシンのフリートは、AWS アカウントの CodeBuild プロジェクト間で共有できます。フリート内のマシンは、お客様専用に予約されています。CodeBuild だけがマシンにアクセスできます。

CodeBuild はビルド間で作業ディレクトリをクリーンアップしますが、マシンは他のビルドに再利用されます。これにより、CodeBuild ローカルキャッシュメカニズムを使用して、ビルド後に選択したファイルを迅速に復元できます。同じフリートで異なるプロジェクトを構築する場合は、新しいビルドを開始する前に、macOS キーチェーンなどのグローバル状態と、SwiftPM および Xcode パッケージキャッシュなどのビルドアーティファクトを必ずリセットしてください。

カスタムビルドイメージを使用する場合は、それらが 64 ビット Mac-Arm アーキテクチャ用にビルドされているようにしてください。また、AWS Systems Manager Agent (SSM Agent) をインストールして起動する必要があります。CodeBuild は、SSM Agent を利用して独自のエージェントをインストールし、マシンを管理します。最後に、AMI が CodeBuild 組織 ARN で使用できることを確認します。

CodeBuild for macOS は、次の AWS リージョンでご利用いただけます: 米国東部 (オハイオ、バージニア北部)、米国西部 (オレゴン)、アジアパシフィック (シドニー)、および欧州 (フランクフルト)。これらは、Amazon EC2 Mac M2 インスタンスを提供しているリージョンと同じです。

今すぐ使用を開始して、macOS で最初の CodeBuild プロジェクトを作成しましょう。

— seb

原文はこちらです。