0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub ActionsでiOSアプリを自動ビルド&App Storeへ自動アップロードする完全ガイド

Last updated at Posted at 2025-11-07

はじめに

iOS アプリを App Store にリリースする際、手動でのビルドと署名は複雑で時間がかかります。GitHub Actions を使用することで、このプロセスを完全に自動化できます。

本記事では、以下の内容をカバーします:

  • Apple 証明書とプロビジョニングプロファイルの管理
  • GitHub Actions ワークフローの構築
  • IPA ファイルの自動生成
  • App Store Connect への自動アップロード

注意: 本記事の情報は2025年11月時点のものです。AppleやGitHubの仕様変更により、手順や設定が変更される可能性があります。

前提条件

  • Flutter プロジェクト(またはネイティブ iOS プロジェクト)
  • Apple Developer Account(有料)
  • App Store Connect アカウント
  • GitHub リポジトリ

ステップ 1: 必要な認証情報の準備

このステップでは、GitHub Actions で iOS アプリをビルド・署名するために必要なすべての認証情報を準備します。

1-0. CSR(証明書署名要求)ファイルの作成

まず、Apple に提出するための CSR ファイルを作成します。

  1. キーチェーンアクセス アプリケーションを開く
  2. メニューから キーチェーンアクセス > 証明書アシスタント > 認証局に証明書を要求... を選択
  3. 以下を入力:
    • ユーザーメールアドレス: Apple ID のメールアドレス
    • 通称: 任意の名前(例:My iOS App Store Certificate
    • CA メールアドレス: 空白のままでOK
    • リクエストは...: ディスクに保存 を選択
  4. 続ける をクリック
  5. CSR ファイルを保存(CertificateSigningRequest.certSigningRequest

1-1. Bundle ID(Identifier)の作成

App Store で配布するアプリのBundle IDを作成します。

  1. Apple Developer Portal にログイン
  2. Certificates, Identifiers & Profiles > Identifiers をクリック
  3. + ボタンをクリック
  4. App IDs を選択 → Continue をクリック
  5. App を選択 → Continue をクリック
  6. 以下を入力:
    • Description: アプリの説明(例:MyApp
    • Bundle ID: アプリケーションの一意識別子(例:com.example.myapp
      • 通常は Explicit を選択
      • ワイルドカード(*)は使用しない
  7. Capabilities セクションで必要な機能を確認
    • Push Notifications、HomeKit、Health Kit など、アプリが使用する機能をチェック
  8. Register をクリック

✅ Bundle ID が作成されました。このIDは後のステップで使用します。

1-2. Apple Distribution 証明書の作成・取得

App Store 配布用の証明書を作成します:

  1. Apple Developer Portal にログイン
  2. Certificates, Identifiers & Profiles > Certificates をクリック
  3. + ボタンをクリック
  4. Apple Distribution を選択して Continue をクリック
  5. CSR ファイルをアップロード
  6. 証明書がダウンロードできるようになったら、ダウンロード(distribution.cer
  7. ダウンロードした .cer ファイルをダブルクリック → キーチェーンに自動インポート

1-3. 証明書を P12 形式に変換

GitHub Actions で使用するために、キーチェーンから P12 形式で証明書をエクスポートします。

キーチェーンアクセスでの手順:

  1. キーチェーンアクセス アプリケーションを開く
  2. ログイン キーチェーンを選択
  3. 証明書 カテゴリを選択
  4. 先ほどインストールした「Apple Distribution」で始まる証明書を右クリック
  5. 「秘密鍵...」を書き出す をクリック
  6. ファイル名を入力(例:distribution-certificate
  7. ファイル形式は Personal Information Exchange (.p12) を選択
  8. 保存場所を選択(例:~/Desktop
  9. 保存 をクリック
  10. P12 ファイル用の任意のパスワードを入力 → OK

⚠️ 重要: このパスワードは後で GitHub Secrets に登録する際に必要になるため、覚えておいてください。

  1. macOS のログインパスワードを入力 → 許可

これで distribution-certificate.p12 ファイルが Desktop に保存されました。

1-4. P12 ファイルを Base64 エンコード

GitHub Secrets で安全に管理するために、P12 ファイルを Base64 でエンコードします:

# App Store 用証明書をエンコード
base64 -i ~/Desktop/distribution-certificate.p12 | pbcopy

# コピーしたテキストを GitHub Secrets に登録(後述)
# 一旦メモ帳とかに貼り付けておく

1-5. App Store 用プロビジョニングプロファイルの作成・取得

アプリが特定の Bundle ID で App Store から配布されることを許可するプロビジョニングプロファイルを作成します。

  1. Apple Developer Portal にログイン
  2. Certificates, Identifiers & Profiles > Profiles をクリック
  3. + ボタンをクリック
  4. App Store Connect を選択 → Continue
  5. ステップ 1-1 で作成した Bundle ID を選択 → Continue
  6. App Store Distribution 証明書を選択 → Continue
  7. プロファイル名を入力(例:MyApp App Store) → Generate
  8. ダウンロード(MyApp_AppStore.mobileprovision

1-6. プロビジョニングプロファイルを Base64 エンコード

# App Store 用プロファイルをエンコード
base64 -i ~/Downloads/MyApp_AppStore.mobileprovision | pbcopy

# コピーしたテキストを GitHub Secrets に登録(後述)
# 一旦メモ帳とかに貼り付けておく

1-7. Apple Team ID の確認

  1. Apple Developer Portal にログイン
  2. Membership details をクリック
  3. Team ID を確認(例:ABC123XYZ

1-8. Apple ID 用アプリケーション固有パスワードの取得

App Store Connect へのアップロード時に使用するアプリケーション固有パスワードを取得します:

  1. Apple ID アカウント にログイン
  2. サインインとセキュリティ セクションをクリック
  3. アプリケー用パスワード > + をクリック
  4. アプリケーション名を入力(例:GitHub Actions
  5. 生成されたパスワードをコピー(16文字のハイフン区切り形式)

⚠️ 重要: このパスワードは一度だけ表示されるため、安全に保管してください。

ステップ 2: GitHub Secrets の設定

GitHub リポジトリに以下の Secrets を設定します:

Secret 名 説明
APPLE_CERTIFICATE_BASE64 App Store 用 P12 証明書(Base64)
APPLE_CERTIFICATE_PASSWORD App Store 用 P12 証明書のパスワード
APPLE_PROVISIONING_PROFILE_BASE64 App Store 用プロビジョニングプロファイル(Base64)
APPLE_TEAM_ID Apple Team ID(例:ABC123XYZ
APPLE_ID App Store Connect Apple ID
APPLE_APP_SPECIFIC_PASSWORD Apple ID 用アプリケーション固有パスワード

Secrets の設定方法:

  1. GitHub リポジトリの Settings > Secrets and variables > Actions をクリック
  2. New repository secret をクリック
  3. Name と Secret を入力して Add secret をクリック

📝 Secrets 登録例

APPLE_CERTIFICATE_BASE64: MIIFkDCCBBigAwIBAgIQZ7CrtWfQLu...
APPLE_CERTIFICATE_PASSWORD: MySecurePassword123
APPLE_PROVISIONING_PROFILE_BASE64: H4sIAAAAAAAC/1WSTQvCMBCF...
APPLE_TEAM_ID: ABC123XYZ
APPLE_ID: developer@example.com
APPLE_APP_SPECIFIC_PASSWORD: abcd-efgh-ijkl-mnop

ステップ 3: ワークフローの構築

このステップでは、GitHub Actions ワークフローの各ステップを詳しく解説します。完全なワークフロー例はステップ 4 を参照してください。

3-1. ワークフロー全体の構造

name: iOS App Store Release

on:
  push:
    branches:
      - main
  workflow_dispatch:

permissions:
  contents: read
  id-token: write

env:
  FLUTTER_VERSION: "3.29.3"

jobs:
  build_ios:
    # ... ジョブ 1 - ビルドフェーズ
  upload_to_app_store:
    # ... ジョブ 2 - アップロードフェーズ

説明:

  • name: ワークフローの名前(GitHub Actions で表示されます)
  • on: ワークフロー実行のトリガー
    • push branches: [main]: main ブランチへのプッシュで自動実行
    • workflow_dispatch: GitHub UI から手動で実行可能
  • permissions: 必要な権限を指定
  • env: すべてのジョブで使用する環境変数(Flutter バージョン)
  • jobs: 実行するジョブを定義

3-2. ジョブ 1: build_ios の構成

ジョブの基本設定

build_ios:
  runs-on: macos-latest
  steps:
    # ... ステップ

説明:

  • runs-on: macos-latest: macOS ランナーを使用(iOS ビルドに必須)

セットアップステップ

- name: Checkout code
  uses: actions/checkout@v4

- name: Set up Flutter SDK
  uses: subosito/flutter-action@v2
  with:
    channel: 'stable'
    flutter-version: ${{ env.FLUTTER_VERSION }}

- name: Cache Flutter dependencies
  uses: actions/cache@v4
  with:
    path: ${{ runner.tool_cache }}/flutter
    key: ${{ runner.os }}-flutter-${{ env.FLUTTER_VERSION }}-${{ hashFiles('**/pubspec.lock') }}
    restore-keys: |
      ${{ runner.os }}-flutter-${{ env.FLUTTER_VERSION }}-

- name: Install Flutter dependencies
  run: flutter pub get

説明:

  • Checkout code: リポジトリのコードを GitHub Actions ランナーにダウンロード
  • Set up Flutter SDK: 指定したバージョンの Flutter をインストール
  • Cache Flutter dependencies: Flutter のキャッシュを使用して、ビルド時間を短縮
    • 同じ pubspec.lock であれば、キャッシュから復元
  • Install Flutter dependencies: flutter pub get で依存パッケージをインストール

ビルド番号の生成

- name: Generate build number
  id: build_version
  run: |
    BUILD_NUMBER=$(date +'%s')
    echo "build_number=$BUILD_NUMBER" >> $GITHUB_OUTPUT

説明:

  • 現在の Unix タイムスタンプをビルド番号として生成
  • id: build_version により、後のステップから ${{ steps.build_version.outputs.build_number }} でアクセス可能
  • これにより、ビルドのたびに一意の番号が割り当てられます

証明書とプロビジョニングプロファイルのインストール

- name: Install Apple Distribution Certificate and Provisioning Profile
  env:
    BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
    P12_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
    PROVISIONING_PROFILE_BASE64: ${{ secrets.APPLE_PROVISIONING_PROFILE_BASE64 }}
  run: |
    KEYCHAIN_PATH="${{ runner.temp }}/app-signing.keychain-db"
    
    # キーチェーンの作成
    security create-keychain -p "prod_keychain_password" "$KEYCHAIN_PATH"
    security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
    security unlock-keychain -p "prod_keychain_password" "$KEYCHAIN_PATH"

    # 証明書のインポート
    echo "$BUILD_CERTIFICATE_BASE64" | base64 --decode > certificate.p12
    security import certificate.p12 -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH"
    security list-keychain -d user -s "$KEYCHAIN_PATH"

    # プロビジョニングプロファイルのインストール
    echo "$PROVISIONING_PROFILE_BASE64" | base64 --decode > profile.mobileprovision
    mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
    cp profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/

説明:

  • キーチェーンの作成: GitHub Actions ランナー内に一時的なキーチェーンを作成
    • ホストマシンのキーチェーンを汚さない
    • 21600 は 6 時間のロック解除タイムアウト
  • 証明書のインポート: Base64 エンコードされた証明書をデコードして、キーチェーンにインポート
  • プロビジョニングプロファイルのインストール: macOS の標準位置にプロファイルをコピー

ExportOptions.plist の作成

- name: Create ExportOptions.plist
  run: |
    PROFILE_UUID=$(security cms -D -i ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision | plutil -extract UUID xml1 - -o - | sed -n 's/.*<string>\(.*\)<\/string>.*/\1/p')
    
    cat > ${{ runner.temp }}/ExportOptions.plist << EOF
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>method</key>
        <string>app-store</string>
        <key>teamID</key>
        <string>${{ secrets.APPLE_TEAM_ID }}</string>
        <key>signingStyle</key>
        <string>manual</string>
        <key>signingCertificate</key>
        <string>Apple Distribution</string>
        <key>provisioningProfiles</key>
        <dict>
            <key>com.example.myapp</key>
            <string>$PROFILE_UUID</string>
        </dict>
        <key>uploadBitcode</key>
        <false/>
        <key>uploadSymbols</key>
        <true/>
        <key>compileBitcode</key>
        <false/>
    </dict>
    </plist>
    EOF

説明:

  • ExportOptions.plist: Xcode のエクスポート設定ファイル
    • flutter build ipa でこのファイルを指定することで、適切な署名と設定でビルド
    • method: app-store: App Store 配布用に指定
    • provisioningProfiles: Bundle ID とプロビジョニングプロファイル UUID のマッピング
    • uploadSymbols: true: クラッシュレポート用にシンボルをアップロード

Xcode プロジェクト設定の更新

- name: Configure distribution signing for App Store
  run: |
    # プロビジョニングプロファイルのUUIDを取得
    PROFILE_UUID=$(security cms -D -i ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision | plutil -extract UUID xml1 - -o - | sed -n 's/.*<string>\(.*\)<\/string>.*/\1/p')
    
    # プロジェクト設定を手動署名に変更
    sed -i '' 's/CODE_SIGN_STYLE = Automatic;/CODE_SIGN_STYLE = Manual;/g' ios/Runner.xcodeproj/project.pbxproj
    sed -i '' "s/DEVELOPMENT_TEAM = .*/DEVELOPMENT_TEAM = ${{ secrets.APPLE_TEAM_ID }};/g" ios/Runner.xcodeproj/project.pbxproj
    sed -i '' 's/"iPhone Developer"/"Apple Distribution"/g' ios/Runner.xcodeproj/project.pbxproj

    # プロビジョニングプロファイル設定を追加
    sed -i '' "/DEVELOPMENT_TEAM = ${{ secrets.APPLE_TEAM_ID }};/a\\
    \"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]\" = \"$PROFILE_UUID\";\\
    " ios/Runner.xcodeproj/project.pbxproj

説明:

  • CODE_SIGN_STYLE: 自動署名から手動署名に変更
  • DEVELOPMENT_TEAM: Team ID を設定
  • PROVISIONING_PROFILE_SPECIFIER: プロビジョニングプロファイル UUID を指定
    • これにより、ビルド時に正しいプロファイルが使用されます

IPA ファイルのビルド

- name: Build Flutter IPA (for App Store)
  run: |
    flutter build ipa --release \
      --build-number=${{ steps.build_version.outputs.build_number }} \
      --export-options-plist=${{ runner.temp }}/ExportOptions.plist

説明:

  • flutter build ipa: iOS アプリを IPA 形式でビルド
  • --release: リリースビルド(最適化)
  • --build-number: ビルド番号の生成 で生成したビルド番号を指定
  • --export-options-plist: ExportOptions.plist の作成 で作成した ExportOptions.plist を使用

アーティファクトとしての保存

- name: Upload iOS IPA artifact
  uses: actions/upload-artifact@v4
  with:
    name: ios-ipa-build
    path: build/**/*.ipa

説明:

  • ビルドした IPA ファイルを GitHub Actions のアーティファクトとして保存

クリーンアップ

- name: Clean up distribution keychain and provisioning profile
  if: always()
  run: |
    KEYCHAIN_PATH="${{ runner.temp }}/app-signing.keychain-db"
    security delete-keychain "$KEYCHAIN_PATH" || true
    rm -f ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision || true

説明:

  • if: always(): 前のステップが成功・失敗に関わらず実行
  • 一時的なキーチェーンとプロビジョニングプロファイルを削除
  • || true: エラーでも処理を続行

3-3. ジョブ 2: upload_to_app_store の構成

ジョブの基本設定

upload_to_app_store:
  runs-on: macos-latest
  needs: build_ios
  if: success()
  steps:
    # ... ステップ

説明:

  • needs: build_ios: build_ios ジョブが完了するのを待つ(依存関係)
  • if: success(): build_ios が成功した場合のみこのジョブを実行
  • ビルド失敗時は自動的にアップロードがスキップされます

アーティファクトのダウンロード

- name: Download iOS IPA artifact
  uses: actions/download-artifact@v4
  with:
    name: ios-ipa-build

説明:

  • build_ios で保存したアーティファクト(IPA ファイル)をダウンロード
  • 別のジョブから前のジョブの成果物を利用可能

App Store Connect へのアップロード

- name: Upload to App Store Connect
  env:
    APPLE_ID: ${{ secrets.APPLE_ID }}
    APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
  run: |
    # IPAファイルを動的に検索
    IPA_FILE=$(find . -name "*.ipa" -type f | head -1)
    if [ -z "$IPA_FILE" ]; then
      echo "Error: No IPA file found"
      exit 1
    fi
    echo "Found IPA file: $IPA_FILE"
    
    # App Store Connect へアップロード
    xcrun altool --upload-app \
      -f "$IPA_FILE" \
      -u "$APPLE_ID" \
      -p "$APPLE_APP_SPECIFIC_PASSWORD" \
      --type ios
    
    echo "=== Upload completed ==="

説明:

  • IPA ファイルの位置を特定(ダウンロード後の位置)
  • xcrun altool: Apple 公式ツールで App Store Connect にアップロード
  • --upload-app: アプリをアップロード
  • パスワードはアプリケーション固有パスワードを使用

ステップ 4: 完全なワークフロー例

ここでは、実際に使用できる完全なワークフロー設定を提供します。

ワークフロー全体の構成

このワークフローは 2 つのジョブで構成されています:

  1. build_ios: iOS アプリをビルドして IPA ファイルを生成
  2. upload_to_app_store: 生成した IPA ファイルを App Store Connect にアップロード
name: iOS App Store Release

on:
  push:
    branches:
      - main
  workflow_dispatch:

permissions:
  contents: read

env:
  FLUTTER_VERSION: "3.29.3"

jobs:
  build_ios:
    runs-on: macos-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Flutter SDK
        uses: subosito/flutter-action@v2
        with:
          channel: 'stable'
          flutter-version: ${{ env.FLUTTER_VERSION }}

      - name: Cache Flutter dependencies
        uses: actions/cache@v4
        with:
          path: ${{ runner.tool_cache }}/flutter
          key: ${{ runner.os }}-flutter-${{ env.FLUTTER_VERSION }}-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: |
            ${{ runner.os }}-flutter-${{ env.FLUTTER_VERSION }}-

      - name: Install Flutter dependencies
        run: flutter pub get

      - name: Generate build number
        id: build_version
        run: |
          BUILD_NUMBER=$(date +'%s')
          echo "build_number=$BUILD_NUMBER" >> $GITHUB_OUTPUT

      - name: Install Apple Distribution Certificate and Provisioning Profile
        env:
          BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
          P12_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
          PROVISIONING_PROFILE_BASE64: ${{ secrets.APPLE_PROVISIONING_PROFILE_BASE64 }}
        run: |
          KEYCHAIN_PATH="${{ runner.temp }}/app-signing.keychain-db"
          
          security create-keychain -p "prod_keychain_password" "$KEYCHAIN_PATH"
          security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
          security unlock-keychain -p "prod_keychain_password" "$KEYCHAIN_PATH"

          echo "$BUILD_CERTIFICATE_BASE64" | base64 --decode > certificate.p12
          security import certificate.p12 -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH"
          security list-keychain -d user -s "$KEYCHAIN_PATH"

          echo "$PROVISIONING_PROFILE_BASE64" | base64 --decode > profile.mobileprovision
          mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
          cp profile.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/

      - name: Create ExportOptions.plist
        run: |
          PROFILE_UUID=$(security cms -D -i ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision | plutil -extract UUID xml1 - -o - | sed -n 's/.*<string>\(.*\)<\/string>.*/\1/p')
          
          cat > ${{ runner.temp }}/ExportOptions.plist << EOF
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
          <plist version="1.0">
          <dict>
              <key>method</key>
              <string>app-store</string>
              <key>teamID</key>
              <string>${{ secrets.APPLE_TEAM_ID }}</string>
              <key>signingStyle</key>
              <string>manual</string>
              <key>signingCertificate</key>
              <string>Apple Distribution</string>
              <key>provisioningProfiles</key>
              <dict>
                  <key>com.example.myapp</key>
                  <string>$PROFILE_UUID</string>
              </dict>
              <key>uploadBitcode</key>
              <false/>
              <key>uploadSymbols</key>
              <true/>
              <key>compileBitcode</key>
              <false/>
          </dict>
          </plist>
          EOF

      - name: Configure distribution signing for App Store
        run: |
          PROFILE_UUID=$(security cms -D -i ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision | plutil -extract UUID xml1 - -o - | sed -n 's/.*<string>\(.*\)<\/string>.*/\1/p')
          
          sed -i '' 's/CODE_SIGN_STYLE = Automatic;/CODE_SIGN_STYLE = Manual;/g' ios/Runner.xcodeproj/project.pbxproj
          sed -i '' "s/DEVELOPMENT_TEAM = .*/DEVELOPMENT_TEAM = ${{ secrets.APPLE_TEAM_ID }};/g" ios/Runner.xcodeproj/project.pbxproj
          sed -i '' 's/"iPhone Developer"/"Apple Distribution"/g' ios/Runner.xcodeproj/project.pbxproj

          sed -i '' "/DEVELOPMENT_TEAM = ${{ secrets.APPLE_TEAM_ID }};/a\\
          \"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]\" = \"$PROFILE_UUID\";\\
          " ios/Runner.xcodeproj/project.pbxproj

      - name: Build Flutter IPA (for App Store)
        run: |
          flutter build ipa --release \
            --build-number=${{ steps.build_version.outputs.build_number }} \
            --export-options-plist=${{ runner.temp }}/ExportOptions.plist

      - name: Upload iOS IPA artifact
        uses: actions/upload-artifact@v4
        with:
          name: ios-ipa-build
          path: build/**/*.ipa

      - name: Clean up distribution keychain and provisioning profile
        if: always()
        run: |
          KEYCHAIN_PATH="${{ runner.temp }}/app-signing.keychain-db"
          security delete-keychain "$KEYCHAIN_PATH" || true
          rm -f ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision || true

  upload_to_app_store:
    runs-on: macos-latest
    needs: build_ios
    if: success()
    steps:
      - name: Download iOS IPA artifact
        uses: actions/download-artifact@v4
        with:
          name: ios-ipa-build

      - name: Upload to App Store Connect
        env:
          APPLE_ID: ${{ secrets.APPLE_ID }}
          APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
        run: |
          # IPA ファイルを動的に検索
          IPA_FILE=$(find . -name "*.ipa" -type f | head -1)
          if [ -z "$IPA_FILE" ]; then
            echo "Error: No IPA file found"
            exit 1
          fi
          echo "Found IPA file: $IPA_FILE"
          
          # App Store Connect へアップロード
          xcrun altool --upload-app \
            -f "$IPA_FILE" \
            -u "$APPLE_ID" \
            -p "$APPLE_APP_SPECIFIC_PASSWORD" \
            --type ios
          
          echo "=== Upload completed ==="

ステップ 5: 証明書の有効期限管理

証明書は 1 年間有効であり、期限切れ前に更新が必要です。スムーズな運用のため、以下のプロセスを推奨します。

証明書の有効期限確認

  1. Apple Developer Portal にログイン
  2. Certificates, Identifiers & Profiles > Certificates をクリック
  3. 各証明書の Expiration Date を確認

更新タイミングの管理

  • 3ヶ月前:カレンダーにリマインダーを設定
  • 1ヶ月前:チームに通知
  • 有効期限前:新しい証明書を準備

証明書の更新手順

古い証明書が期限切れになる前に、以下の手順で新しい証明書を準備します:

  1. 新しい証明書を作成

    # ステップ 1-0 から 1-2 を再度実行
    
  2. P12 ファイルを Base64 エンコード

    base64 -i ~/Desktop/distribution-certificate.p12 | pbcopy
    
  3. GitHub Secrets を更新

    • APPLE_CERTIFICATE_BASE64 の値を新しいものに置き換え
    • APPLE_CERTIFICATE_PASSWORD が変わった場合は更新
  4. 動作確認

    • テストビルドを実行して成功を確認

運用のベストプラクティス

  • Secrets の定期監査:月 1 回、登録されている Secrets を確認
  • 証明書の削除:期限切れ後、Apple Developer Portal から削除
  • ドキュメント化:証明書の更新日時をプロジェクトの README に記録

注意事項

⚠️ セキュリティ

  • Base64 エンコードされた証明書と password は GitHub Secrets で安全に管理してください
  • 定期的に証明書をローテーションしてください
  • 本番ビルドには常にテストを実行してください

⚠️ コスト

  • Apple Developer Program の年間費用($99)
  • GitHub Actions の使用時間

⚠️ 確認事項

  • App Store Connect で最終確認を行う
  • TestFlight でのベータテストを実施する
  • リリースノートを準備する

まとめ

GitHub Actions を使用することで、iOS アプリの自動ビルドと App Store へのアップロードが可能になります。本記事のワークフローを参考に、プロジェクトに合わせてカスタマイズしてください。

この記事が、iOS アプリ開発の助けになれば幸いです。
質問やフィードバックがあれば、コメントでお聞かせください!

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?