{"meta":{"title":"Xcode 開発用の macOS ランナーに Apple 証明書をインストールする","intro":"GitHub Actions ランナーに Apple コード署名証明書をインストールして、継続的インテグレーション (CI) ワークフロー内で Xcode アプリに署名する方法について説明します。","product":"GitHub Actions","breadcrumbs":[{"href":"/ja/actions","title":"GitHub Actions"},{"href":"/ja/actions/how-tos","title":"方法"},{"href":"/ja/actions/how-tos/deploy","title":"デプロイ"},{"href":"/ja/actions/how-tos/deploy/deploy-to-third-party-platforms","title":"サード パーティのプラットフォームへのデプロイ"},{"href":"/ja/actions/how-tos/deploy/deploy-to-third-party-platforms/sign-xcode-applications","title":"Xcode アプリケーションに署名する"}],"documentType":"article"},"body":"# Xcode 開発用の macOS ランナーに Apple 証明書をインストールする\n\nGitHub Actions ランナーに Apple コード署名証明書をインストールして、継続的インテグレーション (CI) ワークフロー内で Xcode アプリに署名する方法について説明します。\n\n## 前提条件\n\nYAML と GitHub Actionsの構文について理解している必要があります。 詳細については、以下を参照してください:\n\n* [ワークフローの書き込み](/ja/actions/how-tos/write-workflows)\n* [GitHub Actions　のワークフロー構文](/ja/actions/reference/workflows-and-actions/workflow-syntax)\n\nXcode アプリケーションのビルドと署名について理解しておく必要があります。 詳細については、[Apple の開発者向けドキュメント](https://developer.apple.com/documentation/)を参照してください。\n\n## 証明書とプロビジョニングプロファイルのシークレットを作成する\n\n署名プロセスには、証明書とプロビジョニングプロファイルの保存、それらのランナーへの転送、ランナーのキーチェーンへのインポート、およびビルドでの使用が含まれます。\n\nランナーで証明書とプロビジョニング プロファイルを使用するには、 GitHub シークレットを使用することを強くお勧めします。 シークレットの作成とワークフローでのそれらの使用について詳しくは、「[GitHub Actions でのシークレットの使用](/ja/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets)」をご覧ください。\n\n次のアイテムのシークレットをリポジトリまたは Organization に作成します。\n\n* Apple の署名証明書。\n\n  * これは `p12` 証明書ファイルです。 Xcode から署名証明書をエクスポートする方法の詳細については、[Xcode のドキュメント](https://help.apple.com/xcode/mac/current/#/dev154b28f09)を参照してください。\n\n  * 証明書をシークレットとして保存する場合は、証明書を Base64 に変換する必要があります。 この例では、シークレットの名前は `BUILD_CERTIFICATE_BASE64` です。\n\n  * 次のコマンドを使用して、証明書を Base64 に変換し、クリップボードにコピーします。\n\n    ```shell\n    base64 -i BUILD_CERTIFICATE.p12 | pbcopy\n    ```\n\n* Apple 署名証明書のパスワード。\n  * この例では、シークレットの名前は `P12_PASSWORD` です。\n\n* あなたのAppleプロビジョニングプロファイル。\n\n  * Xcode からプロビジョニングプロファイルをエクスポートする方法の詳細については、[Xcode のドキュメント](https://help.apple.com/xcode/mac/current/#/deva899b4fe5)を参照してください。\n\n  * シークレットとして保存する場合は、プロビジョニングプロファイルを Base64 に変換する必要があります。 この例では、シークレットの名前は `BUILD_PROVISION_PROFILE_BASE64` です。\n\n  * 次のコマンドを使用して、プロビジョニングプロファイルを Base64 に変換し、クリップボードにコピーします。\n\n    ```shell\n    base64 -i PROVISIONING_PROFILE.mobileprovision | pbcopy\n    ```\n\n* キーチェーンのパスワード。\n\n  * ランナー上に新しいキーチェーンが作成されるため、新しいキーチェーンのパスワードは任意の新しいランダムな文字列にすることができます。 この例では、シークレットの名前は `KEYCHAIN_PASSWORD` です。\n\n## ワークフローにステップを追加する\n\nこのワークフロー例には、 GitHub シークレットから Apple 証明書とプロビジョニング プロファイルをインポートし、ランナーにインストールする手順が含まれています。\n\n```yaml copy\nname: App build\non: push\n\njobs:\n  build_with_signing:\n    runs-on: macos-latest\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n      - name: Install the Apple certificate and provisioning profile\n        env:\n          BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}\n          P12_PASSWORD: ${{ secrets.P12_PASSWORD }}\n          BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}\n          KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}\n        run: |\n          # create variables\n          CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12\n          PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision\n          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db\n\n          # import certificate and provisioning profile from secrets\n          echo -n \"$BUILD_CERTIFICATE_BASE64\" | base64 --decode -o $CERTIFICATE_PATH\n          echo -n \"$BUILD_PROVISION_PROFILE_BASE64\" | base64 --decode -o $PP_PATH\n\n          # create temporary keychain\n          security create-keychain -p \"$KEYCHAIN_PASSWORD\" $KEYCHAIN_PATH\n          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH\n          security unlock-keychain -p \"$KEYCHAIN_PASSWORD\" $KEYCHAIN_PATH\n\n          # import certificate to keychain\n          security import $CERTIFICATE_PATH -P \"$P12_PASSWORD\" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH\n          security set-key-partition-list -S apple-tool:,apple: -k \"$KEYCHAIN_PASSWORD\" $KEYCHAIN_PATH\n          security list-keychain -d user -s $KEYCHAIN_PATH\n\n          # apply provisioning profile\n          mkdir -p ~/Library/MobileDevice/Provisioning\\ Profiles\n          cp $PP_PATH ~/Library/MobileDevice/Provisioning\\ Profiles\n      - name: Build app\n          # ...\n```\n\n> \\[!NOTE]\n> iOS ビルド ターゲットの場合、プロビジョニング プロファイルに拡張子 `.mobileprovision` を付けてください。 macOS ビルド ターゲットの場合、拡張子は `.provisionprofile` にします。 ターゲット プラットフォームを反映するよう、上記のワークフロー例を更新してください。\n\n## セルフホストランナーに必要なクリーンアップ\n\nGitHub ホスト型ランナーは、ジョブの実行終了時に自動的に破棄される、独立した仮想マシンです。 これは、ジョブ中にランナーで使用された証明書とプロビジョニングプロファイルが、ジョブの完了時にランナーとともに破棄されることを意味します。\n\nセルフホステッド ランナーでは、ジョブの実行の最後に `$RUNNER_TEMP` ディレクトリがクリーンアップされますが、キーチェーンとプロビジョニング プロファイルがランナーにまだ存在している可能性があります。\n\nセルフホストランナーを使用する場合は、ワークフローに最終ステップを追加して、ジョブの最後にこれらの機密ファイルが確実に削除されるようにする必要があります。 以下のワークフローステップは、これを行う方法の例です。\n\n```yaml\n- name: Clean up keychain and provisioning profile\n  if: ${{ always() }}\n  run: |\n    security delete-keychain $RUNNER_TEMP/app-signing.keychain-db\n    rm ~/Library/MobileDevice/Provisioning\\ Profiles/build_pp.mobileprovision\n```"}