前提条件
YAMLとGitHub Actionsの構文に馴染んでいる必要があります。 詳細については、以下を参照してください:
Xcode アプリケーションのビルドと署名について理解しておく必要があります。 詳細については、Apple の開発者向けドキュメントを参照してください。
証明書とプロビジョニングプロファイルのシークレットを作成する
署名プロセスには、証明書とプロビジョニングプロファイルの保存、それらのランナーへの転送、ランナーのキーチェーンへのインポート、およびビルドでの使用が含まれます。
ランナーで証明書とプロビジョニングプロファイルを使用するには、GitHub シークレットを使用することを強くお勧めします。 シークレットの作成とワークフローでのそれらの使用について詳しくは、「GitHub Actions でのシークレットの使用」をご覧ください。
次のアイテムのシークレットをリポジトリまたは Organization に作成します。
- 
Apple の署名証明書。 - 
これは p12証明書ファイルです。 Xcode から署名証明書をエクスポートする方法の詳細については、Xcode のドキュメントを参照してください。
- 
証明書をシークレットとして保存する場合は、証明書を Base64 に変換する必要があります。 この例では、シークレットの名前は BUILD_CERTIFICATE_BASE64です。
- 
次のコマンドを使用して、証明書を Base64 に変換し、クリップボードにコピーします。 base64 -i BUILD_CERTIFICATE.p12 | pbcopy
 
- 
- 
Apple 署名証明書のパスワード。 - この例では、シークレットの名前は P12_PASSWORDです。
 
- この例では、シークレットの名前は 
- 
Apple プロビジョニングプロファイル。 - 
Xcode からプロビジョニングプロファイルをエクスポートする方法の詳細については、Xcode のドキュメントを参照してください。 
- 
シークレットとして保存する場合は、プロビジョニングプロファイルを Base64 に変換する必要があります。 この例では、シークレットの名前は BUILD_PROVISION_PROFILE_BASE64です。
- 
次のコマンドを使用して、プロビジョニングプロファイルを Base64 に変換し、クリップボードにコピーします。 base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy
 
- 
- 
キーチェーンのパスワード。 - ランナー上に新しいキーチェーンが作成されるため、新しいキーチェーンのパスワードは任意の新しいランダムな文字列にすることができます。 この例では、シークレットの名前は KEYCHAIN_PASSWORDです。
 
- ランナー上に新しいキーチェーンが作成されるため、新しいキーチェーンのパスワードは任意の新しいランダムな文字列にすることができます。 この例では、シークレットの名前は 
ワークフローにステップを追加する
このワークフロー例には、GitHub シークレットから Apple 証明書とプロビジョニングプロファイルをインポートし、それらをランナーにインストールするステップが含まれています。
name: App build
on: push
jobs:
  build_with_signing:
    runs-on: macos-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v5
      - name: Install the Apple certificate and provisioning profile
        env:
          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
          KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
        run: |
          # create variables
          CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
          PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
          # import certificate and provisioning profile from secrets
          echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
          echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
          # create temporary keychain
          security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
          security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          # import certificate to keychain
          security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          security list-keychain -d user -s $KEYCHAIN_PATH
          # apply provisioning profile
          mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
          cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
      - name: Build app
          # ...
name: App build
on: push
jobs:
  build_with_signing:
    runs-on: macos-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v5
      - name: Install the Apple certificate and provisioning profile
        env:
          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
          KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
        run: |
          # create variables
          CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
          PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
          # import certificate and provisioning profile from secrets
          echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
          echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
          # create temporary keychain
          security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
          security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          # import certificate to keychain
          security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
          security list-keychain -d user -s $KEYCHAIN_PATH
          # apply provisioning profile
          mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
          cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
      - name: Build app
          # ...
メモ
iOS ビルド ターゲットの場合、プロビジョニング プロファイルに拡張子 .mobileprovision を付けてください。 macOS ビルド ターゲットの場合、拡張子は .provisionprofile にします。 ターゲット プラットフォームを反映するよう、上記のワークフロー例を更新してください。
セルフホストランナーに必要なクリーンアップ
GitHub ホストランナーは、ジョブの実行の最後に自動的に破棄される分離された仮想マシンです。 これは、ジョブ中にランナーで使用された証明書とプロビジョニングプロファイルが、ジョブの完了時にランナーとともに破棄されることを意味します。
セルフホステッド ランナーでは、ジョブの実行の最後に $RUNNER_TEMP ディレクトリがクリーンアップされますが、キーチェーンとプロビジョニング プロファイルがランナーにまだ存在している可能性があります。
セルフホストランナーを使用する場合は、ワークフローに最終ステップを追加して、ジョブの最後にこれらの機密ファイルが確実に削除されるようにする必要があります。 以下のワークフローステップは、これを行う方法の例です。
- name: Clean up keychain and provisioning profile
  if: ${{ always() }}
  run: |
    security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
    rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision