メインコンテンツにジャンプ
CI/CD

Capacitorの自動AndroidビルドとGitLab

__CAPGO_KEEP_0__のAndroid IonicアプリのためのGitLabとfastlaneを使用したCI/CDパイプラインの設定方法

アニク・ドハバル・バブー

アニク・ドハバル・バブー

コンテンツマーケター

Capacitorの自動AndroidビルドとGitLab

GitLab CIによる自動Androidビルド

CapacitorアプリのCI/CD設定は複雑で時間がかかることがあります。ここでは、必要な事項を簡単に説明します。

前提条件

開始する前に、次の設定が必要です。

  • GitLabアカウントの管理者権限
  • Google Play Storeにアプリがすでに公開されていること
  • Android署名キーとキーストアファイル
  • Google Cloud ConsoleプロジェクトのPlay Store API機能が有効になっていること
  • サービスアカウントの適切な権限
  • GitLab CI/CDワークフローの理解
  • Fastlaneの設定の知識
  • パイプラインの維持とデバッグに必要な時間

Capgo Build for CI/CD by Capgo

CI/CDの自動化をスキップ Capgo Build __CAPGO_KEEP_0__ Buildは、既存のCI/CDパイプラインからAndroidアプリの署名されたネイティブビルドを実行します。

  • __CAPGO_KEEP_0__ Buildは、パイプラインと連携して動作します。: GitLab CI、GitHub Actions、Jenkins、またはローカルスクリプトからCapgo Buildをトリガーします。 npx cap sync.
  • CI/CDシークレットから署名: Androidのキーストア、キーアリセ、パスワード、プレイストアサービスアカウントのJSONをCI/CDシークレットに保持します。
  • ネイティブランナーの管理を省略: Capgo BuildはAndroidビルド環境を提供するため、SDK イメージ、Gradleキャッシュの問題、またはFastlaneのレーンの管理を手動で行う必要がありません。
  • アーティファクトと提出: Capgo CLIから署名済みアーティファクトをダウンロードしてQAに提出することができます。

料金

  • Capgo プランは 1 か月あたり 12 ドルから始まります
  • OTA の更新と 1 か月あたり約 15 のネイティブ ビルドが含まれます
  • クレジットを通じて 1 分あたり追加のビルド分数が請求されます

Capgo ビルドを CI/CD で設定する

手動設定ガイド

ここでは、以下の手順を実行する必要があります

ブログの後で実行する手順

  1. Fastlane ファイルをコピーする
  2. GitLab の暗号化されたシークレットを使用してシークレットを保存する
  3. Google Play サービス アカウント キーを作成して保存する
  4. Android の署名キーを保存する
  5. GitLab ワークフロー .yml ファイルを設定してください。

1. Fastlane ファイルをコピーしてください。

Fastlane は、Ruby ライブラリで、モバイル開発の一般的なタスクを自動化するために作成されました。Fastlane を使用すると、カスタムの「レーン」を構成できます。これらの「レーン」は、通常 Android Studio を使用して実行するタスクを実行する「アクション」のシーケンスです。Fastlane を使用できますが、このチュートリアルの目的のために、コアアクションのいくつかしか使用しません。

プロジェクトのルートディレクトリに Fastlane フォルダを作成し、次のファイルをコピーしてください: Fastlane

default_platform(:android)

KEYSTORE_KEY_ALIAS = ENV["KEYSTORE_KEY_ALIAS"]
KEYSTORE_KEY_PASSWORD = ENV["KEYSTORE_KEY_PASSWORD"]
KEYSTORE_STORE_PASSWORD = ENV["KEYSTORE_STORE_PASSWORD"]

platform :android do
    desc "Deploy a beta version to the Google Play"
    private_lane :verify_changelog_exists do |version_code: |
      changelog_path = "android/metadata/en-US/changelogs/#{version_code}.txt"
      UI.user_error!("Missing changelog file at #{changelog_path}") unless File.exist?(changelog_path)
      UI.message("Changelog exists for version code #{version_code}")
    end

    private_lane :verify_upload_to_staging do |version_name: |
      UI.message "Skipping staging verification step"
    end
    lane :beta do
				keystore_path = "#{Dir.tmpdir}/build_keystore.keystore"
				File.write(keystore_path, Base64.decode64(ENV['ANDROID_KEYSTORE_FILE']))
				json_key_data = Base64.decode64(ENV['PLAY_CONFIG_JSON'])
				previous_build_number = google_play_track_version_codes(
					package_name: ENV['DEVELOPER_PACKAGE_NAME'],
					track: "internal",
					json_key_data: json_key_data,
				)[0]

				current_build_number = previous_build_number + 1
				sh("export NEW_BUILD_NUMBER=#{current_build_number}")
        gradle(
          task: "clean bundleRelease",
          project_dir: 'android/',
          print_command: false,
          properties: {
            "android.injected.signing.store.file" => "#{keystore_path}",
            "android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
            "android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
            "android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
						'versionCode' => current_build_number
          })
        upload_to_play_store(
					package_name: ENV['DEVELOPER_PACKAGE_NAME'],
					json_key_data: json_key_data,
          track: 'internal',
          release_status: 'completed',
          skip_upload_metadata: true,
          skip_upload_changelogs: true,
          skip_upload_images: true,
          skip_upload_screenshots: true,
        )
    end
    lane :build do
      gradle(
        task: "clean bundleRelease",
        project_dir: 'android/',
        print_command: false,
        properties: {
          "android.injected.signing.store.file" => "#{keystore_path}",
          "android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
          "android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
          "android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
        })
    end
    lane :prod_release do
      build_gradle = File.read("../android/app/build.gradle")

      verify_changelog_exists(version_code: build_gradle.match(/versionCode (\d+)/)[1])
      verify_upload_to_staging(version_name: build_gradle.match(/versionName '([\d\.]+)'/)[1])

      supply(
        track_promote_to: 'beta',
        skip_upload_apk: true,
        skip_upload_aab: true,
        skip_upload_metadata: false,
        skip_upload_changelogs: false,
        skip_upload_images: false,
        skip_upload_screenshots: false
      )
    end
end

GitLab CI/CD 変数を GitLab で保存する

GitLab は、GitHub のリポジトリシークレットと同様に、暗号化された CI/CD 変数を保存する方法を提供しています。機密情報を安全に保存するには。

  1. GitLab プロジェクトの設定画面に移動してください。
  2. CI/CD > 変数に移動してください。
  3. 次の変数を追加してください:
  • ANDROID_KEYSTORE_FILE: Android ビルドを署名するために使用される base64 エンコードされたファイルのパスです。このファイルは、Play App Signing を使用している場合のアップロードキーに関連付けられたキーストアファイル、またはアプリケーション署名キーです。 .jks 1. Fastlaneファイルをコピーしてください。 .keystore Fastlaneは、Rubyライブラリで、モバイル開発の一般的なタスクを自動化するために作成されました。Fastlaneを使用すると、カスタムの「レーン」を構成できます。これらの「レーン」は、通常AndroidStudioを使用して実行するタスクを実行する「アクション」のシーケンスです。Fastlaneを使用できますが、このチュートリアルの目的のために、コアアクションのいくつかしか使用しません。
  • KEYSTORE_KEY_PASSWORD: キーストアファイルに関連付けられたパスワード
  • KEYSTORE_KEY_ALIAS: キーストアのエイリアス
  • KEYSTORE_STORE_PASSWORD: 秘密鍵のパスワード
  • DEVELOPER_PACKAGE_NAME: AndroidアプリのID、例: com.example.app
  • PLAY_CONFIG_JSON: サービスアカウントキーJSONのbase64エンコード

Google Play Service Account Keyの作成

秘密鍵の作成のために、以下の手順に従ってください。 PLAY_CONFIG_JSON Google Cloud Consoleにアクセスしてください。

  1. 新しいプロジェクトを作成するか、既存のプロジェクトを選択してください。 Google Play Android Developer __CAPGO_KEEP_0__を有効にします。
  2. Enable the Google Play Android Developer __CAPGO_KEEP_0__
  3. Enable the Google Play Android Developer API
  4. サービス アカウントを作成する:
    • 「IAM & Admin」 > 「サービス アカウント」に移動する
    • 「サービス アカウントを作成する」をクリックする
    • 名前と説明を付ける
    • 「作成して続行」をクリックする
    • ロールの割り当てをスキップし、「完了」をクリックする
  5. JSON キーを生成する:
    • サービス アカウントのリストで自分のサービス アカウントを探す
    • 三点メニュー > 「キーを管理する」をクリックする
    • 「キーを追加」 > 「新しいキーを作成する」をクリックする
    • JSON形式を選択する
    • 「作成」をクリックする
  6. サービス アカウントにアプリへのアクセス権をPlay Consoleで付与する:
    • Go to Play Console
    • 「ユーザーとパーミッション」を参照する
    • 「新しいユーザーを招待」をクリックする
    • サービス アカウントのメールアドレス(*.iam.gserviceaccount.comで終わる)を入力する
    • 「リリースをプロダクションに」パーミッションを付与する
    • 「ユーザーを招待」をクリックする
  7. JSON キーをbase64に変換する:
    base64 -i path/to/your/service-account-key.json | pbcopy
  8. GitLabにbase64エンコードされた文字列を追加する PLAY_CONFIG_JSON GitLab CI/CD Pipelinesを設定する

Grant the service account access to your app in the Play Console:__CAPGO_KEEP_0__

プロジェクトのルートディレクトリに`.gitlab-ci.yml`ファイルを作成して、CI/CDパイプラインを定義してください。以下にパイプラインの構造例を示します。


image: mingc/android-build-box:latest

stages:
  - build
  - upload_to_capgo
  - build_and_upload_android

build:
  stage: build
  tags:
    - saas-linux-xlarge-amd64
  cache:
    - key:
        files:
          - bun.lockb
      paths:
        - .node_modules/
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - node_modules/
      - dist/
  only:
    - master

upload_to_capgo:
  stage: upload_to_capgo
  tags:
    - saas-linux-xlarge-amd64
  script:
    - npx @capgo/cli@latest bundle upload -a $CAPGO_TOKEN -c dev
  dependencies:
    - build
  when: manual
  only:
    - master

build_and_upload_android:
  tags:
    - saas-linux-xlarge-amd64
  stage:    build_and_upload_android
  cache:
    - key:
        files:
          - android/gradle/wrapper/gradle-wrapper.properties
      paths:
        - ~/.gradle/caches/
  script:
    - npx cap sync android
    - npx cap copy android
    - bundle exec fastlane android beta # We do create a tag for the build to trigger XCode cloud builds
  dependencies:
    - build
  when: manual
  only:
    - master

パイプラインをトリガーする

GitLabリポジトリに新しいタグがPushされたとき、GitLab CI/CDは定義されたパイプラインを自動的にトリガーし、Fastlaneを使用してAndroidアプリをビルドおよびデプロイします。

プロジェクトの構造と要件に応じてパスと依存関係を調整してください。この設定により、GitLab CI/CDでAndroidアプリの自動デプロイが可能になります。

まとめ

mingc/android-build-box Dockerイメージを使用してGitLab CI/CDを設定すると、Androidアプリのビルドプロセスを自動化できます。これにより、開発ワークフローが効率的で信頼性が高くなり、開発者はアプリ開発の核心部分に集中できます。最終的には、高品質のAndroidアプリを効率的に配信することができます。

Automatic Capacitor Android build with GitLabから続けてください。

Automatic __CAPGO_KEEP_0__ Android build with GitLabを使用している場合 Automatic Capacitor Android build with GitLabをCI/CD自動化の計画に接続し、Capacitor CI/CDで製品ワークフローとCapacitor CI/CDを接続してください。 Automatic __CAPGO_KEEP_0__ Android build with GitLabを使用している場合 Automatic Capgo Android build with GitLabをCI/CD自動化の計画に接続し、Capgo CI/CDで製品ワークフローとCapgo CI/CDを接続してください。 Automatic Capgo Android build with GitLabを使用している場合 Capgo Native Builds Capgo Native Buildsの製品ワークフロー Capgo Integrations Capgo Integrationsの製品ワークフロー CI/CD統合 CI/CD統合の実装詳細 GitHub Actions Integration GitHub Actions Integrationの実装詳細

Capacitor アプリのリアルタイム更新

ウェブ層のバグが生じた場合、Capgo を使用して修正を配信し、数日間待つ必要のないアプリストアの承認を待つ必要がなくなる。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路で残る。

スタートする

ブログの最新記事

Capgo を使用すると、プロフェッショナルなモバイルアプリを作成するために必要な最良の洞察を得ることができる。