モバイルDevOps

GitLab Mobile DevOpsを使えば、GitLab CI/CDを使ってAndroidやiOSのネイティブアプリやクロスプラットフォームのモバイルアプリを素早くビルド、署名、リリースすることができます。Mobile DevOpsはGitLab Incubation Engineeringによって開発された実験的な機能です。

Mobile DevOpsはまだ開発中ですが、利用することができます:

ビルド環境

GitLab.comのSaaS Runnerを使って素早く始めることも、セルフマネージドRunnerを設定してビルド環境を完全にコントロールすることもできます。

Android ビルド環境

適切なDockerイメージを選択し、.gitlab-ci.ymlFabernovelは様々なAndroidバージョンをサポートしています。

使用例:

test:
  image: fabernovel/android:api-33-v1.7.0
  stage: test
  script:
    - fastlane test

iOSのビルド環境

GitLab SaaS Runner on macOSはベータ版です。

macOSのGitLab SaaS Runnerでジョブを実行するイメージを選択し、.gitlab-ci.yml ファイルに追加します。

使用例:

test:
  image: macos-12-xcode-14
  stage: test
  script:
    - fastlane test
  tags:
    - saas-macos-medium-m1

コード署名

すべての Android および iOS アプリは、さまざまなアプリストアを通じてディストリビューションされる前に、安全に署名される必要があります。署名は、ユーザーのデバイスに届く前にアプリケーションが改ざんされていないことを保証します。

プロジェクトレベルのセキュアファイルでは、CI/CDビルドでアプリに安全に署名するために使用できるように、GitLabに以下を保存できます:

  • 鍵ストア
  • 提供プロファイル
  • 証明書の署名

概要については、プロジェクトレベルのセキュアファイルのデモを参照してください。

Fastlane と Gradle による Android プロジェクトのコード署名

Androidのコード署名を設定します:

  1. キーストアとキーストアのプロパティファイルをプロジェクトレベルのセキュアファイルにアップロードします。
  2. これらのファイルをビルドで使用するように Gradle 設定を更新します。

概要については、GitLabを使ってAndroidアプリをビルドしてGoogle Playにリリースする方法を参照してください。

キーストアの作成

まだキーストア・ファイルがない場合は、以下のコマンドを実行してキーストア・ファイルを生成してください:

keytool -genkey -v -keystore release-keystore.jks -storepass password -alias release -keypass password -keyalg RSA -keysize 2048 -validity 10000

次に、キーストア設定をrelease-keystore.properties というファイルに記述します:

storeFile=.secure_files/release-keystore.jks
keyAlias=release
keyPassword=password
storePassword=password

これらのファイルが作成されたら

  • GitLabプロジェクトにSecure Filesとしてアップロードし、CI/CDジョブで使用できるようにします。
  • 両方のファイルを.gitignore ファイルに追加して、バージョン管理にコミットされないようにします。

Gradle の設定

次のステップは、新しく作成した keystore を使用するように Gradle を設定することです。アプリのbuild.gradle

  1. pluginsセクションの直後に、以下を追加します:

    def keystoreProperties = new Properties()
    def keystorePropertiesFile = rootProject.file('.secure_files/release-keystore.properties')
    if (keystorePropertiesFile.exists()) {
      keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    }
    
  2. android

    signingConfigs {
      release {
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
        storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
        storePassword keystoreProperties['storePassword']
      }
    }
    
  3. リリースビルドタイプにsigningConfig

    signingConfig signingConfigs.release
    

この設定により、fastlaneを使ってアプリをビルドし、セキュアなファイルに保存されたファイルに署名することができます。

使用例:

  • サンプルfastlane/Fastfile ファイル:

     default_platform(:android)
       
     platform :android do
       desc "Create and sign a new build"
       lane :build do
         gradle(tasks: ["clean", "assembleRelease", "bundleRelease"])
       end
     end
    
  • サンプル.gitlab-ci.yml ファイル:

     build:
       image: fabernovel/android:api-33-v1.7.0
       stage: build
       script:
         - apt update -y && apt install -y curl
         - curl --silent "https://gitlab.com/gitlab-org/incubation-engineering/mobile-devops/download-secure-files/-/raw/main/installer" | bash
         - fastlane build
    

fastlaneによるiOSプロジェクトのコード署名

iOSのコード署名を設定するには、以下の手順が必要です:

  1. 署名証明書をGitLabにアップロードできるように、fastlaneをローカルにインストールします。
  2. これらのファイルを使うようにビルドを設定します。

概要については、GitLab で iOS アプリをビルドして Test Flight にリリースする方法をご覧ください。

fastlane の初期化

fastlaneがインストールされている状態で、次のコマンドを実行します:

fastlane init

このコマンドにより、プロジェクト内にAppfile とスタブアウトされたfastfileを含むfastlane フォルダが作成されます。この過程で、アプリ識別子とApp Storeアプリを生成するためのApp Store Connectログイン情報の入力を求められます(まだ存在しない場合)。

次のステップでは、プロジェクトのコード署名ファイルを管理するfastlane matchを設定します。次のコマンドを実行して、設定済みのMatchfile を生成します:

fastlane match init

このコマンドは次のように促します:

  • 使用するストレージバックエンドを選択します。gitlab_secure_files を選択する必要があります。
  • プロジェクトパスを入力します。例:gitlab-org/gitlab.

証明書の生成とアップロード

以下のコマンドを実行して、Apple Developerポータルで証明書とプロファイルを生成し、それらのファイルをGitLabにアップロードします:

PRIVATE_TOKEN=YOUR-TOKEN bundle exec fastlane match development

この例では:

  • YOUR-TOKEN は、GitLabプロジェクトのメンテナーのロールを持つ個人またはプロジェクトのアクセストークンでなければなりません。
  • appstoread-hocのように、development を署名したいビルドのタイプに置き換えてください。

コマンドが完了するとすぐに、プロジェクトのCI/CD設定でファイルを見ることができます。

アップロードのみ

プロジェクトの署名証明書とプロビジョニングプロファイルがすでに作成されている場合は、オプションでfastlane match import を使って既存のファイルを GitLab に読み込むことができます:

PRIVATE_TOKEN=YOUR-TOKEN bundle exec fastlane match import

ファイルのパスを入力するプロンプトが表示されます。ファイルのパスを入力するプロンプトが表示されます。これらの詳細を入力すると、ファイルがアップロードされ、プロジェクトの CI/CD 設定に表示されます。インポート中にgit_url の入力を求められたら、空白のままenterを押すのが安全です。

この設定により、fastlaneを使ってアプリをビルドし、安全なファイルに保存されたファイルに署名することができます。

使用例:

  • サンプルfastlane/Fastfile ファイル:

     default_platform(:ios)
       
     platform :ios do
       desc "Build and sign the application for development"
       lane :build do
         setup_ci
       
         match(type: 'development', readonly: is_ci)
       
         build_app(
           project: "ios demo.xcodeproj",
           scheme: "ios demo",
           configuration: "Debug",
           export_method: "development"
         )
       end
     end
    
  • サンプル.gitlab-ci.yml ファイル:

     build_ios:
       image: macos-12-xcode-14
       stage: build
       script:
         - fastlane build
       tags:
         - saas-macos-medium-m1
    

ディストリビューション

署名されたビルドは、Mobile DevOps Distributionインテグレーションを使用してGoogle Play StoreまたはApple App Storeにアップロードできます。

Google PlayインテグレーションとfastlaneによるAndroidディストリビューション

Google Playインテグレーションとfastlaneを利用したAndroidディストリビューションを作成するには、以下が必要です:

  1. Google Cloud PlatformでGoogleサービスアカウントを作成し、そのアカウントにGoogle Playのプロジェクトへのアクセス権を付与します。
  2. Google Playインテグレーションを有効にします。
  3. パイプラインにリリースステップを追加します。

概要については、Google Play インテグレーションのデモを参照してください。

Google Playインテグレーションを有効にします。

Google Playインテグレーションを使用して、CI/CDパイプラインをGoogle Play Consoleに接続してAndroidアプリをビルドおよびリリースするように設定します。インテグレーションを有効にするには、以下の手順に従います:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定]>[インテグレーション]を選択します。
  3. Google Playを選択します。
  4. インテグレーションを有効にする]で、[アクティブ]チェックボックスを選択します。
  5. Package name(パッケージ名)に、アプリのパッケージ名を入力します。例えば、com.gitlab.app_name
  6. Service account key (.JSON)では、キーファイルをドラッグまたはアップロードします。
  7. 変更を保存を選択します。

インテグレーションを有効にすると、fastlaneを使ってGoogle Playにビルドをディストリビューションできます。

使用例:

  • サンプルfastlane/Fastfile

     default_platform(:android)
       
     platform :android do
       desc "Submit a new Beta build to the Google Play store"
       lane :beta do
         upload_to_play_store(
           track: 'internal',
           aab: 'app/build/outputs/bundle/release/app-release.aab',
           release_status: 'draft'
         )
       end
     end
    
  • サンプル.gitlab-ci.yml

     beta:
       image: fabernovel/android:api-33-v1.7.0
       stage: beta
       script:
         - fastlane beta
    

iOSディストリビューション Apple Storeインテグレーションとファストレーン

Apple Storeインテグレーションとfastlaneを使ってiOSディストリビューションを作成するには、以下の手順が必要です:

  1. App Store Connect APIのAPIキーを生成します。Apple App Store Connectポータルで、プロジェクト用の新しい秘密鍵を生成します。
  2. Apple App Storeインテグレーションを有効にします。
  3. パイプラインとfastlane設定にリリースステップを追加します。

概要については、Apple App Storeインテグレーションデモをご覧ください。

Apple App Storeインテグレーションを有効にします。

Apple App Storeインテグレーションを使用してCI/CDパイプラインを設定し、App Store Connectに接続してiOS、iPadOS、macOS、tvOS、watchOS向けのアプリをビルドおよびリリースします。インテグレーションを有効にするには、次の手順に従います:

  1. 左のサイドバーで「検索」または「移動」を選択してあなたのプロジェクトを検索します。
  2. 設定]>[インテグレーション]を選択します。
  3. Apple App Storeを選択します。
  4. インテグレーションを有効にする]で、[アクティブ]チェックボックスを選択します。
  5. Apple App Store Connectの設定情報を入力します:
    • 発行者ID:発行者ID:Apple App Store Connectの発行者IDは、Apple App Store Connectポータルの「ユーザーとアクセス」の「キー」セクションで確認できます。
    • 鍵ID:生成された新しい秘密鍵の鍵IDです。
    • 秘密鍵:生成された秘密鍵。この鍵は一度しかダウンロードできません。
  6. 変更を保存を選択します。

インテグレーションを有効にすると、fastlane を使用して TestFlight と Apple App Store にビルドをディストリビューションできます。

使用例:

  • サンプルfastlane/Fastfile

     default_platform(:ios)
       
     platform :ios do
       desc "Build and sign the application for distribution, upload to TestFlight"
       lane :beta do
         setup_ci
       
         match(type: 'appstore', readonly: is_ci)
       
         app_store_connect_api_key
       
         increment_build_number(
           build_number: latest_testflight_build_number(initial_build_number: 1) + 1,
           xcodeproj: "ios demo.xcodeproj"
         )
       
         build_app(
           project: "ios demo.xcodeproj",
           scheme: "ios demo",
           configuration: "Release",
           export_method: "app-store"
         )
       
         upload_to_testflight
       end
     end
    
  • サンプル.gitlab-ci.yml

     beta_ios:
       image: macos-12-xcode-14
       stage: beta
       script:
         - fastlane beta
    

モバイル向けレビューアプリ

レビューアプリを使用して、マージリクエストからの変更を直接プレビューすることができます。この機能はAppetize.ioとのインテグレーションにより実現しました。

概要については、レビューアプリのモバイルセットアップ手順をご覧ください。

使い始めるには、セットアップ手順をご覧ください。

モバイルSAST

静的アプリケーション・セキュリティ・テスト(Static Application Security Testing(SAST))を使用して、コードに対して静的アナライザを実行し、既知のセキュリティ脆弱性をチェックすることができます。モバイルSASTは、モバイルセキュリティフレームワーク(MobSF)に基づく実験的なSAST機能によって、モバイルチーム向けにこの機能を拡張します。

サンプル・リファレンス・プロジェクト

さまざまなプラットフォームの完全なビルド、サイン、リリースのパイプライン例については、以下のサンプル・リファレンス・プロジェクトを参照してください。利用可能なすべてのプロジェクトのリストは、Mobile DevOps Demo Projects グループにあります。

モバイルDevOpsブログ

その他の参考資料はGitLabブログの#mobileセクションにあります。